HID规范
+ -

HID设备标准请求GetDescriptor之获取报告描述符

2024-03-27 140 0

USB规范定义了USB标准请求,其中之一为获取描述符。
USB规范也对这些描述符做了分类,有的描述符是USB设备类型的,比如设备描述符配置描述符字符串描述符。但也有一些描述符是USB功能设备的,即逻辑设备的,这些逻辑设备是以接口描述符为单元的,比如HID定义的的报告描述符

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抓包如下图:
102150631195
可以看到,对于这一个低速的设备,由于端点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即可。
usbtreeviwer

另一种方式是直接在BUSHOUND上下发USB标准请求,具体可见:
1.在BUSHOUND的设备树上找到设备,如这里编号为63的设备。
编号为63的设备
2.然后双击该设备,在弹出的USB请求中填写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   

0 篇笔记 写笔记

USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID报告描述符详解
HID的报告描述符和其它描述符不一样,不是具有固定的数据结构,而是由固件开发商根据上报的数据自行组装的。这个组装的原材料是HID规范定义的ITEM。所以说HID报告描述符就像搭积木一样,其最终的数据结构和设计图纸是什么,都是由固件开发商决定的,但是其最终的产品又是由HID规范提供的各个标准积木模块搭......
USB获取描述符GetDescriptor
描述述包括设备描述符请求,配置描述符请求、字符串描述符请求和其它描述符请求。ID请求码说明6GET_DESCRIPTOR用于主机获取设备的特定描述符GetDescriptor用于USB主机读取设备的描述符,在请求数据阶段,USB设备将向主机返回指定的描述符。......
USB键盘报告描述符数据格式分析
USB键盘的HID报表描述符的内容参见下表。数据的输入端点为中断方式,当有键盘敲击事件时,会上报数据长度为8字节的数据报告。0x05,0x01,// Global Generic Desktop0x09,0x06,// Local KeyBoard 0xA1,0x01,// Main app col......
USB鼠标HID报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
USB中文网出品-HID报告描述符分析工具
HidReportParser.exe工具已经网页化,可访问http://www.usbzh.com/tool/usb.html 在线分析USB-HID报告描述符USB HID规范中有一个很重要的概念,就是HID的报告描述符。本人搞了这么久的HID设备开发,其中一项最头疼的是HID报告描述符的......
USB2.0设备枚举-获取设备描述符事务
USB设备与主机进行数据传输或进行设备配置时,有一些常见的术语如事务,令牌,包等。USB设备在枚举过程中有2次获取设备描述符的过程,这里分别标识为首次获取设备描述符和分配地址后的获取描述符。两次获取描述符的过程基本类似,惟一的区别是首次首次获取描述符由于设备尚未分配地址,故使用地址0与主机进行通......
HID 报表描述符/报告描述符
报表描述符用于描述USB HID设备与主机之间数据交互的格式。根据数据的传输方向,分为输入报告和输出报告。输入报告是USB设备发送数据给主机的。大部分的USB HID设备主要实现的是输入报告。如我们平常使用的USB鼠标,就是通过我们点击鼠标按键或滑动鼠标流轮实现给主机上报鼠标的报告信息。输出报告......
HID报告描述符协议
HID报告描述符通过报告描述符的条目定义了HID报告数据的格式。对于大部分的HID设备来说,数据的传输方向都是输入的,即使用输入端点数据从设备端到主机端,并且使用的是中断的方式。当然HID设备不仅仅为数据的输入,有时也需要数据的输出。这时就需要一个输出中断端点来实现。报告描述符包含了属于特定Rep......
USB官网HID报告描述符生成工具
USB规范官网提供了一个HID报告描述符生成工具,https://www.usb.org/document-library/hid-descriptor-tool 使用我们此工具,我们可以:创建、编辑和验证HID报告描述符。输出多种输出(.txt、.inc、.h等)查看一些标准的设备报告描述符......
VS2019分析HID报告描述符解析源代码
常有人问,有没有HID解析的工具,好像除了usb官网提供的dt.exe,没有其它的好的东东了。Linux下有相关的工具,在本站的社区里:http://www.usbzh.com/zone/detail-12.html 可以查看做HID开发,其实最麻烦的就是HID报表描述符了。这里本人移植了Reac......
HID报告描述符Report Descriptor解析分析
HID独有的报告描述符也叫报表描述符对于初学者来说比较复杂,但是如果真正理解了它,我们又不得不惊吧于设计者的巧妙设计。HID报告描述符是由一系列的条目(item)组成的,一个item一般是又包括头部信息(bTag,bType,bSize)和数据内容。所以说item在HID的报告描述符中是最小的信息单......
HID报告描述符Usage
Usage是HID报告描述符的一部分,用于应用开发人员提供有关控制测量内容的信息。Usage标签指示了设备供应商对其设备的控制或者设备控制组的特定用途建议。例如虽然报告描述符中定义了数据格式(例如,三个 8 位字段),但使用Usages定义了应对数据执行的操作含义,例如 x、y 和 z 输入。 此功......
HID报告描述符分类大全
下表列出的是全部的项目的前缀字和简要功能说明。项目类型项目标志(Tag)项目前缀,nn为数据长度功能说明MainInput8x1000 00 nn定义输入报表,主机利用该信息解析设备提供的数据。主机向控制端口发送Get_Report实现输入MainOutpu......
HID音量控制报告描述符
音量控制HID规范提供了两种报告描述符,分别对应按钮式和旋钮式。Up/Down 按钮音量控制下面的示例定义了一对按钮,用于渐变变量,例如音量增大和音量向下按钮。输入设备必须定义为相对设备。–1将减小音量+1将增大音量。0对音量没有影响。UsagePage(Consumer)Usage(Vol......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!