本作品由安信可社區用戶
bzhou830制作
01介紹
前面寫過兩遍關于 USB 協議基礎的帖子,如果對 USB 協議不了解,可以去看看下列的基礎內容。
【探索 USB】01. USB 協議基礎 - 小安派 S1&M61 教程合集 - 物聯網開發者社區-安信可論壇 - Powered by Discuz! (ai-thinker.com)
【探索 USB】02. 設備的連接和枚舉 - 小安派 S1&M61 教程合集 - 物聯網開發者社區-安信可論壇 - Powered by Discuz! (ai-thinker.com)
這篇開始使用 M62 板子來實現 USB 的設備開發,首先從最簡單的 USB HID 鍵盤開始。固件的 SDK 使用的是 CherryUSB 開源 USB 固件。CherryUSB 是一個小而美的、可移植性高的、用于嵌入式系統的 USB 主從協議棧。設備端的協議執行流程如下圖:
02描述符
CherryUSB 實現好了一套 USB 的設備協議,只需要使用的 CheryyUSB 提供的接口調用就可以實現想要的 USB 設備了。首先應該為 USB 設備填描述符。描述符的種類很多,先得理解他們的含義。
設備 (Device) :就是一個實實在在的 USB 設備,比如 USB 鼠標,U 盤。
配置(Configuration):一個 USB 設備可以有多種配置。比如 4G 上網卡就有 2 種配置:U 盤、上網卡。第 1 次把 4G 上網卡插入電腦時,它是一個 U 盤,可以安裝里面的程序。裝好程序后,把它再次插入電腦,它就是一個上網卡。驅動程序可以選擇讓它工作于哪種配置,同一時間只能有一種配置有效。大多數的 USB 設備只有一種配置。
接口 (Interface) :每個配置下可以有多個接口,這個接口不是硬件上的接口,可以把這個接口理解為功能,一個接口就代表該設備當前支持的一種功能。
端點 (Endpoint) :每個接口可以有多個端點。USB 主機和設備就是通過端點進行數據交互的。每個端點地址對應一個方向,例如端點 2-IN,端點 2-OUT,這兩個含義完全不同。
對于 HID 設備來說還有 HID 描述符和 HID 報告描述符。
HID 描述符:描述設備數據包的固定代碼字節數組,包括設備支持多少個包,包有多大,以及包中每個字節和比特的含義。
HID 報告描述符:HID 報告描述符是一個硬編碼的字節數組,用于描述設備的數據包。這包括:設備支持多少數據包,數據包有多大,以及數據包中每個字節和位的用途。
有關 USB 鍵盤鼠標的數據報格式可以看如下帖子:
USB-HID 鍵鼠通訊數據格式 - 技術干貨 - 物聯網開發者社區-安信可論壇 - Powered by Discuz! (ai-thinker.com)
下面來一一看看它們都怎么寫的。
>>>>設備描述符
cherryUSB 中封裝了宏來定義設備描述符:
詳細說說字段表示的意思:
>>>>配置描述符
cherryUSB 中封裝了宏來定義配置描述符:
>>>>接口描述符
接口描述符是需要自己寫成數組的:
>>>>端點描述符
>>>>HID 描述符
>>>>HID 報告描述符
03設備的實現
在設備連接時設備端就需要向主機上報各種描述符,主機這時候就會識別到設備然后給 USB 設備分配端口(USB 協議基礎中的設備枚舉)。
連接完成后設備就可以通過 usbd_ep_start_write 函數(cherryUSB 提供的 API)向主機上報數據了。
在主函數中調用它, 如下就實現了一個不斷向主機發送字母 a 的 usb 鍵盤設備。
為了能和真實的鍵盤對應上,這里特意使用矩陣鍵盤接上板子來讀取矩陣鍵盤的鍵值,將對應的鍵值轉換成對應的 hid 報告發送給電腦端。
硬件的接線順序如下:
在矩陣鍵盤掃描的 task 里面循環掃描矩陣鍵盤,如果按鍵有按下直接轉換成對應的 hid 鍵值:
這些鍵值的定義可以在這里找到:
在 usb 鍵盤的 task 里面則取接受消息,并把消息發松給 pc 端。
04USB描述符的查看
Windows 下可以使用 usbview 來查看 usb 描述符信息,這有利于我們調試分析使用。
05USB協議調試軟件
usb 協議相對還是比較復雜的,任何的描述符寫錯了都可能導致設備沒辦法正常的工作。這時候好用的調試軟件就非常的重要了。
USBlyzer, WireShark 都是可以用來抓 USB 數據包進行分析的。
審核編輯 黃宇
-
usb
+關注
關注
60文章
7903瀏覽量
264051 -
協議
+關注
關注
2文章
598瀏覽量
39185 -
開發板
+關注
關注
25文章
4959瀏覽量
97214
發布評論請先 登錄
相關推薦
評論