HID设备标准请求GetDescriptor之获取报告描述符
2024-03-27
1286
3
USB规范定义了USB标准请求,其中之一为获取描述符。
USB规范也对这些描述符做了分类,有的描述符是USB设备类型的,比如设备描述符,配置描述符,字符串描述符。但也有一些描述符是USB功能设备的,即逻辑设备的,这些逻辑设备是以接口描述符为单元的,比如HID定义的的报告描述符。
HID请求报告描述符
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
---|---|---|---|---|
81 | 06 | 低字节为00,高字节为描述符类型0x22 | 低字节为接口描述符id,高字节为0 | 接收的描述符长度 |
如以下的描述符请求为:
81 06 00 22 03 00 2f 00
它的解释为:
0x81, // bmRequestType: Dir: D2H, Type: Standard, Recipient: Interface
0x06, // bRequest (Get Descriptor)
0x00, // wValue[0:7] Desc Index: 0
0x22, // wValue[8:15] Desc Type: (HID Report)
0x03, 0x00, // wIndex ID: 0x03,Interface Descriptor Id
0x2F, 0x00, // wLength = 47
HID获取报告描述符的方法
一般情况下,在USB-HID设备在插入主机后,主机会在枚举设备过程中,会自动下发获取报告描述符的请求。这时我们可以通过抓USB总线分析仪抓包来获取。
示例 本人电脑中插入一个鼠标,通过沁恒的USB总线分析仪USB2.0Monitor抓包如下图:
可以看到,对于这一个低速的设备,由于端点0的MaxPacketSize只有8字节,所以对于长度为0x82长度的HID报告描述符,事用了多个IN事务来获取数据。
当然,如果你用系统级的工具如BUSHOUND,wireshark之后,其也只一个URB的标准请求。
Device Length Phase Data Description
------ -------- ----- -------------------------------------------------- ----------------
63.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR
63.0 18 IN 12 01 10 01 00 00 00 08 00 00 25 38 00 01 00 01 ..........%8....
00 01 ..
63.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR
63.0 9 IN 09 02 22 00 01 01 00 a0 32 ..".....2
63.0 CTL 80 06 00 02 00 00 22 00 GET DESCRIPTOR
63.0 34 IN 09 02 22 00 01 01 00 a0 32 09 04 00 00 01 03 01 ..".....2.......
02 00 09 21 11 01 00 01 22 42 00 07 05 81 03 06 ...!...."B......
00 0a ..
63.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG
63.0 CTL 21 0a 00 00 00 00 00 00 SET IDLE
63.0 CTL 81 06 00 22 00 00 82 00 GET DESCRIPTOR
63.0 66 IN 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 ................
29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 )...%...u.....u.
81 01 05 01 09 30 09 31 16 00 f8 26 ff 07 75 0c .....0.1...&..u.
95 02 81 06 09 38 15 81 25 7f 75 08 95 01 81 06 .....8..%.u.....
63.1 6 IN 01 00 00 00 00 00 ......
当然,以上是针对的是外接的设备。如果对于直接在主机常连接的USB设备,我们可以直接使用以下两种方法:
第一种是直接使用USBTreeViewer来复位设备的端口,让设备重新枚举。
具体方法就是以管理员运行usbtreeviwer,在左边的设备树上找到设备,然后执行RestartPort即可。
- USB设备通过上位机HID命令重启几次后会出现未识别的USB设备,插拔设备端都没用,而是需要重启电脑才能恢复 https://www.usbzh.com/article/detail-1059.html
另一种方式是直接在BUSHOUND上下发USB标准请求,具体可见:
1.在BUSHOUND的设备树上找到设备,如这里编号为63的设备。
2.然后双击该设备,在弹出的USB请求中填写USB标准请求,然后运行。
Length可以给比较大的值,系统会自动根据实际长度更新为实际的长度。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936