从零开始学USB(十、USB的描述符)

USB设备使用描述符报告其属性。描述符是具有定义格式的数据结构。每个描述符都以字节宽度字段开头,该字段包含描述符中的总字节数,后跟一个标识描述符类型的字节宽度字段。

使用描述符允许简单地存储各个配置的属性,因为每个配置可以重用具有相同特征的其他配置的描述符或描述符的部分。以这种方式,描述符类似于关系数据库中的各个数据记录。

适当时,描述符包含对字符串描述符的引用,这些字符串描述符提供以可读形式描述描述符的可显示信息。包含字符串描述符是可选的。但是,描述符中的引用字段是必需的。如果设备不支持字符串描述符,则必须将字符串引用字段重置为零,以指示没有可用的字符串描述符。

如果描述符返回的长度字段中的值小于此规范定义的值,则描述符无效,应由主机拒绝。如果描述符返回的长度字段中的值大于此规范定义的值,则主机将忽略额外的字节,但使用返回的长度而不是预期的长度来定位下一个描述符。

设备可以通过两种方式返回特定于类或特定于供应商的描述符:

  • 如果类或供应商特定描述符使用与标准描述符相同的格式(例如,以长度字节开头并后跟类型字节),则必须在GetDescriptor返回的配置信息中将它们与标准描述符交错返回(配置)请求。在这种情况下,类或特定于供应商的描述符必须遵循它们修改或扩展的相关标准描述符。
  • 如果类或供应商特定描述符独立于配置信息或使用非标准格式,则可以使用指定类或供应商特定描述符类型和索引的GetDescriptor()请求来从设备检索描述符。类或供应商规范将定义检索这些描述符的适当方法。

下图是USB2.0规范中规定的8种描述符。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70

在USB3.0中在2.0的基础上又增加了6种描述符

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 1

一、设备描述符(device)

设备描述符描述有关USB设备的一般信息。它包括信息全局适用于设备和所有设备的配置。 USB设备只有一个设备描述符。
具有SuperSpeed功能的设备的DEVICE描述符的版本号为3.0(0300H)。

bcdUSB字段包含BCD版本号。 bcdUSB字段的值为0xJJMN版本JJ.M.N(JJ - 主要版本号,M - 次要版本号,N - 次要版本
例如,版本2.1.3用值0x0213表示,版本3.0用a表示值0x0300。

bNumConfigurations字段指示当前操作速度下的配置数。其他运行速度的配置不包括在计数中。如果设备具有特定速度的特定配置,则bNumConfigurations字段仅反映单个速度的配置数,而不是两个速度的配置总数。

如果设备高速运行,则bMaxPacketSize0字段必须为64,表示64字节最大包。高速操作不允许控制的其他最大数据包大小端点(端点0)。

所有USB设备都有一个默认控制管道。 设备描述符中描述了设备的默认控制管道的最大数据包大小。 配置描述符中描述了特定于配置及其接口的端点。 配置及其接口不包括默认控制管道的端点描述符。 除最大数据包大小外,默认控制管道的特性由本规范定义,并且对于所有USB设备都是相同的。
bNumConfigurations字段标识设备支持的配置数。 表9-8显示标准设备描述符。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 3

  设备描述符给出了USB设备的一般信息,包括对设备及在设备配置中起全程作用的信息,包括制造商标识号ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描述符的个数等。一个USB设备必须有且仅有一个设备描述符。设备描述符是设备连接到总线上时USB主机所读取的第一个描述符,它包含了14个字段,结构如下:
















































































































USB设备描述符的结构

偏移量

大小

描述

0

bLength

1

数字

此描述表的字节数

1

bDecriptorType

1

常量

描述符的类型(此处应为0x01,即设备描述符)

2

bcdUSB

2

BCD码

此设备与描述表兼容的USB设备说明版本号(BCD 码)

4

bDeviceClass

1

设备类码:
如果此域的值为0则一个设置下每个接口指出它自己的类,各个接口各自独立工作。 
如果此域的值处于1~FEH之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了这些接口集体的类定义。 
如果此域设为FFH,则此设备的类由厂商定义。

5

bDeviceSubClass

1

子类

子类掩码 
这些码值的具体含义根据bDeviceClass 域来看。 
如bDeviceClass 域为零,此域也须为零 
如bDeviceClass 域为FFH,此域的所有值保留。

6

bDevicePortocol

1

协议

协议码 
这些码的值视bDeviceClass 和 bDeviceSubClass 的值而定。 
如果设备支持设备类相关的协议,此码标志了设备类的值。如果此域的值为零,则此设备不支持设备类相关的协议,然而,可能它的接口支持设备类相关的协议。如果此域的值为FFH,此设备使用厂商定义的协议。

7

bMaxPacketSize0

1

数字

端点0的最大包大小(仅8,16,32,64
为合法值)

8

idVendor

2

ID

厂商标志(由USB-IF组织赋值)

10

idProduct

2

ID

产品标志(由厂商赋值)

12

bcdDevice

2

BCD 码

设备发行号(BCD 码)

14

iManufacturer

1

索引

描述厂商信息的字符串描述符的索引值。

15

iProduct

1

索引

描述产品信息的字串描述符的索引值。

16

iSerialNumber

1

索引

描述设备序列号信息的字串描述符的索引值。

17

bNumConfigurations

1

数字

可能的配置描述符数目

其中bDescriptorType为描述符的类型,其含义可查下表(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义):















































USB描述符的类型值

类型 描述符 描述符值
标准描述符 设备描述符(Device Descriptor) 0x01
配置描述符(Configuration Descriptor) 0x02
字符串描述符(String Descriptor) 0x03
接口描述符(Interface Descriptor) 0x04
端点描述符(EndPont Descriptor) 0x05
类描述符 集线器类描述符(Hub Descriptor) 0x29
人机接口类描述符(HID) 0x21
厂商定义的描述符   0xFF

设备类代码bDeviceClass可查下表:










































设备的类别(bDeviceClass)

值(十进制)

值(十六进制)

说明

0

0x00

接口描述符中提供类的值

2

0x02

通信类

9

0x09

集线器类

220

0xDC

用于诊断用途的设备类

224

0xE0

无线通信设备类

255

0xFF

厂商定义的设备类

在linux系统中对设备描述符的表示如下。

  1. /* USB_DT_DEVICE: Device descriptor */
  2. struct usb_device_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __le16 bcdUSB;
  6. __u8 bDeviceClass;
  7. __u8 bDeviceSubClass;
  8. __u8 bDeviceProtocol;
  9. __u8 bMaxPacketSize0;
  10. __le16 idVendor;
  11. __le16 idProduct;
  12. __le16 bcdDevice;
  13. __u8 iManufacturer;
  14. __u8 iProduct;
  15. __u8 iSerialNumber;
  16. __u8 bNumConfigurations;
  17. } __attribute__ ((packed));

可以看到,linux系统中对USB设备描述符的表示和协议完全一致。(包括命名)

二、配置描述符(configuration)

配置描述符描述有关特定设备配置的信息。该描述符包含bConfigurationValue字段,该字段的值在用作SetConfiguration()请求的参数时,使设备采用所描述的配置。

描述符描述了配置提供的接口数量。每个接口可以独立运行。例如,ISDN设备可能配置有两个接口,每个接口提供64 Kb / s双向信道,在主机上具有单独的数据源或接收器。另一种配置可能将ISDN设备作为单个接口,将两个信道绑定到一个128 Kb / s双向信道。

当主机请求配置描述符时,将返回所有相关的接口和端点描述符。

USB设备具有一个或多个配置描述符。 每个配置都有一个或多个接口,每个接口都有零个或多个端点。 除非端点由同一接口的备用设置使用,否则端点不会在单个配置中的接口之间共享。 端点可以在不受此限制的不同配置的一部分的接口之间共享。

配置完成后,设备可能会对配置进行有限的调整。 如果特定接口有备用设置,可在配置后选择备用。

表9-10显示了该标准配置描述符。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 4

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 5






































































USB配置描述符的结构

   偏移量

     域

 大小

   值

   描述

      0

bLength

1

   数字

此描述表的字节数长度。

      1

bDescriptorType

1

   常量

配置描述表类型(此处为0x02)

      2

wTotalLength

2

   数字

此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述符)

      4

bNumInterfaces

1

   数字

此配置所支持的接口个数

      5

bCongfigurationValue

1

   数字

在SetConfiguration()请求中用作参数来选定此配置。

      6

iConfiguration

1

   索引

描述此配置的字串描述表索引

      7

bmAttributes

1

   位图

配置特性: 
D7: 保留(设为一) 
D6: 自给电源 
D5: 远程唤醒 
D4..0:保留(设为一) 
一个既用总线电源又有自给电源的设备会在MaxPower域指出需要从总线取的电量。并设置D6为一。运行时期的实际电源模式可由GetStatus(DEVICE) 请求得到。

      8

MaxPower

1

    mA

在此配置下的总线电源耗费量。以 2mA 为一个单位。

  1. /* USB_DT_CONFIG: Configuration descriptor information.
  2. *
  3. * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the
  4. * descriptor type is different. Highspeed-capable devices can look
  5. * different depending on what speed they're currently running. Only
  6. * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG
  7. * descriptors.
  8. */
  9. struct usb_config_descriptor {
  10. __u8 bLength;
  11. __u8 bDescriptorType;
  12. __le16 wTotalLength;
  13. __u8 bNumInterfaces;
  14. __u8 bConfigurationValue;
  15. __u8 iConfiguration;
  16. __u8 bmAttributes;
  17. __u8 bMaxPower;
  18. } __attribute__ ((packed));

三、字符串描述符(string)

字符串描述符是可选的。如果设备不支持字符串描述符,则必须将对设备,配置和接口描述符中的字符串描述符的所有引用重置为零。

字符串描述符使用由Unicode标准,全球字符编码,版本3.0,Unicode联盟,Addison-Wesley Publishing Company,Reading,Massachusetts(URL:http://www.unicode.com)定义的UNICODE编码。 USB设备中的字符串可能支持多种语言。请求字符串描述符时,请求者使用USB-IF定义的16位语言ID(LANGID)指定所需的语言。可以在http://www.usb.org/developers/docs.html上找到当前定义的USB LANGID列表。所有语言的字符串索引零都返回一个字符串描述符,该描述符包含设备支持的双字节LANGID代码数组。表9-15显示了LANGID代码数组。 USB设备可以省略所有字符串描述符。省略所有字符串描述符的USB设备不得返回LANGID代码数组。
LANGID代码数组不以NULL结尾。通过从描述符的第一个字节的值中减去两个来计算数组的大小(以字节为单位)。

 字符串描述符是一种可选的USB标准描述符,描述了如制商、设备名称或序列号等信息。如果一个设备无字符串描述符,则其它描述符中与字符串有关的索引值都必须为0。字符串使用的是Unicode编码。

  主机请示得到某个字符串描述符时一般分成两步:首先主机向设备发出USB标准命令Get_Descriptor,其中所使用的字符串的索引值为0,设备返回一个字符串描述符,此描述符的结构如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 6

















































USB字符串描述符(响应主机请求时返回的表示语言ID的字符串描述符)

偏移量

大小

     描述

0

bLength

1

N+2

此描述表的字节数

1

bDescriptorType

1

常量

字串描述表类型(此处应为0x03)

2

wLANGID[0]

2

数字

语言标识(LANGID) 
码0

      

N

wLANGID[x]

2

数字

语言标识(LANGID) 
码X

该字符串描述符双字节的语言ID的数组,wLANGID[0]~wLANGID[x]指明了设备支持的语言,具体含义可查看USB_LANGIDs.pdf。

  主机根据自己需要的语言,再次向设备发出USB标准命令Get_Descriptor,指明所要求得到的字符串的索引值和语言。这次设备所返回的是Unicode编号的字符串描述符,其结构如下:

UNICODE字符串描述符(如表9-16所示)不以NULL结尾。 字符串长度是通过从描述符的第一个字节的值中减去2来计算。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 7



































Unicode字符串描述符(响应主机请求时真正表示字符串编码的字符串描述符)

偏移量

大小

描述

0

bLength

1

数字

此描述表的字节数(bString域的数值N+2)

1

bDescriptorType

1

常量

字串描述表类型(此处应为0x03)

2

bString

N

数字

UNICODE 编码的字串

  1. /* USB_DT_STRING: String descriptor */
  2. struct usb_string_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __le16 wData[ 1]; /* UTF-16LE encoded */
  6. } __attribute__ ((packed));
  7. /* note that "string" zero is special, it holds language codes that
  8. * the device supports, not Unicode characters.
  9. */

四、接口描述符(interface)

接口描述符描述配置中的特定接口。 配置提供一个或多个接口,每个接口具有零个或多个端点描述符,用于描述配置中的唯一端点集。 当配置支持多个接口时,特定接口的端点描述符遵循GetConfiguration()请求返回的数据中的接口描述符。接口描述符始终作为配置描述符的一部分返回。 无法使用GetDescriptor()或SetDescriptor()请求直接访问接口描述符。

接口可以包括备用设置,其允许在配置设备之后改变端点和/或它们的特性。接口的默认设置始终为备用设置零.SetInterface()请求用于选择备用设置或返回默认设置。 GetInterface()请求返回选定的备用设置。

备用设置允许改变设备配置的一部分,而其他接口保持运行。如果配置具有其一个或多个接口的备用设置,则每个设置都包含单独的接口描述符及其关联的端点。

如果设备配置支持具有两个备用设置的单个接口,则配置描述符后面将是一个接口描述符,其中bInterfaceNumber和bAlternateSetting字段设置为零,然后是该设置的端点描述符,后跟另一个接口描述符及其关联的端点描述。 第二个接口描述符的bInterfaceNumber字段也将设置为零,但第二个接口描述符的bAlternateSetting字段将设置为1。

如果接口仅使用端点0,则端口描述符不会跟随接口描述符。 在这种情况下,bNumEndpoints字段必须设置为零。
接口描述符永远不包括端点数量中的端点零。

表9-12显示了标准接口描述符。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 8

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 9













































































USB接口描述符的结构

偏移量

大小

说明

       0

bLength

1

数字

此表的字节数

       1

bDescriptorType

1

常量

接口描述表类(此处应为0x04)

       2

bInterfaceNumber

1

数字

接口号,当前配置支持的接口数组索引(从零开始)。

       3

bAlternateSetting

1

数字

可选设置的索引值。

       4

bNumEndpoints

1

数字

此接口用的端点数量,如果是零则说明此接口只用缺省控制管道。

       5

bInterfaceClass

        1

接口所属的类值: 
零值为将来的标准保留。 
如果此域的值设为FFH,则此接口类由厂商说明。 
所有其它的值由USB 说明保留。

       6

bInterfaceSubClass

        1

子类

子类码 
这些值的定义视bInterfaceClass域而定。 
如果bInterfaceClass域的值为零则此域的值必须为零。 
bInterfaceClass域不为FFH则所有值由USB 所保留。

       7

bInterfaceProtocol

        1

协议

协议码:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一个接口支持设备类相关的请求此域的值指出了设备类说明中所定义的协议.

       8

iInterface

        1

索引

描述此接口的字串描述表的索引值。

对于bInterfaceClass字段,表示接口所属的类别,USB协议根据功能将不同的接口划分成不的类,其具体含义如下表所示:







































































USB协议定义的接口类别(bInterfaceClass)
值(十六进制) 类别
0x01 音频类
0x02 CDC控制类
0x03 人机接口类(HID)
0x05 物理类
0x06 图像类
0x07 打印机类
0x08 大数据存储类
0x09 集线器类
0x0A CDC数据类
0x0B 智能卡类
0x0D 安全类
0xDC 诊断设备类
0xE0 无线控制器类
0xFE 特定应用类(包括红外的桥接器等)
0xFF 厂商定义的设备
  1. /* USB_DT_INTERFACE: Interface descriptor */
  2. struct usb_interface_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __u8 bInterfaceNumber;
  6. __u8 bAlternateSetting;
  7. __u8 bNumEndpoints;
  8. __u8 bInterfaceClass;
  9. __u8 bInterfaceSubClass;
  10. __u8 bInterfaceProtocol;
  11. __u8 iInterface;
  12. } __attribute__ ((packed));

五、端点描述符(endpoint)

用于接口的每个端点都有自己的描述符。 此描述符包含主机确定每个端点的带宽要求所需的信息。 始终返回端点描述符作为GetDescriptor(配置)请求返回的配置信息的一部分。 无法使用GetDescriptor()或SetDescriptor()请求直接访问端点描述符。 端点零永远不会有端点描述符。

表9-13显示了标准端点描述。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 10

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 11

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 12
























































USB端点描述符的结构

偏移量

大小

说明

0

bLength

1

数字

此描述表的字节数长度

1

bDescriptorType

1

常量

端点描述表类(此处应为0x05)

2

bEndpointAddress

1

端点

此描述表所描述的端点的地址、方向: 
Bit 3..0 : 端点号.
Bit 6..4 : 保留,为零 
Bit 7:    方向,如果控制端点则略。 
0:输出端点(主机到设备) 
1:输入端点(设备到主机)

3

bmAttributes

1

位图

此域的值描述的是在bConfigurationValue域所指的配置下端点的特性。 
Bit 1..0 :传送类型 
00=控制传送 
01=同步传送 
10=批传送 
11=中断传送 
所有其它的位都保留。

4

wMaxPacketSize

2

数字

当前配置下此端点能够接收或发送的最大数据包的大小。 
对于实进传输,此值用于为每帧的数据净负荷预留时间。在实际运行时,管道可能不完全需要预留的带宽,实际带宽可由设备通过一种非USB定义的机制汇报给主机。对于中断传输,批量传输和控制传输,端点可能发送比之短的数据包
 

6

bInterval

1

数字

周期数据传输端点的时间间隙。 
此域的值对于批传送的端点及控制传送的端点无意义。对于同步传送的端点此域必需为1,表示周期为1ms。对于中断传送的端点此域值的范围为1ms到255ms。

  1. /* USB_DT_ENDPOINT: Endpoint descriptor */
  2. struct usb_endpoint_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __u8 bEndpointAddress;
  6. __u8 bmAttributes;
  7. __le16 wMaxPacketSize;
  8. __u8 bInterval;
  9. /* NOTE: these two are _only_ in audio endpoints. */
  10. /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
  11. __u8 bRefresh;
  12. __u8 bSynchAddress;
  13. } __attribute__ ((packed));

六、设备限定描述符

device_qualifier描述符描述了有关高速设备的信息,如果设备以其他速度运行,该设备将发生变化。 例如,如果设备当前正以全速运行,则device_qualifier将返回有关其如何以高速运行的信息。反之亦然。

表9-9显示了device_qualifier描述符的字段。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 13

标准设备描述符的供应商,产品,设备,制造商,产品和序列号字段不包含在此描述符中,因为该信息对于所有支持的速度的设备是恒定的。 此描述符的版本号必须至少为2.0(0200H)。
主机使用GetDescriptor()请求访问此描述符。 GetDescriptor()请求中的描述符类型设置为device_qualifier(参见表9-5)。
如果仅全速设备(设备描述符版本号等于0200H)收到对device_qualifier的GetDescriptor()请求,则它必须响应请求错误。 除非首先成功检索device_qualifier描述符,否则主机不得请求other_speed_configuration描述符。

  1. /* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */
  2. struct usb_qualifier_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __le16 bcdUSB;
  6. __u8 bDeviceClass;
  7. __u8 bDeviceSubClass;
  8. __u8 bDeviceProtocol;
  9. __u8 bMaxPacketSize0;
  10. __u8 bNumConfigurations;
  11. __u8 bRESERVED;
  12. } __attribute__ ((packed));

#

下面的几个都是USB3.0规范定义的描述符。

#

七、二进制设备对象描述符(BOS)

本节定义了一个灵活且可扩展的框架,用于描述和添加USB标准规范集的设备级功能。如上所述,存在设备描述符,但是使用以下框架定义所有设备级功能扩展。
BOS描述符定义了与配置描述符类似的根描述符,并且是用于访问相关描述符族的基本描述符。主机可以读取BOS描述符并wTotalLength字段学习设备级描述符集的整个大小,或者它可以读取整个BOS描述符集的设备功能。主机使用GetDescriptor()请求访问此描述符。 GetDescriptor()请求中的描述符类型设置为BOS。主机无法读取单个设备功能描述符。只能通过使用GetDescriptor()请求读取BOS描述符并使用wTotalLength字段中报告的长度来访问整个集合。

20181223183002625.png

  1. /* USB_DT_BOS: group of device-level capabilities */
  2. struct usb_bos_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __le16 wTotalLength;
  6. __u8 bNumDeviceCaps;
  7. } __attribute__((packed));

八、设备能力描述符(capability)

通过设备功能描述符报告各个技术特定或通用设备级功能。 Device Capability描述符的格式在表9-11中定义。Device Capability描述符有一个通用头,带有一个子类型字段(bDevCapabilityType),用于定义描述符其余部分的布局。 bDevCapabilityType的代码在表9-12中定义。

20181223183543237.png

  1. /* USB_DT_DEVICE_CAPABILITY: grouped with BOS */
  2. struct usb_dev_cap_header {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __u8 bDevCapabilityType;
  6. } __attribute__((packed));

设备功能描述符始终作为GetDescriptor(BOS)请求返回的BOS信息的一部分返回。 无法直接访问设备功能GetDescriptor()或SetDescriptor()请求。

20181223183844251.png

目前支持三种,无线USB、USB2.0扩展和USB3.0。

  1. #define USB_CAP_TYPE_WIRELESS_USB 1
  2. struct usb_wireless_cap_descriptor { /* Ultra Wide Band */
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __u8 bDevCapabilityType;
  6. __u8 bmAttributes;
  7. #define USB_WIRELESS_P2P_DRD (1 << 1)
  8. #define USB_WIRELESS_BEACON_MASK (3 << 2)
  9. #define USB_WIRELESS_BEACON_SELF (1 << 2)
  10. #define USB_WIRELESS_BEACON_DIRECTED (2 << 2)
  11. #define USB_WIRELESS_BEACON_NONE (3 << 2)
  12. __le16 wPHYRates; /* bit rates, Mbps */
  13. #define USB_WIRELESS_PHY_53 (1 << 0) /* always set */
  14. #define USB_WIRELESS_PHY_80 (1 << 1)
  15. #define USB_WIRELESS_PHY_107 (1 << 2) /* always set */
  16. #define USB_WIRELESS_PHY_160 (1 << 3)
  17. #define USB_WIRELESS_PHY_200 (1 << 4) /* always set */
  18. #define USB_WIRELESS_PHY_320 (1 << 5)
  19. #define USB_WIRELESS_PHY_400 (1 << 6)
  20. #define USB_WIRELESS_PHY_480 (1 << 7)
  21. __u8 bmTFITXPowerInfo; /* TFI power levels */
  22. __u8 bmFFITXPowerInfo; /* FFI power levels */
  23. __le16 bmBandGroup;
  24. __u8 bReserved;
  25. } __attribute__((packed));
  26. #define USB_DT_USB_WIRELESS_CAP_SIZE 11

SuperSpeed设备应包含USB 2.0扩展描述符,并在何时支持LPM(Link Power Management)在USB 2.0高速模式下运行。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 14

  1. /* USB 2.0 Extension descriptor */
  2. #define USB_CAP_TYPE_EXT 2
  3. struct usb_ext_cap_descriptor { /* Link Power Management */
  4. __u8 bLength;
  5. __u8 bDescriptorType;
  6. __u8 bDevCapabilityType;
  7. __le32 bmAttributes;
  8. #define USB_LPM_SUPPORT (1 << 1) /* supports LPM */
  9. #define USB_BESL_SUPPORT (1 << 2) /* supports BESL */
  10. #define USB_BESL_BASELINE_VALID (1 << 3) /* Baseline BESL valid*/
  11. #define USB_BESL_DEEP_VALID (1 << 4) /* Deep BESL valid */
  12. #define USB_GET_BESL_BASELINE(p) (((p) & (0xf << 8)) >> 8)
  13. #define USB_GET_BESL_DEEP(p) (((p) & (0xf << 12)) >> 12)
  14. } __attribute__((packed));
  15. #define USB_DT_USB_EXT_CAP_SIZE 7

设备功能描述符始终作为GetDescriptor(BOS)请求返回的BOS信息的一部分返回。 无法直接访问设备功能GetDescriptor()或SetDescriptor()请求。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 15

  1. /*
  2. * SuperSpeed USB Capability descriptor: Defines the set of SuperSpeed USB
  3. * specific device level capabilities
  4. */
  5. #define USB_SS_CAP_TYPE 3
  6. struct usb_ss_cap_descriptor { /* Link Power Management */
  7. __u8 bLength;
  8. __u8 bDescriptorType;
  9. __u8 bDevCapabilityType;
  10. __u8 bmAttributes;
  11. #define USB_LTM_SUPPORT (1 << 1) /* supports LTM */
  12. __le16 wSpeedSupported;
  13. #define USB_LOW_SPEED_OPERATION (1) /* Low speed operation */
  14. #define USB_FULL_SPEED_OPERATION (1 << 1) /* Full speed operation */
  15. #define USB_HIGH_SPEED_OPERATION (1 << 2) /* High speed operation */
  16. #define USB_5GBPS_OPERATION (1 << 3) /* Operation at 5Gbps */
  17. __u8 bFunctionalitySupport;
  18. __u8 bU1devExitLat;
  19. __le16 bU2DevExitLat;
  20. } __attribute__((packed));
  21. #define USB_DT_USB_SS_CAP_SIZE 10

九、接口关联描述符(interface asssociation)

接口关联描述符用于描述两个或多个接口与同一功能相关联。 “关联”包括两个或多个接口及其所有备用设置接口。设备必须为需要多个接口的每个设备功能使用接口关联描述符。始终返回接口关联描述符作为GetDescriptor(配置)请求返回的配置信息的一部分。无法使用GetDescriptor()或SetDescriptor()请求直接访问接口关联描述符。接口关联描述符必须位于它关联的接口的接口描述符集(包括所有备用设置)之前。相关接口集中的所有接口号必须是连续的。表9-15显示了标准接口关联描述符。接口关联描述符包括函数类,子类和协议字段。这些字段中的值可以与任何一个关联接口的接口类,子类和协议值相同。对于现有设备类,首选实现是使用列表中第一个接口的接口类,子类和协议字段值相关接口。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 16

注意:由于此特定功能未包含在早期版本的USB规范中,因此现有USB OS实现将如何支持使用此描述符的设备存在问题。 强烈建议使用接口关联描述符的设备实现使用设备描述符中的多接口函数类代码。 这允许简单且容易地识别这些设备,并允许在某些操作系统上安装可以解析和枚举包括接口关联描述符的配置的升级驱动程序。 多接口函数类代码记录在http://www.usb.org/developers/docs

十、超速端点联合描述符(SuperSpeed Endpoint Companion)

接口中描述的每个SuperSpeed端点后跟一个SuperSpeed Endpoint Companion描述符。 此描述符包含仅为SuperSpeed端点定义的其他端点特征。 此描述符始终作为GetDescriptor(配置)请求返回的配置信息的一部分返回,并且无法使用GetDescriptor()或SetDescriptor()请求直接访问。 默认控制管道没有Endpoint Companion描述符。 Endpoint Companion描述符应紧跟在配置信息中与其关联的端点描述符之后。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 17

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc3ODUx_size_16_color_FFFFFF_t_70 18

  1. /* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */
  2. struct usb_ss_ep_comp_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __u8 bMaxBurst;
  6. __u8 bmAttributes;
  7. __le16 wBytesPerInterval;
  8. } __attribute__ ((packed));

以上内容都是在USB2.0或USB3.0协议的第九章。

在linux中这些描述符的定义文件也描述为ch9.h

  1. include/uapi/linux/usb/ch9.h

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_16777851/article/details/85222030

发表评论

表情:
评论列表 (有 0 条评论,72人围观)

还没有评论,来说两句吧...

相关阅读