USB描述符有以下几种:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符、HID描述符
1、设备描述符
设备描述符描述了USB设备的通用信息。一个USB设备只有一个设备描述符。比较特殊的是, 默认控制管道的数据包的长度(也就是USB设备端点0的长度)是在设备描述符中定义的, 而不像其他端点一样是在端点描述符中定义的。
描述设备速度,走的是USB1.1、USB2.0;设备的PID、VID等信息,设备描述符字段组成如下:
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
设备描述符的字节数大小 |
1 |
bDescriptor Type |
1 |
常数 |
设备描述符类型编号 |
2 |
bcdUSB |
2 |
BCD码 |
USB版本号 |
4 |
bDeviceClass |
1 |
类 |
USB分配的设备类代码 |
5 |
bDeviceSubClass |
1 |
子类 |
USB分配的子类代码 |
6 |
bDeviceProtocol |
1 |
协议 |
USB分配的设备协议代码 |
7 |
BMaxPacketSize0 |
1 |
数字 |
端点0的最大包大小 |
8 |
idVendor |
2 |
ID编号 |
厂商编号 |
10 |
idProduct |
2 |
ID编号 |
产品编号 |
12 |
bcdDevice |
2 |
BCD码 |
设备出厂编号 |
14 |
iManufacturer |
1 |
索引 |
描述厂商字符串的索引 |
15 |
iProduct |
1 |
索引 |
描述产品字符串的索引 |
16 |
iSerialNumber |
1 |
索引 |
描述设备序列号字符串的索引 |
17 |
bNumConfigurations |
1 |
数字 |
可能的配置参数 |
(1)、bLength
这是一个以1字节二进制数为内容的字段。 该字段表示整个设备描述符的字节数大小,而整个设备描述符占用了17个字节, 因此bLength的值是固定的, 就是18, 用十六进制表示就是0x12。
(2)、bDescriptorType
设备描述符的类型,USB定义的设备描述符的类型编号为常数0x01,因此,该字段的值为固定值0x01。
(3)、bcdUSB
BCD码为内容的字段,该字段代表设备所遵循的USB协议的版本号。
如:USB1.1,其bcdUSB值为0x0110
USB2.0,其bcdUSB值为0x0200
一个2字节的数0xABCD, AB为1个字节, CD为另一个字节, 其中AB为版本号的整数部分, C为版本号的第一个小数部分, D为版本号的第二个小数部分。
(4)、bDeviceClass
设备类型的代码,值从0x01~0xFE为USB定义的标准设备类,而值为0xFF时表示该设备类型代码是厂商自定义的类。如果设备类型不是在设备描述符中定义的, 则该值为0, 比如人机接口设备 ( HID) 类。
(5)、bDEviceSubClass
设备类中的子类类型,和bDeviceClass一样由USB规定和分配,当 bDeviceClass为0时, 此值也为0, 代表该子类类型不在设备描述符中定义。 值为0xFF时, 也代表子类类型是由厂商所定义的。
(6)、bDeviceProduct
设备所遵循的协议,该值有USB协议规定,当值为0xFF时,表示该设备采用厂商自己为该类定义的协议。
(7)、bMaxPacketSize0
描述了端点0的最大包的大小, 低速设备的bMaxPacketSize0恒为8, 全速设备可以是一般为 8、16、32或64, 即0x08、0x10、0x20或0x40, 而高速设备则为64。
(8)、idVendor
USB设备的生产厂商从USB开发者论坛(USB Implementers Forum)获得的ID号。
(9)、idProduct
设备的生产厂商所定义的该设备的产品ID号。
(10)、bcdDevice
设备生产厂商来定义, 代表该设备的产品版本号。
(11)、iMenufacturer
设备生产厂商的字符串的索引值。值为0则代表没有使用该字段。
(12)、iProduct
描述该产品的字符串的索引值。值为0时表示没有使用该字段。
(13)、iSerialNumber
设备的序列号的索引值。每个设备都有一个特定的序列号, 可供主机来识别不同的设备。
(14)、bNumConfigurations
该设备总共支持的配置描述符的数量。
Bus hound抓取的设备描述符
2、配置描述符
配置描述符用于描述一个USB设备的属性和能力等配置信息。一个USB设备只需要一个配置描述符就可以了。比如一个USB接口的鼠标,其功能仅仅是简单的双向数据中断传输, 并且是总线供电, 因此按照这些要求来填写一个配置描述符即可。但是, 有些设备如果需要具有几种相对独立的配置(但前提是属于 同一种USB设备类), 比如一个USB接口的ISDN, 就可以有2种配置, 一种配置下建立 64 KB/ s 的双向数据交换通道; 而同时可以有另一种 128 KB/ s 的双向数据通道配置。这样, 这个ISDN就可以根据不同的网络情况来自动选择任一种数据交换方式。配置描述符字段组成如下:
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
设备描述符的字节数大小 |
1 |
bDescriptor Type |
1 |
常数 |
配置描述符类型编号 |
2 |
wTotalLength |
2 |
数字 |
此配置所返回的所有数据大小 |
4 |
bNumInterfaces |
1 |
数字 |
此配置所支持的接口数量 |
5 |
bConfigurationsValue |
1 |
数字 |
Set_Configuration命令需要的参数值 |
6 |
iConfiguration |
1 |
索引 |
描述改配置的字符串的索引值 |
7 |
bmAttributes |
1 |
位图 |
供电模式的选择 |
8 |
MaxPower |
1 |
mA |
设备从总线提取的最大电流 |
(1)、bLedgth
整个配置描述符的长度, 因此bLength是固定的, 值为9, 即0x09, 二进制表示为 00001001。
(2)、bDescriptorType
USB给配置描述符分配的类型编号, 值为常数0x02。
(3)、wTotalLength
该置所返回的所有描述符(包括配置、接口和端点描述符)的大小总和。
(4)、bNumInterfaces
该配置所支持的接口总数。
(5)、bConfigurationValue
该字段的值作为参数, 可被Set_Configuration和 Get_Configuration命令来调用, 用于该命令选定这个配置。
(6)、iConfiguration
该字段指向描述该配置描述符的字符串。 如果该设备没有用字符串描述该配置, 那么此字段为0。
(7)、bmAttributes
该字段1字节二进制数的每一位代表一个固定的含义:
D7:Reserve,固定为1;
D6:供电方式的选择, 值为1表示自供电, 值为0表示总线供电;
D5:远程唤醒功能的选择, 值为1表示支持远程唤醒, 值为0则不支持;
D4~D0:没有意义, 均把值固定为0。
(8)、MaxPower
设备从总线上获取的电流总量。电流值为字段值的两倍,设备可以获取到的最大电流为500mA,所以字段值最大为0xFA;
Bus hound上抓取的配置描述符
3、接口描述符
接口描述符用于描述一个特定接口的属性。接口一般是由一系列端点所组成的集合体,用于实现某种特定的USB的数据传输功能。一般一个USB设备只需具有一个接口。比如,USB移动存储设备中就只有一个用于实现Mass Storage类的接口, 在该接口下使用了批量输入Bulk_IN和批量输出Bulk_OUT 2个非0 端点用于传输文件。接口描述符还可以在配置后加以改变。前面已经提到, 标准的USB设备类型都是在 设备描述符中定义的, 但是有些类是基于接口在接口描述符中定义的, 如HID设备。接口描述符字段组成如下:
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
设备描述符的字节数大小 |
1 |
bDescriptor Type |
1 |
常数 |
接口描述符类型编号 |
2 |
bInterfaceNumber |
1 |
数字 |
该接口的编号 |
3 |
bAlternateSetting |
1 |
数字 |
备用的接口描述符编号 |
4 |
bNumENDpoits |
1 |
数字 |
该接口使用的端点数,不包括端点0 |
5 |
bInterfaceClass |
1 |
类 |
接口类型 |
6 |
bInterfaceSubClass |
1 |
子类 |
接口子类类型 |
7 |
bInterface |
1 |
协议 |
接口遵循的协议 |
8 |
iInterface |
1 |
索引 |
描述该接口的字符串索引值 |
(1)、bLength
整个配置描述符的长度,固定为0x09.
(2)、bDescriptorType
由USB给配置描述符分配的类型编号, 值为常数0x04。
(3)、bInterfaceNumber
接口的编号,如果一个配置拥有N个接口, 那么这些接口都是互不相干的, 每一个接口都有惟一的编号, USB就是通过此字段来识别不同的接口。默认值为0。
(4)、bAlternateSetting
USB设备的配置与USB配置描述符是一一对应的, 即一个配置只能有一个配置描述符。USB允许多个接口描述符来描述同一个接口, 而且这些描述符都可以通过命令来切换。这里,此字段就是每一个这类描述符惟一的编号。USB可以通过调用这个字段来切换描述同一个接口的不同描述符。控制传输中可以通过Get_Interface和Set_Interface来获取、设置目前正在使用的描述一个确定接口的接口描述符的编号。
(5)、bNumEndpoints
该接口使用的端点总数(除端点0之外)。如果此值为0, 则意味着该接口只使用了端点0。
(6)、bInterfaceClass
该接口所属的类别。这个类别编号由USB来分配。当值为0xFF时, 表示该接口是厂商所定义的接口类型。而值0保留。
(7)、bInterfaceSubClass
接口所属的类别中的子类类型。这个子类编号也由USB分配。同bInterfaceClass字段一样, 当其值为0xFF时代表该接口由厂商自己所定义。而值0保留。
(8)、bInterfaceProtocol
此接口类所遵循的类的协议。因而, 该字段的值跟bInterfaceClass和bInterfaceSubClass字段是相关的。其值从1~0xFE由USB分配, 代表不同标准的设备类的协议。 当值为0时, 表示该接口不遵循任何类协议; 而值为0xFF时, 表示该接口应用了厂商自定义的类协议。
(9)、iInterface
指向字符串描述符中相应的字符串内容, 用于描述该接口。 如果设备没有启用字符串描述符 , 则该值为0。
Bus hound中抓取到的接口描述符
4、端点描述符
端点描述符用于描述接口所使用的非0端点的属性, 包括输入/输出方向、端点号和端点容量即包的大小等。端点描述符字段组成如下:
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
设备描述符的字节数大小 |
1 |
bDescriptorType |
1 |
常数 |
端点描述符类型编号 |
2 |
bEndpointAddress |
1 |
端点 |
端点地址及输入输出属性 |
3 |
bmAttributes |
1 |
位图 |
端点传输类型属性 |
4 |
wMaxPacketSize |
2 |
数字 |
端点收、发的最大包的大小 |
5 |
bIterval |
1 |
数字 |
主机查询端点的时间间隔 |
(1)、bLength
这个端点描述符的长度。
(2)、bDescriptorType
USB为端点描述符分配的类型编号, 因此, 此字段的值固定, 即为0x05。
(3)、bEndpointAddress
D7 端点方向
0 OUT端点
1 IN端点
D6~D4 保留
D3~D0 端点编号
(4)、bmAttributes
D5~D4 用途
00 数据端点
01 反馈端点
10 隐式反馈数据端点
11 保留
D3~D2 同步类型
00 非同步
01 异步
10 自适应
11 同步
D1~D0 传输类型
00 控制传输
01 同步传输
10 块传输
11 中断传输
如果该端点不是同步端点,D5~D2保留且必须置0。
(5)、wMaxPacketSize
该端点最大包的大小。其中D10~D0位共11位为有效内容。在USB协议1 .1中D15~D11位保留, 值为0, 且最大包的大小范围为0~1023。
(6)、bIterval
主机轮询设备的周期。在USB协议1.1中, 对于中断端点, 该字段的值为1~255,时间单位ms,因此假设值为250, 则表示时间间隔为250ms; 对于同步端点, 该字段值固定为1 ; 而批量端点和控制端点则忽略该字段 ,值无效。
Bus hound中抓取的端点描述符
5、字符串描述符
字符串描述符是一个可选的描述符,长度不固定。字符串描述符字段组成如下:
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
设备描述符的字节数大小 |
1 |
bDescriptorType |
1 |
常数 |
字符串描述符类型编号 |
2 |
bString |
N |
数字 |
UNICODE编码的字符串 |
(1)、bLength
整个字符串描述符的长度。
(2)、bDescriptorType
USB为端点描述符分配的类型编号, 因此, 此字段的值固定, 即为0x03。
(3)、bString
一个以UNICODE编码的字符为内容的字符串。
Bus hound抓取的字符串描述符
7、HID描述符
bLength: 描述符长度。
bDescriptorType:描述符类型,HID描述符的类型为0x21。
bcdHID: 所遵循的HID协议版本。
bCountryCode: 国家代码。
bNumDescriptors: 下级描述符数量,通常至少需要一个报告描述符。
bDescriptorType: 下级描述符类型,例如报告描述符。
wDescriptorLength: 下级描述符长度。
Bus hound中抓取的HID描述符
总的来说,描述符的作用就是,让主机知道你是什么设备信息(PID、VID、序列号...),跑的是那种速度的协议(USB1.0、USB1.1、USB2.0...),然后给你分配相应的地址。
如有错误或者疑问,请及时提出。谢谢!!!