提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
在USB协议中,描述符(Descriptor)是用来定义USB设备的特性和能力的数据结构。不同的类设备可以类特定的描述符。
描述符通过标准的USB请求获取,主机通过解析这些描述符来了解设备的配置、接口、端点等信息。
这篇文章记录一下鼠标设备的枚举过程中的描述符信息。
一、HID 类描述符结构
- USB 设备功能按接口来分类,一个接口代表一种功能,接口下的端点用于实现该接口下的数据通讯功能
- Report 描述符用于描述
HID
设备的功能和设备上报的数据信息格式,Physical 描述符集(可选),它携带如人体的哪个部位操作此设备的信息。 - HID 描述符中定义了Report 描述符的个数和长度,Report描述符的获取通过向接口发送标准请求实现(81 06 00 22 xx xx xx xx)
二、描述符
1.设备描述符
struct _DEVICE_DESCRIPTOR_STRUCT {
BYTE bLength; //设备描述符的字节数大小,为0x12
BYTE bDescriptorType; //描述符类型编号,为0x01
WORD bcdUSB; //USB版本号
BYTE bDeviceClass; //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型
//0x00不是在设备描述符中定义的,如HID
BYTE bDeviceSubClass; //usb分配的子类代码,同上,值由USB规定和分配的
BYTE bDeviceProtocol; //USB分配的设备协议代码,同上
BYTE bMaxPacketSize0; //端点0的最大包的大小
WORD idVendor; //厂商编号
WORD idProduct; //产品编号
WORD bcdDevice; //设备出厂编号
BYTE iManufacturer; //描述厂商字符串的索引
BYTE iProduct; //描述产品字符串的索引
BYTE iSerialNumber; //描述设备序列号字符串的索引
BYTE bNumConfiguration; //可能的配置数量
}
===>> Device Desc <<===
bLength: 0x12 //设备描述符的字节数大小,为0x12
bDescriptorType: 0x01 //描述符类型编号,为0x01
bcdUSB: 0x02 00 // USB 版本号
bDeviceClass: 0x00 // 这个字节为0,则设备信息在interface
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x08 // 端点0 的最大包长
idVendor: 0x41 3C // 厂商编号
idProduct: 0x30 1A // 产品编号
bcdDevice: 0x01 00 // 设备出厂编号
iManufacturer: 0x01 // 描述厂商字符串的索引
iProduct 0x02 // 描述产品字符串的索引
iSerialNumber 0x00 // 描述设备序列号字符串的索引
bNumConfiguration 0x01 // 可能的配置数量
2. 配置描述符集合
主机发送获取配置描述符请求时,USB 设备会返回整个配置描述符的集合。
一个配置描述符集合通常包含以下几个部分:
- 配置描述符(Configuration Descriptor):
- 描述该配置的整体信息,包括所需的总功率、配置编号,以及该配置中包含的接口数量。
- 接口描述符(Interface Descriptor):
- 描述每个接口的属性,包括接口编号、类、子类、协议,以及接口中包含的端点数量。
- 端点描述符(Endpoint Descriptor):
- 描述接口中的每个端点的属性,如端点地址、传输类型(控制、同步、中断或批量传输)、最大数据包大小和轮询间隔等。
- 可选描述符:
- 某些配置还可能包含额外的描述符,如接口关联描述符(IAD,Interface Association Descriptor)、类特定描述符(Class-Specific Descriptors)等。
一下是 USBMonitor 在解析Get Configuration Descriptor 传输时时解码试图中显示的内容。
- 某些配置还可能包含额外的描述符,如接口关联描述符(IAD,Interface Association Descriptor)、类特定描述符(Class-Specific Descriptors)等。
其中的 HID Descriptor 即HID 类设备特定的描述符,除此之外,HID 类还定义了报告描述符(Report Descriptor)和物理描述符(Physical Descriptor)。
3. HID 报告描述符
报告描述符使用单独的请求获取。
报告描述符定义HID设备的所有输入、输出和特征报告的结构和格式。它是HID设备最重要的部分之一,描述了设备如何与主机通信。只有看懂报表描述符才能知道接下来 HID 报告携带的信息。
这是接口0的报告描述符。
HID描述符和报告描述符的主要作用是告诉主机如何与设备交互。主机使用这些描述符解析输入设备的行为,比如读取鼠标的X、Y坐标以及按钮状态。
总结
以上记录了鼠标设备在枚举过程中的描述符信息,包括HID类描述符及其相关的报告描述符。