USB 配置描述符
2020-10-31
19243
424
配置描述符定义了设备的配置信息,一个设备可以有多个配置描述符。
大部分的USB设备只有一个配置描这符,设备存在多个配置描述符时.
配置描述符指定设备的供电方式、最大功耗是多少、它拥有的接口数量。因此,可以有两种配置,一种用于设备由总线供电时,另一种用于设备供电时。由于这是接口描述符的“头”,因此使一种配置使用与另一种配置不同的传输模式也是可行的。
一旦主机检查了所有配置,主机将发送具有非零值的 SetConfiguration 命令,该值与其中一个配置的bConfigurationValue 匹配。这用于选择所需的配置。
读取配置描述符时,它会返回整个配置层次结构,其中包括所有相关的接口和端点描述符。wTotalLength字段反映配置描述符层次结构中的字节数。
配置描述符在USB设备的枚举过程中,需要获取两次:
第一次只获取配置描述符的基本长度9字节,获取后从wTotalLength字节中解析出配置描述符的总长度,然后再次获取全部的描述符。
配置描述符定义
struct _CONFIGURATION_DESCRIPTOR_STRUCT
{
BYTE bLength; //配置描述符的字节数大小,固定为9字节
BYTE bDescriptorType; //描述符类型编号,为0x02
WORD wTotalLength; //配置所返回的所有数量的大小
BYTE bNumInterface; //此配置所支持的接口数量
BYTE bConfigurationVale; //Set_Configuration命令需要的参数值
BYTE iConfiguration; //描述该配置的字符串的索引值
BYTE bmAttribute; //供电模式的选择
BYTE MaxPower; //设备从总线提取的最大电流
}CONFIGURATION_DESCRIPTOR_STRUCT
- bLength : 描述符大小.固定为0x09.
- bDescriptorType : 配置描述符类型.固定为0x02.
- wTotalLength : 返回整个数据的长度.指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小.
- bNumInterfaces : 配置所支持的接口数.指该配置配备的接口数量,也表示该配置下接口描述符数量.
- bConfigurationValue : 作为Set Configuration的一个参数选择配置值.
- iConfiguration : 用于描述该配置字符串描述符的索引.
- bmAttributes : 供电模式选择.Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒.
- MaxPower : 总线供电的USB设备的最大消耗电流.以2mA为单位.
- 接口描述符:接口描述符说明了接口所提供的配置,一个配置所拥有的接口数量通过配置描述符的bNumInterfaces决定。
windbg查看某USB移动硬盘配置描述符示例:
1: kd> dt _USB_CONFIGURATION_DESCRIPTOR 0xffffbe09`4652cfd0
xxx!_USB_CONFIGURATION_DESCRIPTOR
+0x000 bLength : 0x9 ''
+0x001 bDescriptorType : 0x2 ''
+0x002 wTotalLength : 0x29
+0x004 bNumInterfaces : 0x1 '' 接口数量
+0x005 bConfigurationValue : 0x1 ''
+0x006 iConfiguration : 0xfa ''
+0x007 bmAttributes : 0xc0 ''
+0x008 MaxPower : 0 ''
通过USBView获取logitech鼠标配置描述符:
可以看到既有配置描述符,也有接口描述符和端点描述符.
---===>Full Configuration Descriptor<===---
===>Configuration Descriptor<===
bLength: 0x09
bDescriptorType: 0x02
wTotalLength: 0x0055 -> Validated
bNumInterfaces: 0x01
bConfigurationValue: 0x01
iConfiguration: 0x00
bmAttributes: 0x80 -> Bus Powered
MaxPower: 0xFA = 500 mA
===>Interface Descriptor<===
bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x00
bAlternateSetting: 0x00
bNumEndpoints: 0x02
bInterfaceClass: 0x08 -> This is a Mass Storage USB Device Interface Class
bInterfaceSubClass: 0x06
bInterfaceProtocol: 0x50
iInterface: 0x00
===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x81 -> Direction: IN - EndpointID: 1
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
bInterval: 0x00
===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x02 -> Direction: OUT - EndpointID: 2
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
bInterval: 0x00
===>Interface Descriptor<===
bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x00
bAlternateSetting: 0x01
bNumEndpoints: 0x04
bInterfaceClass: 0x08 -> This is a Mass Storage USB Device Interface Class
bInterfaceSubClass: 0x06
bInterfaceProtocol: 0x62
iInterface: 0x00
===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x81 -> Direction: IN - EndpointID: 1
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
bInterval: 0x00
-> This is a Mass Storage USB Device Interface Class
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936