USB-HID裝置協議解讀
參考文獻:Device Class Definition for Human Interface Devices(HID)
用於描述HID功能特徵的有三個值:Class SubClass Interfaces
Subclass Code Description
0 No Subclass
1 Boot Interface Subclass
2 - 255 Reserved
Protocol Code Description
0 None
1 Keyboard
2 Mouse
3 - 255 Reserved
- The bInterfaceProtocol member of an Interface descriptor only has meaning if the bInterfaceSubClass
member declares that the device supports a boot interface, otherwise it is 0.
HID裝置的特性
HID裝置與HID驅動只能通過控制傳輸或者中斷傳輸來連線,且端點0在USB裝置中通常是作為控制管道。
在HID中,一次傳輸就是一個報告。
HID 支援在執行時忽略報表中某些欄位的功能,這通過定義報告符長度大於實際生成的報告符長度來實現
HID裝置通過HID描述符、報告描述符和物理描述符進行描述,其中物理描述符是可選的
HID裝置的描述符分層圖:
由圖可看出,HID Descriptor是與Interface Descriptor並行的描述符,其Class、SubClass和Protocol屬性都是在介面描述符中配置,如下:
- bInterfaceClass —— 3(HID Class)
- bInterfaceSubclass —— 0(Have no subclass) / 1(Boot Device)
- bInterfaceProtocol —— 0(Have no Protocol, only valid when Subclass is Boot Device)
同時,Device Descriptor 中的bDeviceClass需配置成0x00
HID Descriptor的組成:
bLength bDescriptorType bcdHID bCountryCode bNumDescriptors bDescriptorType bDescriptorLength...
HID Report Descriptor
如果報告描述符中有出現Report ID,則表示有多個Report,否則就只有一個Input、Output和Feature結構體存在,她們即代表所有的裝置資料。
報告描述符中由不同的item組成,一個Item是關於裝置的一塊資訊,所有Item都有1位元組的卷標,卷標裡包含Tag,type,size
相應的HID Driver裡面有一個Item 解析器,對報告符中的Item進行解析,Item解析器一般會解析到Main Item、Pop Item和Push Item並進行相應的操作。
Report Descriptor中的Item解讀
Item由三種類型:Main(主專案)、Global(全域性專案)、Local(區域專案),後兩者主要用於修飾Main Item
Local Item只適用於列下的第一個主專案,而Global Item則適用於其下方的所有主專案
1、 Main Item的主要資料格式
- input:裝置操作輸入到主機的資料格式,該資料格式會形成一個輸入報告。獲取輸入報告的方式有兩種:1、用Control pipe以get report(input)來傳輸;2、用Interrupt pipe在每一週期固定更新輸入報告給主機
- Output:主機輸出到裝置的資料格式,形成一個輸出報告,以Control pipe用set report(output)將報告送到裝置,通常不建議用Interrupt pipe.
- Feature:主機送到裝置的組態所需資料的資料格式,特徵報告只能用Control pipe以get report(feature)和set report(feature)來取得和送出。
- Collection:Input、Output和Feature的集合,如Mouse、Keyboard等(程式碼型別有:Physical、Application、Logical、Report、Named Array、Usage Switch、Usage Modify、Reserved)
- End Collection:Collection集合結束
2、Global Item的主要資料格式(不完全)
- Usage Page
- Report Count
- Report Size
3、Local Item的主要資料格式(不完全)
- Usage
Usages(用途)是報告符中的一部分,主要用於確認裝置的具體操作資訊,一個報告符中可以含有多個Usage tags。
Usage和Control的關係是一一對應的
Usage是一個32位的無符號整型,高16位定義用途頁(Usage Page),低16位定義用途ID(Usage ID)
-
Usage Mininum
-
Usage Maximum
一般的Items 資料格式分兩個部分:字首和資料
例如:USAGE_PAGE(0x05,0x01) 前者表示字首,後者表示資料
0x01表示用途頁為通用桌面裝置
0x05——00000101
D0~D1表示這個字首後面跟的資料長度
D2~D3表示字首的型別,0-main 1-global 2-local 3-reserved
D4~D7表示字首的tag,一般有input、output、feature、collection、end collection
HID規範中指出:HID為傳送輸入報告必須擁有一箇中斷輸入端點。中斷IN端點使HID能夠在非可預期的時間內向主機發送資訊,主機驅動程式將使用中斷事務來週期性的輪詢裝置以獲得資料。
因此,對於裝置來說,其傳送端點(對於主機來說是輸入端點)必須為中斷端點,這是由HID的類驅動程式所決定的,主機的類驅動程式不會讀取HID介面的其它型別的端點的資料。這樣設計也是為了保證資料傳輸的頻寬。
而對於HID介面的輸出端點(對於裝置來說是接收端點),可以使用其它的型別,比如批量端點。