转自 https://blog.csdn.net/hushiganghu/article/details/54929066
USB 设备第一次连接到主机时, 要接收主机枚举( Enumera tion) 和配置(Configuration) , 目的是让主机知道设备功能、是哪一类的USB 设备、占用多少资源、使用了哪些传输方式以及传输的数据量等等。只有主机完全确认了这些信息后, 设备才能真正开始工作。这些信息是通过存储在设备中的USB 描述符来体现的。因此, 这种USB 描述符也可以看作是USB 设备的身份证明。
capter9.6
描述符(Descriptor )
描述符(Descriptor )是一个完整的数据结构, 存储在USB 设备中, 用于描述一个USB 设备的所有属性。USB主机通过一系列命令要求设备发送这些信息。
USB 设备的属性包括很多内容, 为了便于管理, USB2.0协议将这些信息做了分类, 定义了多种描述符,包括标准和HID类的描述符,下面是标准描述符描述。
标准描述符
标准描述符 |
bDescriptorType字段 |
设备描述符(Device Descriptor) |
0x01 |
配置描述符(Configuration Descriptor) |
0x02 |
字符串描述符(String Descriptor,可选) |
0x03 |
接口描述符(Interface Descriptor) |
0x04 |
端点描述符(Endpoint Descriptor) |
0x05 |
设备限定描述符(DEVICE_QUALIFIER) |
0x06 |
其他速率配置描述符(OTHER_SPEED_CONFIGURATION) |
0x07 |
接口功率描述符(INTERFACE_POWER) |
0x08 |
描述符间的关系
一个设备有且只能有一个设备描述符,之后的描述符都允许有多个不同的描述符。
字段格式
每个描述符都是由一系列字段( Field , 为了与组成包的域相区别, 这里叫做字段) 所组成的,每个字段开头小写字母表示了该字段使用的数据格式,
首位小写字母 |
意义 |
b。。 |
1 字节Byte |
w。。 |
16 位的2 字节二进制(Word ) |
bm。。 |
位图(Bit Map ) |
bcd。。 |
BCD 码 |
i。。 |
索引( Index) |
id。。 |
标识( Identifier ) |
标准描述符
- 每一个设备有且只有一个设备描述符
- 默认控制管道的数据包的长度( 端点0长度)是在设备描述符中定义, 而不像其他端点在端点描述符中定义。
- 14 个字段,18 Byte
偏移量 |
字段名称 |
长度(Byte) |
字段值 |
意义 |
0 |
bLength |
1 |
0x12 |
设备描述符的字节数大小 |
1 |
bDescriptorType |
1 |
0x01 |
设备描述符类型编号 |
2 |
bcdUSB |
2 |
协议版本2.31其值就是0x0231 |
USB版本号 |
4 |
bDeviceClass |
1 |
类 |
USB分配设备类代码(1-FE)FF为厂商自定义 |
5 |
bDeviceSubClass |
1 |
子类 |
USB分配子类代码 |
6 |
bDeviceProtocol |
2 |
协议 |
USB分配设备协议代码 |
7 |
bMa xPack et Size0 |
1 |
控制传输端点0包大小 |
端点0最大包大小 |
8 |
idVendor |
2 |
ID编号 |
厂商编号 |
10 |
idProduct |
2 |
ID编号 |
产品编号 |
12 |
bcdDevice |
2 |
BCD码 |
设备出厂编号 |
14 |
iManufacturer |
1 |
索引 |
描述厂商字符串索引 |
15 |
iProduct |
1 |
索引 |
描述产品字符串的索引 |
16 |
iSerialNumber |
1 |
索引 |
描述设备序列号字符串的索引 |
17 |
b NumConf igur at ions |
1 |
配置描述符个数 |
可能配置数量 |
编号 |
类名称 |
设备描述符bDeviceClass |
设备描述符bDeviceSubClass |
接口描述符bInterfaceClass |
接口描述符bInterfaceSubClass |
1 |
音频类 |
0x00 |
0x00 |
0x01 |
— |
2 |
通信类 |
0x02 |
— |
— |
— |
3 |
通信设备控制类 |
0x00 |
0x00 |
0x02 |
— |
4 |
人机接口设备(HID)类 |
0x00 |
0x00 |
0x03 |
— |
5 |
物理接口类 |
0x00 |
0x00 |
0x05 |
— |
6 |
图像类 |
0x00 |
0x00 |
0x06 |
0x01 |
7 |
打印机类 |
0x00 |
0x00 |
0x07 |
— |
8 |
大容量存储(MassStorage)类 |
0x00 |
0x00 |
0x08 |
— |
9 |
集线器(Hub)类 |
0x09 |
— |
0x09 |
— |
10 |
通信设备数据类 |
0x00 |
0x00 |
0x0A |
— |
11 |
芯片/智能卡类 |
0x00 |
0x00 |
0x0B |
— |
12 |
加密类 |
0x00 |
0x00 |
0x0D |
— |
13 |
诊断设备类(可编程子类) |
0xDC |
0x01 |
0xDC |
0x01 |
14 |
无线控制器类(红外RF控制器子类) |
0xE0 |
0x01 |
0xE0 |
0x01 |
15 |
特殊应用类(设备固件升级子类) |
0x00 |
0x00 |
0xFE |
0x01 |
16 |
特殊应用类(IrDA桥子类) |
0x00 |
0x00 |
0xFE |
0x02 |
17 |
特殊应用类(测试和测量子类USBTMC) |
0x00 |
0x00 |
0xFE |
0x03 |
18 |
厂商定义类 |
0xFF |
0xFF |
0xFF |
0xFF |
配置描述符(Configuration Descriptor) |
- 8 个字段,9Byte
- bmAttributes字段:D7保留值, 固定为1 ; D6表示供电方式, 1表示自供电, 0表示总线供电; D5,值为1 表示支持远程唤醒, 值为0 则不支持;D4~D0没有意义, 固定为0。
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
0x09 |
配置描述符的字节数大小 |
1 |
bDescriptorType |
1 |
0x02 |
配置描述符类型编号 |
2 |
wTotalLength |
2 |
数字 |
这是一个以2 字节二进制数为内容的字段。该字段表示该配置所返回的所有描述符( 包括配置、接口和端点描述符) 的大小总和。 |
4 |
bNumInterfaces |
1 |
接口描述符个数 |
此配置所支持的接口数量 |
5 |
bConfigurationValue |
1 |
数字 |
Set_Configuration /Get_Configuration命令需要的参数值 |
6 |
iConfiguration |
1 |
索引 |
描述该配置的字符串的索引值 |
7 |
bmAttributes |
1 |
位图 |
供电模式的选择,第7位D7保留固定为1;D6值为1表示自供电,值为0表示总线供电; D5值为1表示支持远程唤醒,值为0则不支持;D4~D0没有意义固定为0 |
8 |
MaxPower |
1 |
字段值*2(mA) |
设备从总线提取的最大电流(<=500mA) |
接口描述符(Interface Descriptor) |
- 9 个字段,共9 字节
- 只能作为配置描述符的一部分返回,不能用GetDescriptor()或SetDescriptor()直接访问。
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
0x09 |
接口描述符的字节数大小 |
1 |
bDescriptorType |
1 |
0x04 |
接口描述符类型编号 |
2 |
bInterfaceNumber |
1 |
数字 |
该接口编号 |
3 |
bAlternateSetting |
1 |
数字 |
|
4 |
bNumEndpoints |
1 |
如果为0则说明只用了端点0 |
该接口使用的端点数 ,不包括端点0 |
5 |
bInterfaceClass |
1 |
类 |
接口类型 |
6 |
bInterfaceSubClass |
1 |
子类 |
接口子类类型 |
7 |
bInterfaceProtocol |
1 |
协议 |
接口遵循的协议 |
8 |
iInterface |
1 |
索引 |
描述该接口的字符串索引值 |
- bInterfaceNumber:如果一个配置拥有N个接口, 那么这些接口都是互不相干的, 每一个接口都有惟一的编号, USB 就是通过此字段来识别不同的接口。默认值为0。
- bAlternateSetting:USB设备配置与USB配置描述符是一一对应的, 即一个配置只能有一个配置描述符。虽然由bInterfaceNumber字段可知, 每一个接口都有一个惟一确定的接口编号, 但是一个接口却可以由不只一个接口描述符来描述它。USB 允许多个接口描述符来描述同一个接口, 且这些描述符都可通过命令切换。此字段就是每一个这类描述符惟一的编号。USB可通过调用这个字段来切换描述同一个接口的不同描述符。控制传输中的Get_Inter face 命令可以用来得到目前正在使用的描述一个确定接口的接口描述符的编号, 即此字段。而Set_Inte rface 命令则以此字段值为参数, 用来使相应的接口描述符描述某个确定的接口
端点描述符(Endpoint Descriptor) |
用于接口的每个端点都有自己的描述符。 此描述符包含信息
需要主机确定每个端点的带宽要求。 端点描述符为始终由GetDescriptor(获取配置描述符),作为配置信息的一部分返回。 端点描述符不能直接用GetDescriptor()或SetDescriptor()直接访问。对于端点零,不存在端点描述符。
- 6 个字段共7 字节
- 描述接口所使用的非0 端点的属性, 包括输入/ 输出方向、端点号和端点容量即包的大小等
偏移量 |
字段名称 |
长度(字节) |
|
字段值 |
意义 |
0 |
bLength |
1 |
0x07 |
端点描述符的字节数大小 |
|
1 |
bDescriptorType |
1 |
0x05 |
端点描述符类型编号 |
|
2 |
bEndpointAddress |
1 |
端点 |
端点地址及输入输出属性 |
|
3 |
bmAttributes |
1 |
位图 |
端点的传输类型属性 |
|
4 |
wMaxPacketSize |
2 |
数字 |
端点收、发的最大包的大小 |
|
6 |
bInterval |
1 |
数字 |
主机查询端点的时间间隔 |
|
- bEndpointAddress:D3 ~D0 位共4 位表示该端点的端点号; D7为该端点方向控制位, D7为1输出OU T 端点, 当D70输入IN 端点。D6~D4 位保留, 固定值为0
- bmAttributes:D1 和D0表示该端点传输类型。D1 、D0值为00时表示控制传输; 为01时表示同步传输; 为10时表示批量传输;为11时则表示中断传输。D2到D5如果不是isochronous设置为0,如果是
- Bits 3..2: Synchronization Type
00 = No Synchronization
01 = Asynchronous
10 = Adaptive
11 = Synchronous
Bits 5..4: Usage Type
00 = Data endpoint
01 = Feedback endpoint
10 = Implicit feedback Data endpoint
11 = Reserved
- wMaxPacketSize:表示该端点最大包大小。其中D10~D0 位共11 位为有效内容。在USB 协议1 .1 中D15 ~D11 位保留, 值为0 , 且最大包的大小范围为0~1 023。2.0协议D11.12用于高速和同步传输。
- bInterval:主机轮询设备的周期。单位时间为1ms或125us
- 全速/高速同步端点,值为1-16,2^(bInterval-1)
- 全速/低速中断端点,值为1-255
- 高速中断端点,值为1-16,2^(bInterval-1)
- 高速批量和控制端点,值为0-255。
字符串描述符(String Descriptor,可选) |
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
字符串描述符的字节数大小 |
1 |
bDescriptorType |
1 |
0x03 |
字符串描述符类型编号 |
2 |
bStringN |
数字 |
UNICODE |
编码的字符串 |
设备限定描述符(DEVICE_QUALIFIER) |
同时支持全速与高速的设备,必须有一个device_qualifier描述符。当设备转换速度的时候,设备描述符中的某些字段可能改变。Device_qualifier描述符储存当前不适用的速度的字段数值。设备描述符与device_qualifier描述符中的字段数值,视所选择的速度来做交替。
位移 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
0x0A |
描述符大小(字节) |
1 |
bDescriptorType |
1 |
0x06 |
描述符类型编号 |
2 |
bcdUSB |
2 |
BCD |
USB规范版本号(例如, 0200 h V2.00) |
4 |
bDeviceClass |
1 |
类别 |
类别码 |
5 |
bDeviceSubclass |
1 |
子类别 |
子类别码 |
6 |
bDeviceProtocol |
1 |
协议 |
协议码 |
7 |
bMaxPacketSize(0) |
1 |
数字 |
最大数据包大小 |
8 |
bNumConfigurations |
1 |
数字 |
可能配置的数目 |
9 |
Reserved |
1 |
0 |
保留 |
其他速率配置描述符(OTHER_SPEED_CONFIGURATION) |
位移 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
0x09 |
描述符大小(字节) |
1 |
bDescriptorType |
1 |
0x08 |
other_speed_configuration(07h) |
2 |
wTotalLength |
2 |
数字 |
此配置传回的所有数据大小(字节) |
4 |
bNumInterfaces |
1 |
数字 |
此配置支持的接口数目 |
5 |
bConfigurationValue |
1 |
数字 |
Set_configuration与get_configuration要求的标识符 |
6 |
iConfigurtion |
1 |
索引值 |
此配置的字符串描述符的索引值 |
7 |
bmAuributes |
1 |
位图 |
自身电源/总线电源以及远程唤醒设置 |
8 |
MaxPower |
1 |
mA |
需要总线电源,标识法为(最大mA/2) |