HID 描述符 報告描述符
其它的描述符都是告訴PC 自己是什麼裝置,是做什麼用的。而報告描述符則是告訴PC 裝置與PC之間資料傳輸的格式。即裝置要傳輸給PC(或是PC傳輸給裝置)的是多少位元組的資料,都是什麼形式的,是常量還是變數。
0x05, 0x01, ; USAGE_PAGE (Generic Desktop) 表示用途頁為通用桌面裝置
0x09, 0x06,; USAGE (Keyboard) //表示用途為鍵盤
0xa1, 0x01, ; COLLECTION (Application) 表示應用集合,必須要以END_COLLECTION來結束,見最後的0xc0
0x05, 0x07, ; USAGE_PAGE (Keyboard) 表示用途頁為按鍵
0x19, 0xe0, ; USAGE_MINIMUM (Keyboard LeftControl) ctrl,shift等鍵。
0x29, 0xe7, ; USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, ; LOGICAL_MINIMUM 邏輯最小值
0x25, 0x01, ; LOGICAL_MAXIMUM 邏輯最大值
0x75, 0x01, ;REPORT_SIZE報告大小為1bit,所以前面的邏輯最小值為0,邏輯最大值為1
0x95, 0x08, ; REPORT_COUNT 報告的個數為8,即總共有8個bits
0x81, 0x02, ; INPUT (Data,Var,Abs) 輸入用,變數,值,絕對值。像鍵盤這類一般報告絕對值,而滑鼠移動這樣的則報告相對值,表示滑鼠移動多少。
上面這這幾項描述了一個輸入用的欄位,總共為8個bits,每個bit表示一個按鍵分別從左ctrl鍵到右GUI鍵。這8個bits剛好構成一個位元組,它位於報告的第一個位元組。它的最低位,即bit-0對應著左ctrl鍵,如果返回的資料該位為1,則表示左ctrl鍵被按下,否則,左ctrl鍵沒有按下。最高位,即bit-7表示右GUI鍵的按下情況。中間的幾個位,/需要根據HID協議中規定的用途頁表(HID Usage Tables)來確定。這裡通常用來表示特殊鍵,例如ctrl,shift,del鍵等
0x95, 0x01, ; REPORT_COUNT
0x75, 0x08, ; REPORT_SIZE
0x81, 0x03, ; INPUT (Cnst,Var,Abs) 輸入用,常量,值,絕對值
上面這8個bit是常量,裝置必須返回0
0x95, 0x05, ; REPORT_COUNT 這樣的資料段個數為5
0x75, 0x01,;REPORT_SIZE 每個段大小為1bit
0x05, 0x08, ; USAGE_PAGE (LEDs) 用途是LED,即用來控制鍵盤上的LED用的,因此下面會說明它是輸出用
0x19, 0x01, ; USAGE_MINIMUM (Num Lock) 用途最小值是Num Lock,即數字鍵鎖定燈
0x29, 0x05, ; USAGE_MAXIMUM (Kana)
0x91, 0x02, ; OUTPUT (Data,Var,Abs)輸出,用來控制LED。變數,值,絕對值。1表示燈亮,0表示燈滅
0x95, 0x01, ;REPORT_COUNT 這樣的資料段個數為1
0x75, 0x03, ; REPORT_SIZE 每個段大小為3bits
0x91, 0x03, ; OUTPUT (Cnst,Var,Abs) 輸出用,常量,值,絕對值
由於要按位元組對齊,而前面控制LED的只用了5個bit,所以後面需要附加3個不用bit,設定為常量。
0x95, 0x06, ; REPORT_COUNT 報告個數為6
0x75, 0x08, ; REPORT_SIZE 每個段大小為8bits
0x15, 0x00, ;LOGICAL_MINIMUM 邏輯最小值0
0x25, 0xFF, ; LOGICAL_MAXIMUM 邏輯最大值255
0x05, 0x07, ;USAGE_PAGE (Keyboard) 用途頁為按鍵
0x19, 0x00, ; USAGE_MINIMUM (Reserved (no event indicated)) 使用最小值為0
0x29, 0x65, ; USAGE_MAXIMUM (Keyboard Application) 使用最大值為0x65
0x81, 0x00, ; INPUT (Data,Ary,Abs) 輸入用,變數,陣列,絕對值
以上定義了6個8bit寬的陣列,每個8bit(即一個位元組)用來表示一個按鍵,所以可以同時有6個按鍵按下。沒有按鍵按下時,全部返回0。如果按下的鍵太多,導致鍵盤掃描系統無法區分按鍵時,則全部返回0x01,即6個0x01。如果有一個鍵按下,則這6個位元組中的第一個位元組為相應的鍵值
0xc0 ; END_COLLECTION關集合,跟上面的對應
下面是USB滑鼠報告描述符,比起鍵盤的來說要簡單些。它描述了4個位元組,第一個位元組表示按鍵,第二個位元組表示x軸(即滑鼠左右移動,0表示不動,正值表示往右移,負值表示往左移),第三個位元組表示y軸(即滑鼠上下移動,0表示不動,正值表示往下移動,負值表示往上移動),第四個位元組表示滑鼠滾輪(正值為往上滾動,負值為往下滾動)。
0x05, 0x01, ; USAGE_PAGE (Generic Desktop) 通用桌面裝置
0x09, 0x02, ; USAGE (Mouse) /滑鼠
0xa1, 0x01, ; COLLECTION (Application) 集合
0x09, 0x01, ; USAGE (Pointer) 指標裝置
0xa1, 0x00, COLLECTION (Physical) 集合
0x05, 0x09, ; USAGE_PAGE (Button) 按鍵
0x19, 0x01, ; USAGE_MINIMUM (Button 1) 使用最小值1
0x29, 0x03, ; USAGE_MAXIMUM (Button 3) 使用最大值3,1:左鍵,2:右鍵,3:中鍵
0x15, 0x00, ; LOGICAL_MINIMUM (0) 邏輯最小值0
0x25, 0x01, ; LOGICAL_MAXIMUM (1) 邏輯最大值1
0x95, 0x03, ; REPORT_COUNT (3) 數量為3
0x75, 0x01, ; REPORT_SIZE (1) 大小為1bit
以上3個bit分別表示滑鼠的三個按鍵情況,最低位(bit-0)為左鍵bit-1為右鍵,bit-2為中鍵,按下時對應的位值為1,釋放時對應的值為0
0x81, 0x02, ; INPUT (Data,Var,Abs) /輸入,變數,數值,絕對值
0x95, 0x01, ; REPORT_COUNT (1) 填充5個bit,補足一個位元組
0x75, 0x05, ; REPORT_SIZE (5)
0x81, 0x03, ; INPUT (Cnst,Var,Abs)
0x05, 0x01, ; USAGE_PAGE (Generic Desktop) 用途頁為通用桌面
0x09, 0x30, ; USAGE (X) 用途為X
0x09, 0x31, ; USAGE (Y) 用途為Y
0x09, 0x38, ; USAGE (Wheel) 用途為滾輪
0x15, 0x81, ; LOGICAL_MINIMUM (-127) 邏輯最小值為-127
0x25, 0x7f, ; LOGICAL_MAXIMUM (127) 邏輯最大值為+127
0x75, 0x08, ; REPORT_SIZE (8) 大小為8個bits
0x95, 0x03, ; REPORT_COUNT (3) 數量為3個,即分別代表x,y,滾輪
0x81, 0x06, ; INPUT (Data,Var,Rel) 輸入,變數,值,相對值
0xc0, ; END_COLLECTION關集合
通過對上面的報告分析,我們知道報告返回4個位元組,沒有報告ID。如果滑鼠左鍵按下,則返回01 00 00 00(十六進位制值),如果右鍵按下,則返回02 00 00 00,如果中鍵按下,則返回04 00 00 00,如果三個鍵同時按下,則返回07 00 00 00。如果滑鼠往右移動則第二位元組返回正值,值越大移動速度越快。其它的類推。
Usage page
Page ID |
Page 名稱 |
00 |
未定義 |
01 |
Generic Destop controls |
02 |
Simulation controls |
03 |
VR controls |
04 |
Sport controls |
05 |
Game controls |
06 |
保留 |
07 |
Keyboard/keypad |
08 |
LEDs |
09 |
Button |
0a |
Ordinal |
0b |
Telephony |
0c |
Consumer |
0d |
Digitizer |
0e |
保留 |
0f |
PID Page |
10 |
Unicode |
11-13 |
保留 |
14 |
Alphanumeric Display |
15-7f |
保留 |
80-83 |
Monitor pages |
84-87 |
Power pages |
88-8b |
保留 |
8c |
Bar code scanner page |
8d |
Scale page |
8e-8f |
Reserved point of sale pages |
90 |
Camera control page |
91 |
Arcade page |
92-feff |
保留 |
Ff00-ffff |
廠商定義 |
Generic Destop page
Usage ID |
Usage 名稱 |
00 |
Undefined |
01 |
Pointer |
02 |
Mouse |
03 |
Reserved |
04 |
Joystick |
05 |
Game pad |
06 |
Keyboard |
07 |
Keypad |
08 |
Multi_axis controller |
09-2f |
Reserved |
30 |
X |
31 |
Y |
32 |
Z |
33 |
Rx |
34 |
Ry |
35 |
Rz |
36 |
Slider |
37 |
Dial |
38 |
Wheel |
39 |
Hat switch |
3a |
Counted buffer |
3b |
Byte count |
3c |
Motion wakeup |
3d |
Start |
3e |
Select |
3f |
Reserved |
40 |
Vx |
41 |
Vy |
42 |
Vz |
43 |
Vbrx |
44 |
Vbry |
45 |
Vbrz |
46 |
Vno |
47-7f |
Reserved |
80 |
System control |
81 |
System power down |
82 |
System sleep |
83 |
System wake up |
84 |
System context menu |
85 |
System main menu |
86 |
System App menu |
87 |
System Menu help |
88 |
System Menu exit |
89 |
System Menu select |
8a |
System Menu right |
8b |
System Menu left |
8c |
System Menu up |
8d |
System Menu down |
8e-8f |
Reserved |
90 |
D-pad up |
91 |
D-pad down |
92 |
D-pad right |
93 |
D-pad left |
94-ffff |
Reserved |