自定義HID協議、應用說明
基本框架:
HID裝置支援USB標準描述符中的五個:裝置描述符、配置描述符、介面描述符、端點描述符、字串描述符。除此之外,HID裝置還有三種特殊的描述符:HID描述符、報告描述符、物理描述符。一個USB裝置只能支援一個HID描述符,但可以支援多個報告描述符,而物理描述符則可以有也可以沒有。
USB描述符:
1、裝置描述符
一個USB裝置只有一個裝置描述符。裝置描述符主要記錄的資訊有:裝置所使用的USB協議版本號、裝置型別、端點0的最大包大小、廠商ID(VID)和產品ID(PID)、裝置版本號、廠商字串索引、產品字串索引、裝置序列號索引、可能的配置數等。
偏移量 |
Demo值 |
域 |
大小/位元組 |
說明 |
0 |
0x12 |
bLength |
1 |
該描述符的長度(0x12=18位元組) |
1 |
0x01 |
bDescriptorType |
1 |
描述符型別(0x01裝置描述符) |
2 |
0x00,0x02 |
bcdUSB |
2 |
本裝置使用的USB協議版本 |
4 |
0x00 |
bDeviceClass |
1 |
類程式碼 |
5 |
0x00 |
bDeviceSubClass |
1 |
子類程式碼 |
6 |
0x00 |
bDeviceProtocol |
1 |
協議碼 |
7 |
0x40 |
bMaxPacketSize |
1 |
端點0最大包長 |
8 |
0x0483 |
idVendor |
2 |
廠商ID |
10 |
0x5750 |
idProduct |
2 |
產品ID |
12 |
0x00,0x02 |
bcdDevice |
2 |
裝置版本號 |
14 |
0x01 |
iManufacturer |
1 |
描述廠商的字串索引 |
15 |
0x02 |
iProduct |
1 |
描述產品的字串索引 |
16 |
0x03 |
iSerialNumber |
1 |
產品序列號的字串索引 |
17 |
0x01 |
bNumConfigurations |
1 |
可能的配置數 |
2、配置描述符
裝置描述符裡決定了該裝置有多少種配置,每種配置都有一個配置描述符。配置描述符主要記錄的資訊有:配置所包含的介面數、配置的編號、供電方式、是否支援遠端喚醒、電流需求量等。
偏移量 |
Demo值 |
域 |
大小 |
說明 |
0 |
0x09 |
bLength |
1 |
該描述符的長度(0x09位元組) |
1 |
0x02 |
bDescriptorType |
1 |
描述符型別(0x02配置描述符) |
2 |
0x29,0x00 |
wTotalLength |
2 |
配置、介面、端點和類描述符位元組總和 |
4 |
0x01 |
bNumInterfaces |
1 |
支援介面數 |
5 |
0x01 |
bConfigurationValue |
1 |
本配置描述符標識 |
6 |
0x00 |
iConfiguration |
1 |
配置描述符說明字串索引 |
7 |
0xC0 |
bmAttributes |
1 |
電源及喚醒 |
8 |
0x32 |
MaxPower |
1 |
裝置耗電電流 |
3、介面描述符
在每個配置描述符中又定義了該配置有多少個介面,每個介面都有一個介面描述符。介面描述符主要記錄的資訊有:介面的編號、介面的端點數、介面所使用的類、子類、協議等。
偏移量 |
Demo值 |
域 |
大小/位元組 |
說明 |
0 |
0x09 |
bLength |
1 |
該描述符的長度(0x09位元組) |
1 |
0x04 |
bDescriptorType |
1 |
描述符型別(0x04介面描述符) |
2 |
0x00 |
bInterfaceNumber |
1 |
本介面描述符標識 |
3 |
0x00 |
bAlternateSetting |
1 |
可改變的設定 |
4 |
0x02 |
bNumEndpoints |
1 |
介面端點數 |
5 |
0x03 |
bInterfaceClass |
1 |
介面類程式碼(0x03 HID) |
6 |
0x00 |
bInterfaceSubClass |
1 |
啟動型別1=BOOT, 0=No BOOT |
7 |
0x00 |
bInterfaceProtocol |
1 |
0=None, 1=Keyboard, 2=Mouse |
8 |
0x00 |
iInterface |
1 |
介面描述符說明字串索引 |
4、類描述符
該描述符不是必須的,如果配置的USB型別有類特殊描述符(如HID類),它跟在相應的介面描述符之後。具體數值參見HID類描述符。
5、端點描述符
在介面描述符裡又定義了該介面有多少個端點,每個端點都有一個端點描述符。端點描述符主要記錄的資訊有:端點號及方向、端點的傳輸型別、最大包長度、查詢時間間隔等。
偏移量 |
Demo EP1 |
Demo EP2 |
域 |
位元組 |
說明 |
0 |
0x07 |
0x07 |
bLength |
1 |
該描述符的長度(0x07位元組) |
1 |
0x05 |
0x05 |
bDescriptorType |
1 |
描述符型別(0x5端點描述符) |
2 |
0x81 |
0x01 |
bEndpointAddress |
1 |
端點地址 |
3 |
0x03 |
0x03 |
bmAttributes |
1 |
端點型別(0x03 中斷端點) |
4 |
0x40,0x00 |
0x40,0x00 |
wMaxPacketSize |
2 |
端點發送接收最大包長 |
6 |
0x05 |
0x05 |
bInterval |
1 |
中斷端點輪訓時間間隔 |
6、字串描述符
字串描述符主要是提供一些方便人們閱讀的資訊,它不是必需的。
偏移量 |
Demo值 |
域 |
大小/位元組 |
說明 |
0 |
0x04 |
bLength |
1 |
該描述符的長度(0x04/0xXX位元組),第一個字串描述符0x04 |
1 |
0x03 |
bDescriptorType |
1 |
描述符型別(0x3字串描述符) |
2 |
1033 |
wLANGID |
2/XX |
第一個字串描述符時2位元組,表示語言編碼,其他自定義 |
HID描述符:
為了把一個裝置識別為HID類別,裝置在定義描述符的時候必須遵守HID規範。除了USB標準定義的一些描述符外,HID裝置還必須定義HID描述符。另外裝置和主機的通訊是通過報告的形式來實現的,所以還必須定義報告描述符;而物理描述符不是必需的。
HID描述符是關聯於介面(而不是端點)的,所以裝置不需要為每個端點都提供一個HID描述符。詳情參看《USB HID協議中文版_USB HID 裝置》
1、 HID類描述符
HID描述符是HID類特有的描述符,保證裝置正確識別,遵循規定的格式。
偏移量 |
Demo值 |
域 |
大小/位元組 |
說明 |
0 |
0x09 |
bLength |
1 |
該描述符的長度(0x09位元組) |
1 |
0x21 |
bDescriptorType |
1 |
描述符型別(0x21 HID類) |
2 |
0x11,0x01 |
bcdHID |
2 |
HID規範版本 |
4 |
0x00 |
bCountryCode |
1 |
國家程式碼 |
5 |
0x01 |
bNumDescriptors |
1 |
支援的描述符個數 |
6 |
0x22 |
bDescriptorType |
1 |
支援的描述型別(0x22是報表) |
7 |
0x34,0x00 |
wDescriptorLength |
2 |
Report描述符長度 |
2、 報告描述符
報告描述符比較複雜,它是以item形式排列組合而成,無固定長度。為了準確描述來自主機的資料,一個報告描述符必須包括以下內容:
偏移量 |
域 |
大小/位元組 |
說明 |
0 |
USAGE_PAGE |
2 |
|
2 |
USAGE |
2 |
|
4 |
COLLECTION |
2 |
|
6 |
USAGE ID |
2 |
|
8 |
LOGICAL_MINIMUM |
2 |
|
10 |
LOGICAL_MAXIMUM |
3 |
|
13 |
REPORT_SIZE |
2 |
|
15 |
REPORT_COUNT |
2 |
|
17 |
INPUT/OUTPUT |
2 |
|
…上述重複 |
|||
XX |
END_COLLECTION |
報表描述符是報表描述專案(Item)的集合,每一個描述專案都有相對統一的資料結構,專案很多,通過編碼實現專案的第一個位元組(專案字首)由三部分構成,即專案型別(itemtype)、 專案標籤(itemtag)和專案長度(itemsize),其中短專案的格式如下圖:
其中bTag佔4個位,其餘二者各佔2個位。短專案的資料位元組數由 bSize 的值定義, bSize 為0、 1、 2、 3 時 Data 部分的位元組數分別為0、 1、 2、 4 個位元組。短專案的專案型別由 bType 定義, bType 為 0、 1、 2 時分別為 Main、 Global和 Local 型別。
bTag於下表中描述,例如Input 的標籤程式碼『0x8?』中8 即bTag=8,再如標籤Feature 之bTag=11,而Unit之bTag=6。Main Item的bType=0,Global Item的bType=1,而Local Item 的bType= 2。Main Item卷標程式碼中的『?』可以改為『00nnB』,Global Item的可以改為『01nnB』,而Local Item的可以改為『10nnB』,其中nn 代表bSize。
Main Item |
Global Item |
Local Item |
|||
Item |
Prefix Code |
Item |
Prefix Code |
Item |
Prefix Code |
Input |
0x8? |
Usage Page |
0x0? |
Usage |
0x0? |
Output |
0x9? |
Logical Minimum |
0x1? |
Usage Minimum |
0x1? |
Feature |
0x0b? |
Logical Maximum |
0x2? |
Usage Maximum |
0x2? |
Physical Minimum |
0x3? |
Designator_Index |
0x3? |
||
Collection |
0xa1 |
Physical Maximum |
0x4? |
Designator Minimum |
0x4? |
End Collection |
0xc0 |
Unit Exponent |
0x5? |
Designator Maximum |
0x5? |
Unit |
0x6? |
String_Index |
0x6? |
||
Report Size |
0x7? |
String Minimum |
0x7? |
||
Report ID |
0x8? |
String Maximum |
0x8? |
||
Report Count |
0x9? |
Delimiter |
0xa? |
||
Push |
0xA4 |
||||
Pop |
0xB4 |