HID 描述符(二)——报告描述符

转载 2015年11月20日 11:51:34

其它的描述符都是告诉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

相关文章推荐

USB HID报告及报告描述符简介

  • 2011年04月26日 09:55
  • 46KB
  • 下载

USB_HID报告及报告描述符简介

  • 2015年10月29日 17:11
  • 84KB
  • 下载

HID报告描述符(Report Descriptor)脚本语言研读笔记1

HID的Report Descriptor报告描述符已经不是简简单单的描述某个值对应某个固定意义了, 它已经能够组合出很多种情况,并且需要pc上的HID驱动程序提供parser解释器来对 描述的设...
  • Luohsh1
  • Luohsh1
  • 2013年12月15日 20:46
  • 1357

Hid Report Descriptor 报告描述符

在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。USB报告描述符(Report Descriptor)是HID...
  • xuehuic
  • xuehuic
  • 2011年03月28日 15:51
  • 8456

USB HID 报告描述符

相关讨论:http://www.ednchina.com/blog/computer00/14382/category.aspx   在USB中,USB HOST是通过各种描述符来识别设备...

HID报告描述符(Report Descriptor)脚本语言研读笔记2

对HID Script脚本语言的理解: Global item--全局项 Main item --主项 local item --局部项   对于Main项,parser解释器,将顺序解释集合...
  • Luohsh1
  • Luohsh1
  • 2013年12月15日 20:44
  • 1060

usb HID 报告描述符 + 自己的解释

先记录下来: http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/usb/input/hid-core.c?v=2....
  • ryman
  • ryman
  • 2013年04月03日 16:52
  • 8034

USB/HID设备报告描述符详解

概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。 USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设...
  • JRENSKY
  • JRENSKY
  • 2015年04月03日 14:18
  • 847

usb hid 报告描述符详解

(未读) 概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。 USB通讯协议的规范是以1ms产生一个...

hid报告描述符详解

分类: LINUX HID协议规定了两种条目:短条目和长条目(这儿没有用到长条目,不管它).其中短条目的结构如下图所示: 要判断一个短条目具体是哪种类型,先查看bType确定出主条目、全局...
  • helezh
  • helezh
  • 2014年11月29日 11:24
  • 437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HID 描述符(二)——报告描述符
举报原因:
原因补充:

(最多只允许输入30个字)