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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值