1. 程式人生 > >HID 描述符 報告描述符

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