在USB的枚举后,即交互完 设备描述符(device descriptor),配置描述符(configure descriptor),接口描述符(interface descriptor)和终端描述符(endpointer desciptor)。如果是HID设备,即class值为3设备交互还会发送一系统的特殊包来描述HID设备的特性。
这一些描述HID的特性称为Report Descriptor,报告描述符,可以理解它们是HID设备的上传的包,或者接收的包的格式。设备能包含多个report.
对于每种HID动作的编码,HID有一个专用术语usage (用法),USB协议中支持所有编码表称为usage tables.这里有全部编码表。
一.report descriptor 格式
在usb.org网站有HID decriptor tools工具下载 可以用创建和解析report descriptor包格式
以下是一个键盘的report descriptor的内容.在最右侧的是原始数据,比如前二字节是0x05,0x01 表示
USAGE_PAGE.
可以换一个界面查看得更清楚
二.report,usage 格式
从各个软件分析结果看,一个完整的report 分为二部分,一部分定长的头,另一部分就是变长的定义,即上文中出现的Collection部分.每个collection由若干个usage组成
定长头部分有二个定义. usage page.可理解是这个设备类型.
0x05, 0x01 (Generic Desktop Controls)
0x06,0x00 (Vendor-Defined 1)
这个在usb hid文档里详细定义
接下来的字段称为usage是表示发的包类型(?)
09 06 按键。
09 01 自定义
接下来的是
在Collection中,每一个组成部分以称为item,item就是usage.(这里术语整得太多了,但是这一些名词在linux hid都能看到.所以都列在这里。
Collection里一般第一个usage是描述input,第二个描述output.当然有不同例外。
首先看usage是input类型
在input首先是取值范围。虽然占两个字节,只是低位字节有效
Logical Minimum
logical_maximum
physical_minimum
physical_maximum
是report size,表示report输入字节宽度,report count表示report总数。
比如按键是report size 为1,report count 为8,即一个包为8字节。
然后是input hid包格式,用两个字符来表示。0x81,0x06表示包里的由如下格式组成.(其中0x06)有效。分析软件解析成如下。
A1 01 与 C0之间表示Application Collection的.
绝大部分report都是Application,从USB HID文档看,还有Logical和Physical类型
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit)
普通Mouse解析成
0x81, 0x02, INPUT (Data,Var,Abs)
这是格式可能参考 HID 1.11
如0x06--> 00000110 解析(Data(0),Array(0),...)
接下来是output 描述
各个包结构可以参见
象键盘包格式是有标准格式的。