一
- 《HID 1.11》 主要描述 report desc 的一些規則,以及如何進行通訊
- 《HUT 1.22》 則主要說明一些通用的 HID 設備類型具備的 Usage page, Usage
- 關於 HID 的文檔請從該網頁獲取:https://www.usb.org/hid
二
- 關於 HID 的庫可以使用 libusb 直接操作 USB HID 節點,也可通過 libhidapi 來操作,libhidapi 集成度更高,而且最近也開始重新維護了。都由 libusb 維護:
- libusb 倉庫地址:https://github.com/libusb/libusb
- libhidapi 倉庫地址:https://github.com/libusb/hidapi
- 如果你比較糾結到底是選擇 libusb 好還是 libhidapi 好,則可以看一下這個帖子:https://stackoverflow.com/questions/55272593/hidapi-vs-libusb-for-linux
三
- HID 規范文檔中設備描述的 input 和 output 都是站在 Host 端角度描述的
- HID 中的 report desc 主要是為了向 Host 描述設備具備何種功能,以及如何使用設備的。而 HID 從協議上並沒有嚴格的綁定傳輸過程中的數據與 report desc 的對應關系。這需要設備和 PC 端的驅動和應用程序來保證。因此,這也造成了是市面很多不規范的產品 dump 出來一個設備描述自己支持很多的功能,但可能其中只有一小部分的功能是支持的原因。
四
-
HID report descriptor 描述了HID 設備的沒一筆數據的數據標簽(Tag)類型,大小,比如:
- 定義了 HID 的 input 事件應該被當作 mouse 事件還是 Keyboard 事件
- 定義了一個 output 事件或者 input 事件應該被如何傳輸(數據結構,類型)
五
-
HID 的 ClassCode 恆定為 0x03
-
HID 的 SubClass 有兩個值
- 0 代表無 SubClass
- 1 代表 Boot Interface Subclass
-
HID 的 Protocol Codes 定義了三個值:(只有當 SubClass 為 1 的時候才會有 Interface Desc,並且 ProtocolCode 才有 非零值)
- 0 - None
- 1 - Keyboard
- 2 - Mouse
六: 關於 HID 的 Endpoint 說明如下:
- Control pipe de Endpoint0 是作為一個 USB 設備一定存在的,其也傳輸了包含以下內容:USB Control, Class request code, polled data(Message Data)
- Interrupt In, 用於承載 HID Input 類型數據(device to host)
- Interrupt Out,用於承載 HID output 類型數據(Host to devices),該 Endpoint 可不實現,此時 Output 數據通過 Endpoint0 傳輸
七 Report Descript
-
HID Report Desc 中包含許多格式相近的 item,而分析這些 item 的上下文可以得知,一個 HID 的設備包含哪些能力。
-
Report Desc 上下文的格式大致如下圖所示:
-
其中 item 的格式:
短 item 主要包含以下幾個部分:bTag,bType,bSize,bData,如下所示
-
bTag 和 bType 一起標識該 Item 的屬性,其中 bType 主要指定屬性范圍,占用兩個位:
00 - Main Items
01 - Global Items
10 - Local Items
11 - 保留(實際上可看成和特殊的 bTag(1111), bSize(10) 搭配標識該 Item 為長 Items) -
而對於短 Item 來說, bSize 標識該 item 的 bData 長度,短 Item 大致有 0,1,2,4 這幾種長度,分別用 00, 01, 10, 11 表示
長 item 主要包含 特殊頭,bDataSize,bLongItemTag, Data,如下所示:
-