Linux HID 驱动开发(2) USB HID Report 描述及usage 概念
Linux HID 驱动开发(2) USB HID Report 描述及usage 概念
在USB的枚举后,即交互完 设备描述符(device descriptor),配置描述符(configure descriptor),接口描述符(interface descriptor)和终端描述符(endpointer desciptor)。如果是HID设备,即class值为3设备交互还会发送一系统的特殊包来描述HID设备的特性。 这一些描述HID的特性称为Report Descriptor,报告描述符,可以理解它们是HID设备的上传的包,或者接收的包的格式。设备能包含多个report.对于每种HID动作的编码,HID有一个专用术语usage (用法),USB协议中支持所有编码表称为usage tables.这里有全部编码表。http://www.rlocman.ru/i/File/2011/09/09/1.pdf HTML版本 http://www.freebsddiary.org/APC/usb_hid_usages.php 一.report descriptor 格式
在usb.org网站有HID decriptor tools工具下载 可以用创建和解析report descriptor包格式 http://www.usb.org/developers/hidpage/dt2_4.zip
以下是一个键盘的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 描述
各个包结构可以参见 http://www.usb.org/developers/devclass_docs/HID1_11.pdf
象键盘包格式是有标准格式的。
三.实例分析 这是用USBlyzer分析USB Phone的结果。我个人比较习惯用这个来看 Interface 3 HID Report Descriptor Vendor-Defined 1
Item Tag (Value) | Raw Data |
---|---|
Usage Page (Vendor-Defined 1) | 06 00 FF |
Usage (Vendor-Defined 1) | 09 01 |
Collection (Application) | A1 01 |
Usage (Undefined) | 09 00 |
Logical Minimum (0) | 15 00 |
Logical Maximum (255) | 26 FF 00 |
Report Size (8) | 75 08 |
Report Count (8) | 95 08 |
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) | 81 06 |
Usage (Undefined) | 09 00 |
Report Count (17) | 95 11 |
Output (Data,Var,Rel,NWrp,Lin,Pref,NNul,NVol,Bit) | 91 06 |
Report Count (12) | 95 0C |
Usage (Vendor-Defined 1:Vendor-Defined 1) | 0B 01 00 00 FF |
Feature (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) | B1 02 |
End Collection | C0 |
评论暂时关闭