USB描述符

USB描述符的分类与介绍
USB的符述符分为几类?有人可能会答:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符等。但这里说的不是这样的。上面的几类描述符属于USB标准描述符。另外还有HID描述符和Hub描述符。所以分类是这样的:
1. 标准描述符
1) 设备描述符
2) 配置描述符
3) 字符串描述符
4) 接口描述符
5) 端点描述符
6) 设备限定描述符
7) 其他速率配置描述符
2. HID描述符
3. Hub描述符
1.5 端点描述符
端点描述符用于指出USB端点的特性,包括其所支持的传输类型、传输方向等信息。USB中规定,端点0没有端点描述符,其余端点必须包含端点描述符。端点描述符由6个字段组成,共7个字节。其格式如下:

各字段含义:
? bLength:用于表示端点描述符的长度,固定为7字节,即0x07。
? bDescriptorType:用于表示接口描述符的类型值,固定为0x05。
? bEndpointAddress:用于表示端点的端点号以及端点的数据传输方向。第七位表示端点的数据传输方向,0表示OUT数据传输,1表示IN数据传输;第0~位表示端点号,例如001B表示端点1、010B表示端点2;其余位均保留,必须置0。
? bmAttributes:用于表示端点的特性。其中第0位和第1位表示端点的数据传输类型,00B表示控制传输、01B表示同步传输、10B表示块传输、11B表示中断传输;如果是同步传输,第2位和第3位表示同步类型,00B表示非同步、01B表示异步、10B表示自适应、11B表示同步;第4、5位表示端点的用法类型,00B表示数据端点、01B表示显示反馈端点、10B表示隐匿反馈端点、11B保留。其余位保留。
? wMaxPacketSize:用于表示端点所支持最大数据包的长度。其中第0~10位表示数据包的长度,第11位和12位指出每小帧最多传输的事务数,其余位均保留,必须置0。
? bInterval:用于指定端点数据传输的访问间隔。低速中断端点,取值范围为10~255,对应的访问间隔为10~255ms;对于全速中断端点,取值范围为1~255,对应的访问间隔为1~255ms;对于其他端点,可以参阅USB相关协议。 1.6 设备限定描述符
设备限定描述符用于指定另一传输速率下该设备的总体信息,如果高速USB设备既需要采用高速传输又需要全速传输,则它必须支持设备限定描述符(Device_Qualifier)。设备限定描述符包含9个字段,长度固定为10个字节。其格式如下:

各字段含义:
? bLength:用于表示设备限定描述符的长度,为固定值0x0a。
? bDescriptorType:用于表示设备限定描述符的类型值,固定为0x06。
? bcdUSB:用于表示USB设备及其描述符所遵循的USB规范版本,以BCD码的形式表示,其值必须在版本2.0以上。
? bDeviceClass:用于表示USB设备所属的设备类。该字段值在1~0xFE之间的时候,表示为USB定义的某个设备类,如0x03表示HID设备类。当为0时,表示USB设备的各个接口互相独立,分别属于不同的设备类,在接口描述符中会进一步说明。当为0xFF时,表示该设备为供应商自定义的。
? bDeviceSubClass:用于表示USB设备所采用的设备类协议,它对USB设备类进行了更详细的定义。例如,对于前面的HID设备类,只有一个子类代码0x01。而对于显示设备类(0x04)子类代码0x01表示CRT显示器、0X02表示平面显示器、0x03表示3D显示器。当bDeviceClass=0时,该字段也必须为0;当该字段为0xFF时,表示由供应商自定义的设备子类。
? bDeviceProtocol:用于表示USB设备所采用的设备类协议,其值和bDeviceClass及bDevcieSubClass的值有关。当该字段为0时,表示不使用任何设备协议。如果该USB设备属于某个设备类和设备子类,则应该继续指明所采用的设备类协议。当该字段为0xFF时,表示由供应商自定义设备类协议。
? bMaxPacketSize0:用于表示USB设备端点0支持最大数据包的长度,它以字节为单位。对于低速USB设备,bMaxPacketSize0为8,对于全速USB设备,bMaxPacketSize0为8、16、32或64;对于高速USB设备bMaxPacketSize0为64。
? bNumConfigurations:表示USB设备另一个速率所支持的配置数。
? bReserved:保留项,要置0。 1.7 其他速率配置描述符
其他速率配置描述符用于指定另一传输速率下该设备的配置信息,如果高速USB设备既需要采用高速传输又需要全速传输,则它必须支持其他速率配置描述符。其他速率配置描述符包含8个字段,长度固定为9个字节。其格式如下:

各字段含义:
? bLength:描述符的长度,固定为0x09。
? bDescriptorType:描述符类型,固定为0x07。
? wTotalLength:用于表示其他速率配置信息的总长度,包括配置描述符、接口描述符、端点描述符、设备类定义描述符和供应商自定义描述符的总和。
? bNumInterfaces:用于表示其他速率配置所支持的接口数。
? bConfigurationValue:用于表示其他速率配置值。
? iConfiguration:用于指出配置字符串描述符的索引值,具体字符串的内容在字符串描述符中定义。如果没有配置字符串,可以置0。
? bmAttributes:用于表示配置特性。它量按位寻址的,第6位置1表示使用总线电源;第5位置1表示支持远程唤醒功能;该字段的其他位均保留,一般来说,第0~4位应该置0,第7位应该置1。 ? bMaxPower:用于表示USB设备运行时所需要消耗的总线电流,单位以2mA为基准。USB设备可以从USB总线上获得最大电流为500mA,因此该字段的最大值为250。

2 HID描述符
USB设备中有一大类就是HID设备,即Human Interface Devices,人机接口设备。这类设备包括鼠标、键盘等,主要用于人与计算机进行交互。它是USB协议最早支持的一种设备类。HID设备可以作为低速、全速、高速设备用。由于HID设备要求用户输入能得到及时响应,故其传输方式通常采用中断方式。
在USB协议中,HID设备的定义放置在接口描述符中,USB的设备描述符和配置描述符中不包含HID设备的信息。因此,对于某些特定的HID设备,可以定义多个接口,只有其中一个接口为HID设备类即可。
当定义一个设备为HID设备时,其设备描述符应为:

其接口描述符应该: bInterfaceClass=0x03
另外(接口描述符):
对无引导的HID设备,子类代码bInterfaceSubClass应置0,此时bInterfaceProtocol无效,置零即可。即为:
bInterfaceClass=0x03
bInterfaceSubClass=0
bInterfaceProtocol=0
对支持引导的USB设备,子类代码bInterfaceSubClass应置1,此时bInterfaceProtocol可以为1或2,1表示键盘接口,3表示鼠标接口。其参考设置如下:
bInterfaceClass=0x03
bInterfaceSubClass=1
bInterfaceProtocol=1或2
HID设备支持USB标准描述符中的五个:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符。除此之外,HID设备还有三种特殊的描述符:HID描述符、报告描述符、物理描述符。一个USB设备只能支持一个HID描述符,但可以支持多个报告描述符,而物理描述符则可以有也可以没有。
2.1 HID描述符
HID描述符用于识别HID设备中所包含的额外描述符,例如报告描述符或物理描述符等。其格式如下:

各字段含义: bLength:HID描述符长度。
bDescriptorType:HID描述符类型,值为0x21。
bcdHID:HID设备所遵循的HID版本号,为4位16进制的BCD码数据。1.0即0x0100,1.1即0x0101,2.0即0x0200。
bCountryCode:HID设备国家/地区代码。
bNumDescriptor:HID设备支持的其他设备描述符的数量。由于HID设备至少需要包括一个报告描述符,故其值至小为0x01。
bDescriptorType:HID描述符附属的类别描述符长度。
bDescriptorType/wDescriptorLength:可选字段,用于表示HID描述符附属的类别描述符类型及长度。
2.2 报告描述符
HID设备的报告描述符是一种数据报表,主要用于定义HID设备和USB主机之间的数据交换格式,HID设备报告描述符的类型值为0x22。
报告描述符使用自定义的数据结构,用于传输特定的数据包。例如对于键盘,需要在数据包中指明按键的值,报告描述符把这些数据打包发给主机,主机对发来的数据进行处理。它有四个组成部分,其格式如下:

各字段含义:
bSize:占用两个位,指示数据部分,即[data]字段的长度,00b?表没有数据字节,01b?表只有一个数据字节,10b表示有两个数据字节,11b表有4个数据字节。
bType:数据项类型,用于指明数据项的类型。00b?主数据类型,01b?全局数据类型,10b?局部数据类型,11b?保留。
bTag:数据项标签,用于指明数据项的功能。报告描述符需要包含的数据项标签有:输入输出数据项标签、用法数据项标签、用法页数据项标签、逻辑最小和最大值数据项标签、报告大小数据项标签以及报告计数数据项标签。
[data]:数据字节,随着前面bSize定义的大小而变化。 2.3 物理描述符
【USB描述符】 HID设备的物理描述符主要用于报告物理设备的激活信息,其类型值为0x23,它是可选的,对大部分设备不需要使用此描述符。

    推荐阅读