详细内容见《USB2.0协议》9.6 Standard USB Descriptor Definitions 章节。
说明:翻译《USB2.0 标准协议》9.6.1 Device 章节。
设备描述符描述有关 USB 设备的一般信息。它包括全局应用于设备和设备的所有配置的信息。一个 USB 设备只有一个设备描述符。
具有高速能力的设备,如果设备信息与全速和高速不同,则必须有一个设备限定符描述符(device_qualifier)(参见章节9.6.2)。
具有高速能力的设备的 DEVICE 描述符的版本号是2.0 (0200H)。如果设备仅全速或仅低速,则此版本号表示它将正确响应对设备限定符描述符(device_qualifier)执行器的请求(即,它将以请求错误进行响应)。
bcdUSB 字段包含 BCD 版本号。对于JJ.M.N版本,bcdUSB字段的值是0xJJMN (JJ主版本号,M次版本号,N次次版本号),例如,版本2.1.3用值0x0213表示,版本2.0用值0x0200表示。
bNumConfigurations字段表示当前运行速度下的配置数量。其他运行速度的配置不包括在计数中。如果设备针对特定速度进行了特定配置,则 bNumConfigurations 字段仅反映单个速度的配置数,而不是两种速度的配置总数。
如果设备高速运行,则 bMaxPacketSize0 字段必须为 64,表示最大数据包数为 64 字节。高速操作不允许控制端点(端点0)的其他最大数据包大小。
所有USB设备都有一个默认控制管道。设备描述符中描述了设备的默认控制管道的最大数据包大小。特定于配置及其接口的端点在配置描述符中进行描述。配置及其接口不包含默认控制管道的端点描述符。除了最大数据包大小之外,默认控制管道的特征由本规范定义,并且对所有USB设备都是相同的。
bNumConfigurations字段标识设备支持的配置的数量。表 9-8 显示了标准设备描述符。
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | Number | 此描述符的大小(以字节为单位) |
1 | bDescriptorType | 1 | Constant | 设备描述符类型。此字段标识设备及其描述符所遵循的 USB 规范的版本。 |
2 | bcdUSB | 2 | BCD | 以二进制编码的十进制表示的 USB 规范发布号(即 2.10 为 210H)。此字段标识设备及其描述符所遵循的 USB 规范的版本。 |
4 | bDeviceClass | 1 | Class | 类代码(由 USB-IF 分配)。如果该字段被重置为零,则配置中的每个接口指定自己的类信息,并且各个接口独立运行。如果此字段设置为介于 1 和 FEH 之间的值,则器件在不同接口上支持不同的类规范,并且接口可能无法独立运行。此值标识用于聚合接口的类定义。如果此字段设置为 FFH,则设备类是特定于供应商的。 |
5 | bDeviceSubClass | 1 | SubClass | 子类代码(由 USB-IF 分配)。这些代码由 bDeviceClass 字段的值限定。如果 bDeviceClass 字段重置为零,则此字段也必须重置为零。如果 bDeviceClass 字段未设置为 FFH,则保留所有值以供 USB-IF 分配。 |
6 | bDeviceProtocol | 1 | Protocol | 协议代码(由USB-IF分配)。这些代码由 bDeviceClass 和 bDeviceSubClass 字段的值限定。如果设备支持基于设备的类特定协议,而不是基于接口的协议,则此代码标识设备使用的协议,该协议由设备类规范定义。如果该字段被重置为零,则表示设备不使用基于设备的类特定协议。然而,它可以在接口的基础上使用类特定的协议。如果此字段设置为 FFH,则设备将基于设备使用特定于供应商的协议。 |
7 | bMaxPacketSize0 | 1 | Number | 端点零的最大数据包大小(只有 8、16、32 或 64 有效)。 |
8 | idVendor | 2 | ID | 供应商 ID(由 USB-IF 分配)。 |
10 | idProduct | 2 | ID | 产品 ID(由制造商分配)。 |
12 | bcdDevice | 2 | BCD | 以二进制编码的十进制表示的设备版本号。 |
14 | iManufacturer | 1 | Index | 描述制造商的字符串描述符索引。 |
15 | iProduct | 1 | Index | 描述产品的字符串描述符的索引。 |
16 | iSerialNumber | 1 | Index | 描述设备序列号的字符串描述符的索引。 |
17 | bNumConfigurations | 1 | Number | 可能的配置数量。 |
说明:翻译《USB2.0 标准协议》9.6.2 Device_Qualifier 章节。
设备限定符描述了有关高速设备的信息,如果设备以另一种速度运行,这些信息就会改变。例如,如果设备当前正在全速运行,设备限定符将返回关于它如何在高速运行的信息,反之亦然。表9-9显示了设备限定符描述符的字段。
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | Number | 描述符的大小 |
1 | bDescriptorType | 1 | Constant | 设备限定符类型 |
2 | bcdUSB | 2 | BCD | USB 规范版本号(例如,V2.00 为 0200H) |
4 | bDeviceClass | 1 | Class | 类代码 |
5 | bDeviceSubClass | 1 | SubClass | 子类代码 |
6 | bDeviceProtocol | 1 | Protocol | 协议代码 |
7 | bMaxPacketSize0 | 1 | Number | 其他速度的最大包大小 |
8 | bNumConfigurations | 1 | Number | 其他速度配置的数量 |
9 | bReserved | 1 | Zero | 保留以后使用,必须为零 |
标准设备描述符的供应商、产品、设备、制造商、产品和序列号字段不包括在此描述符中,因为对于所有受支持的速度,该信息对于设备都是常量的。此描述符的版本号必须至少为 2.0 (0200H)。
主机使用 GetDescriptor() 请求访问此描述符。GetDescriptor()请求中的描述符类型被设置为设备限定符(见表9-5)。
如果一个全速度的设备(设备描述符版本号等于0200H)接收到一个设备限定符的GetDescriptor()请求,它必须响应一个请求错误。除非首先成功检索到设备限定符描述符,否则主机不能请求其他速度配置描述符。
说明:翻译《USB2.0 标准协议》9.6.3 Configuration 章节。
配置描述符描述有关特定设备配置的信息。描述符包含一个bConfigurationValue字段,该字段的值用作SetConfiguration()请求的参数时,该值会导致设备采用所描述的配置。
描述符描述配置提供的接口数。每个接口可以独立运行。例如,ISDN 设备可能配置了两个接口,每个接口提供 64 Kb/s 的双向通道,这些通道在主机上具有单独的数据源或接收器。另一种配置可能会将 ISDN 设备显示为单个接口,将两个通道绑定到一个 128 Kb/s 的双向通道中。
当主机请求配置描述符时,将返回所有相关的接口和端点描述符(请参见第 9.4.3 节)。
USB 设备具有一个或多个配置描述符。每个配置都有一个或多个接口,每个接口都有零个或多个端点。一个端点不能在单个配置中的接口之间共享,除非同一接口的其他设置使用该端点。在没有这个限制的情况下,可以在不同配置的接口之间共享端点。
一旦配置完成,设备可能支持对配置进行有限的调整。如果某个接口有可选的设置,则可在配置后选择可选的。表 9-10 显示了标准配置描述符。
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | Number | 此描述符的大小(以字节为单位) |
1 | bDescriptorType | 1 | Constant | 配置描述符类型 |
2 | wTotalLength | 2 | Number | 此配置返回的数据的总长度。包含此配置返回的所有描述符(配置、接口、端点和特定于类或供应商的)的组合长度。 |
4 | bNumInterfaces | 1 | Number | 此配置支持的接口数 |
5 | bConfigurationValue | 1 | Number | 用作 SetConfiguration() 请求的参数以选择此配置的值 |
6 | iConfiguration | 1 | Index | 描述此配置的字符串描述符的索引 |
7 | bmAttributes | 1 | Bitmap | 配置特性:D7:保留(设置为 1)D6:自供电的D5:远程唤醒D4~0:保留(重置为零)D7 是保留的,由于历史原因,必须设置为 1。使用来自总线和本地电源的设备配置以 bMaxPower 为单位报告非零值,以指示所需的总线功率量并设置 D6。运行时的实际电源可以通过GetStatus(DEVICE)请求来确定(参见9.4.5节)。如果设备配置支持远程唤醒,则 D5 将设置为 1。 |
8 | bMaxPower | 1 | mA | 当设备完全运行时,USB设备在此特定配置下从总线获得的最大功耗。以 2 mA 单位表示(即 50 = 100 mA)。注意:设备配置报告配置是总线供电还是自供电。设备状态报告设备当前是否自供电。当设备与外部电源断开连接时,会更新设备状态,表示设备已不再自供电。当设备失去外部电源时,如果超出其配置报告的量,则设备可能不会增加其从总线的功耗。如果设备在与其外部电源断开连接时可以继续运行,则设备将继续运行。如果设备无法继续运行,则操作将失败,无法再支持。USB 系统软件可以通过检查状态并注意设备电源的丢失来确定故障原因。 |
说明:翻译《USB2.0 标准协议》9.6.4 Other_Speed_Configuration 章节。
表9-11中显示的另一个速度配置描述符描述了高速设备的配置,如果它在其他可能的速度下运行。另一个速度配置的结构与配置描述符相同。
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | Number | 描述符的大小 |
1 | bDescriptorType | 1 | Constant | 其他速率配置类型 |
2 | wTotalLength | 2 | Number | 返回的数据总长度 |
4 | bNumInterfaces | 1 | Number | 此速度配置支持的接口数 |
5 | bConfigurationValue | 1 | Number | 用于选择配置的值 |
6 | iConfiguration | 1 | Index | 字符串描述符索引 |
7 | bmAttributes | 1 | Bitmap | 与配置描述符相同 |
8 | bMaxPower | 1 | mA | 与配置描述符相同 |
主机使用GetDescriptor()请求访问这个描述符。GetDescriptor()请求中的描述符类型被设置为其他速度配置(见表9-5)。
说明:翻译《USB2.0 标准协议》9.6.5 Interface 章节。
接口描述符描述配置中的特定接口。配置提供一个或多个接口,每个接口都有零个或多个端点描述符,描述配置中一组唯一的端点。当一个配置支持多个接口时,特定接口的端点描述符在GetConfiguration()请求返回的数据中的接口描述符后面。接口描述符总是作为配置描述符的一部分返回。接口描述符不能通过GetDescriptor()或SetDescriptor()请求直接访问。
一个接口可以包括备用设置,允许端点和或它们的特征在设备配置后发生变化。接口的默认设置始终为备用设置零。SetInterface()请求用于选择备用设置或返回默认设置。GetInterface()请求返回所选的备用设置。
备用设置允许设备配置的一部分发生变化,而其他接口仍在运行。如果一个配置对它的一个或多个接口有备用设置,则每个设置包含一个单独的接口描述符及其关联的端点。
如果设备配置支持具有两个备选设置的单个接口,则配置描述符后面将跟着一个接口描述符,该接口描述符的bInterfaceNumber和balternatessetting字段设置为0,然后是该设置的端点描述符,后面是另一个接口描述符及其关联的端点描述符。第二个接口描述符的bInterfaceNumber字段也将被设置为0,但是第二个接口描述符的balternatessetting字段将被设置为1。
如果接口只使用端点0,则接口描述符后面没有端点描述符。在这种情况下,bNumEndpoints字段必须设置为0。
接口描述符永远不会在端点的数量中包含端点0。标准接口描述符如表9-12所示。
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | Number | 此描述符的大小(以字节为单位) |
1 | bDescriptorType | 1 | Constant | 接口描述符类型 |
2 | bInterfaceNumber | 1 | Number | 此接口的编号。从零开始的值标识此配置支持的并发接口数组中的索引。 |
3 | bAlternateSetting | 1 | Number | 用于为上一字段中标识的接口选择此备用设置的值 |
4 | bNumEndpoints | 1 | Number | 该接口使用的端点数(不包括端点0)。如果该值为0,则该接口只使用默认控制管道。 |
5 | bInterfaceClass | 1 | Class | 类代码(由 USB-IF 分配)。值0保留为将来的标准化使用。如果该字段设置为FFH,则接口类是特定于供应商的。所有其他值都保留给USB-IF分配。 |
6 | bInterfaceSubClass | 1 | SubClass | 子类代码(由 USB-IF 分配)。这些代码由 bInterfaceClass 字段的值限定。如果 bInterfaceClass 字段重置为零,则此字段也必须重置为零。如果 bInterfaceClass 字段未设置为 FFH,则所有值都将保留以供 USB-IF 分配。 |
7 | bInterfaceProtocol | 1 | Protocol | 协议代码(由 USB 分配)。这些代码由 bInterfaceClass 和 bInterfaceSubClass 字段的值限定。如果接口支持类特定的请求,此代码将识别设备使用的协议,该协议由设备类规范定义。如果该字段被重置为0,表示该接口不使用类特定的协议。当该字段设置为FFH时,表示设备在该接口上使用特定于厂商的协议。 |
8 | iInterface | 1 | Index | 描述此接口的字符串描述符的索引 |
说明:翻译《USB2.0 标准协议》9.6.6 Endpoint 章节。
用于接口的每个端点都有自己的描述符。这个描述符包含主机确定每个端点的带宽需求所需的信息。端点描述符总是作为GetDescriptor(configuration)请求返回的配置信息的一部分返回。端点描述符不能通过GetDescriptor()或SetDescriptor()请求直接访问。端点0没有端点描述符。表9-13给出了标准端点描述符。
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | Number | 此描述符的大小(以字节为单位) |
1 | bDescriptorType | 1 | Constant | 端点描述符类型 |
2 | bEndpointAddress | 1 | Endpoint | 此描述符描述的USB设备上端点的地址。地址编码如下:Bit 3…0:端点数量Bit 6…4:保留,重置为零BIt 7:方向,控制端点忽略(0-输出端点、1-输入端点) |
3 | bmAttributes | 1 | Bitmap | 当使用bConfigurationValue配置端点时,该字段描述端点的属性。Bits 1…0:传输类型(00-控制传输、01-同步传输、10-批传输、11-中断传输)如果不是一个同步端点,Bit5…2是保留的,必须设置为零。如果是同步传输的,则定义如下:Bits 3…2:同步类型(00-无同步、01-异步、10-自适应、11-同步)Bits 5…4:使用类型(00-数据端点、01-反馈端点、10-隐式反馈数据端点、11-保留)更多信息请参阅第5章。所有其他位都保留,必须重置为零。保留位必须被主机忽略。 |
4 | wMaxPacketSize | 2 | Number | 选择此配置时,此端点能够发送或接收的最大包大小。对于同步端点,这个值用于在调度中保留总线时间,每(微)帧数据有效负载所需的时间。管道实际使用的带宽可能比保留的带宽要少。如有必要,设备通过其正常的非 USB 定义机制报告实际使用的带宽。对于所有端点,Bit10…0表示最大报文大小(以字节为单位)。用于高速同步和中断端点:Bit12…11 指定每个微帧的额外事务机会数(00-无(每微帧1个事务)、01-1 个附加(每个微帧 2 个)、10-2 个附加(每个微帧 3 个)、11-保留)Bits 15…13:保留的,必须设置为零。更多信息请参阅第5章。 |
6 | bInterval | 1 | Number | 数据传输的轮询端点的间隔。根据设备的运行速度(即1毫秒或125秒单位),以帧或微帧表示。对于全速/高速常时等量端点,此值必须在 1 到 16 的范围内。bInterval值用作2的bInterval-1次方;例如,bInterval为4表示周期为8(2的4-1次方)。对于全速/低速中断端点,此字段的值可能介于 1 到 255 之间。对于高速中断端点,bInterval值被用作2的bInterval-1次方;例如,bInterval为4表示周期为8(2的4-1次方)。取值范围为1 ~ 16。对于高速批量/控制 OUT 端点,bInterval 必须指定端点的最大 NAK 速率。值为 0 表示终结点从不进行 NAK。其他值表示微帧的每个bInterval数量最多为1个NAK。取值范围为0 ~ 255。请参阅第5章对周期的详细描述。 |
battributes字段提供了端点的传输类型(Bit 1…0)和同步类型(Bit 3…2)的信息。此外,使用类型位(Bit5…4)指出这是否是用于正常数据传输的端点(Bit 5…4=00B),它是用于传递一个或多个数据端点(Bit 5…4=01B)的显式反馈信息,还是作为一个或多个数据端点(Bit 5…4=10B)的隐式反馈端点的数据端点。Bit5 . .2只对同步端点有意义,对于所有其他传输类型必须重置为零。
如果端点被用作显式反馈端点(Bit 5…4=01B),那么传输类型必须设置为同步(Bit 1…0 = 01B),同步类型必须设置为不同步(Bit 3…2=00B)。
反馈端点(显式或隐式)需要与一个(或多个)向其提供反馈服务的同步数据端点相关联。关联基于端点号匹配。反馈端点总是具有与它服务的数据端点相反的方向。如果多个数据端点要由同一个反馈端点提供服务,那么数据端点必须具有升序的但不一定是连续的端点编号。第一个数据端点和反馈端点必须具有相同的端点号(和相反的方向)。这确保数据端点可以唯一地标识其反馈端点,方法是搜索端点编号等于或小于其自己端点编号的第一个反馈端点。
例如:考虑极端情况,需要5组OUT异步等时端点,同时需要4组IN自适应等时端点。每组需要一个独立的反馈端点,如图9-7所示。
高速同步和中断终端使用wMaxPacketSize的 Bit 12…11 来为每个由bInterval指定的微帧指定多个事务。如果wMaxPacketSize的 Bit 12…11 为零,端点的最大数据包大小可以是任何允许的值(如第五章所定义)。如果wMaxPacketSize的 Bit 12…11 不为0,则限制wMaxPacketSize的 Bit 10…0,如表9-14所示。
对于高速批量和控制 OUT 端点,bInterval 字段仅用于合规性目的;主控制器不需要根据该字段的值改变其行为。
说明:翻译《USB2.0 标准协议》9.6.7 String 章节。
字符串描述符是可选的。如前所述,如果设备不支持字符串描述符,则设备、配置和接口描述符内对字符串描述符的所有引用必须重置为0。
字符串描述符使用的 UNICODE 编码。USB设备中的字符串可能支持多种语言。当请求字符串描述符时,请求者使用USB-IF定义的16位语言ID (LANGID)指定所需的语言。当前定义的 USB LANGID 列表可在 http://www.usb.org/developers/docs.html 中找到。所有语言的字符串索引0都返回一个字符串描述符,该描述符包含设备支持的两字节LANGID代码数组。表 9-15 显示了 LANGID 代码数组。USB 设备可能会省略所有字符串描述符。省略所有字符串描述符的 USB 设备不得返回 LANGID 代码数组。
LANGID 代码数组不是 NULL 终止的。数组的大小(以字节为单位)是通过从描述符的第一个字节的值中减去 2 来计算的。
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | N+2 | 此描述符的大小(以字节为单位) |
1 | bDescriptorType | 1 | Constant | 字符串描述符类型 |
2 | wLANGID[0] | 2 | Number | LANGID 代码 0 |
…… | …… | …… | …… | …… |
N | wLANGID[x] | 2 | Number | LANGID 代码 x |
UNICODE 字符串描述符(如表 9-16 所示)不是以 NULL 终止的。字符串长度是通过从描述符的第一个字节的值中减去 2 来计算的。
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | Number | 此描述符的大小(以字节为单位) |
1 | bDescriptorType | 1 | Constant | 字符串描述符类型 |
2 | bString | 1 | Number | UNICODE编码的字符串 |
参考《USB2.0》11.23.1 Standard Descriptors for Hub Class 章节。