文章内容提示
这篇文章主要说明如何获取与查看USB和BLE HoGP HID设备报告描述符,如何根据获取的描述符读懂report。然后说明了可以使用hidrd-convert工具,来如何根据hex报告描述符转化得到C语言格式的描述符,这对于我们编码是有意义的。 其中,还截取了USB 逻辑分析仪,Wireshark等工具来查看input report。
如何看懂HID report descriptor
对于如何看懂HID报告描述符,几乎离不开下面的这两个pdf:
先看文档(USB HID设备)弄明白一些基本概念:
- 项目Item的意义
- collection与end collection:namespace的意义,相当于将多个usage page
- usage page与 usage
- Logical Minimum 与 Logical Maximum
- Usage Minimum 与 Usage Maximum
- input
- report size 与 report count
个人认为先准备好这份文档,然后结合一些文章来理解比较快速。以下是个人认为的快速理解的步骤:
1. 看这篇(Tutorial about USB HID Report Descriptors)文章,理解一些基本的概念,主要弄明白概念4与5
2. 不要太过于纠结如何从hex转换到方便大家阅读的格式的report
例如下面这个描述符,我们应该直接看注释而,然后可以知道描述的是mouse,然后根据usage page和usage的值在usage table pdf中找到对应的描述,然后根据对基本概念的了解知道如果鼠标的一个按键按下那么会生成怎么样的report即可:
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x02, // Usage (Mouse)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report Id (1)
0x09, 0x01, // Usage (Pointer)
0xA1, 0x00, // Collection (Physical)
0x05, 0x09, // Usage Page (Buttons)
0x19, 0x01, // Usage Minimum (01) - Button 1
0x29, 0x03, // Usage Maximum (03) - Button 3
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x03, // Report Count (3)
0x81, 0x02, // Input (Data, Variable, Absolute) - Button states
0x75, 0x05, // Report Size (5)
0x95, 0x01, // Report Count (1)
0x81, 0x01, // Input (Constant) - Padding or Reserved bits
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x38, // Usage (Wheel)
0x15, 0x81, // Logical Minimum (-127)
0x25, 0x7F, // Logical Maximum (127)
0x75, 0x08, // Report Size (8)
0x95, 0x03, // Report Count (3)
0x81, 0x06, // Input (Data, Variable, Relative) - X & Y coordinate
0xC0, // End Collection
0xC0, // End Collection
3. 看后面的 “1. 使用usbhid-dump工具获取报告描述符” 章节了解report字节数的构成来源
需要注意的是input是报告给主机(例如PC,Android)的,因此只能算input的,在主机到设备的时候只能算output的
4. 看文章《