USB HID Report描述符
在USB的枚举后,即交互完 设备描述符(device descriptor),配置描述符(configure descriptor),接口描述符(interface descriptor)和终端描述符(endpointer desciptor)。如果是HID设备,即class值为3设备交互还会发送一系统的特殊包来描述HID设备的特性。
这一些描述HID的特性称为Report Descriptor,报告描述符,可以理解它们是HID设备的上传的包,或者接收的包的格式。设备能包含多个report
(测试出错)
主要参考官网文档:HID Information
对于每种HID动作的编码,HID有一个专用术语usage (用法),USB协议中支持所有编码表称为usage tables.这里有全部编码表HID Usage Tables 1.12
Report Descriptor
在usb.org网站有HID decriptor tools工具下载 可以用创建和解析report descriptor包格式
http://www.usb.org/developers/hidpage/dt2_4.zip
一个完整的report 分为二部分,一部分定长的头,另一部分就是变长的定义, 每个collection由若干个usage组成. 在Collection中,每一个组成部分以称为item,item就是usage.
A1 01
与C0
之间表示Application Collection
的.
| usage | 说明 |
| :—: | :————: |
| input | 输入数据格式 |
| output | 输出数据格式 |
| Logical Minimum | 取值范围 |
| logical_maximum | 取值范围 |
| physical_minimum| 取值范围 |
| physical_maximum| 取值范围 |
| report size | report输入字节宽度 |
| report count | report总数 |
获取描述符
- 工具:
USBlyzer
(Bus Hound同样也可以抓取,但是需要自己解析)
实例分析(鼠标)
1 | HID Descriptor |
获取数据格式–Input
从Report描述符可以获取信息,鼠标输入的数据可以分两部分:
序号 | 设备类型 | 格式 | 宽度 | 大小 | 取值范围 |
---|---|---|---|---|---|
1 | Usage Page (Button) | Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) | Report Size (1) | Report Count (8) | Logical Minimum (0) ~ Logical Maximum (1) |
2 | Usage Page (Generic Desktop) | Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) | Report Size (8) | Report Count (3) | Logical Minimum (-127) ~ Logical Maximum (127) |
数据格式:
1 | +---------------+---------------+--------------------------------+ |
- 第一部分:一个字节(Byte),其中每个bit代表一种含义,
Usage Page (Button)
,Usage Minimum (Button 1)
,Usage Maximum (Button 3)
- 第二部分:三个字节(Byte),其中一个字节代表一种含义,
Usage (X)
,Usage (Y)
,Usage (Wheel)
linux下获取HID
1 | usbhid-dump | grep -v : | xxd -r -p | hidrd-convert -o spec |
1 | =====>$usbhid-dump -a1:5 -i0 |
hid设备操作接口
通过open
及ioctl
操作HID设备节点dev/hidrawN
头文件:
#include <linux/hidraw.h>
1 |
|
相关文件
- Device Class Definition for HID 1.11
- HID Usage Tables 1.12
- USB HID to PS2 Scan Code Translation Table.pdf
- USB HID usage table
总结
在设备识别阶段多使用bus hound
抓取数据包进行分析,在开发板作device时,host可能会获取部分数据(比如触摸屏,需要得到支持几点的触摸操作,默认单点),此时可能会获取失败。
参考
- Linux HID 驱动开发(2) USB HID Report 描述及usage 概念
- USB HID报告及报告描述符简介
- 浅析linux下usb鼠标和usb键盘usbhid驱动hid_parse_report报告描述符