所有的USB设备都有一个描述主机信息的描述符层次结构,如设备是什么、谁制造的、它支持什么版本的USB、可以配置多少种方式、端点的数量及其类型等等更常见的USB描述符是
设备描述符
配置描述符
接口描述符
终结点描述符
字符串描述符
USB设备只能有一个设备描述符。设备描述符包括以下信息:设备符合的USB版本、用于加载适当驱动程序的产品和供应商ID以及设备可能具有的配置数量。配置的数量表示要遵循多少个配置描述符分支。如果描述器使用的是自供电的配置,那么它指定了设备的数量,或者说它使用的是自供电配置的数量。当枚举一个设备时,主机读取设备描述符,并可以决定启用哪个配置。它一次只能启用一个配置。例如,可以有高功率总线供电配置和自供电配置。如果设备插入有主电源的主机,设备驱动程序可以选择启用大功率总线供电配置,使设备在不连接电源的情况下也能供电,但如果设备连接到笔记本电脑或个人事务管理器,则可以启用第二种配置(自供电)将需要电源的用户插入设备。配置设置不限于功率差。每个配置都可以以相同的方式供电,并消耗相同的电流,但有不同的接口或端点组合。但是应该注意的是,更改配置需要停止每个端点上的所有活动。虽然USB提供了这种灵活性,但很少有设备有一个以上的配置。接口描述符可以看作是一个头,或者将端点分组到一个功能组中,执行设备的单个功能。例如,您可以拥有多功能传真/扫描仪/打印机设备。打印机接口描述符功能可以描述打印机接口描述符的三个功能。与配置描述符不同,一次只启用一个接口没有限制。一个设备可以同时启用一个或多个接口描述符。描述符有一个接口 B接口指定接口号和 平衡设置它允许界面动态更改设置。例如,我们可以有一个有两个接口的设备,接口一和接口二。一号接口 B接口设置为零表示它是第一个接口描述符和 平衡设置零接口2将有一个 B接口设置为1表示它是第二个接口和 平衡设置为零(默认)。然后我们可以使用另一个描述符 B接口设置为1表示它是第二个接口,但这次设置 平衡设置对于一个,指示此接口描述符可以作为另一个接口描述符2的替代设置。启用此配置时,前两个接口描述符 B备用设置使用等于零。但是,在操作期间,主机可以发送一个指向接口1的SetInterface请求,另一个设置为1,以启用另一个接口描述符。这比有两种配置有一个优势,因为我们可以通过接口0传输数据,同时更改与接口1相关的端点设置,而不会影响接口0。每个端点描述符用于指定每个端点的传输类型、方向、轮询间隔和最大数据包大小。端点0,默认的控制端点总是被假定为控制端点,因此从来没有描述符。
所有的描述符都由一种通用格式组成。第一个字节指定描述符的长度,而第二个字节表示描述符的类型。如果描述符的长度小于规范定义的长度,则主机将忽略它。但是,如果大小大于预期,主机将忽略多余的字节,并开始在实际返回长度的末尾查找下一个描述符。抵消场大小价值说明zero混合one数量描述符的大小(字节)oneb说明one常数描述符类型two...n描述符的参数开始
USB设备的设备描述符代表整个设备。因此,一个USB设备只能有一个设备描述符。它指定了一些有关设备的基本但重要的信息,例如支持的USB版本、最大数据包大小、供应商和产品id以及设备可以具有的可能配置的数量。设备描述符的格式如下所示。抵消场大小价值说明zero混合one数量描述符的大小(字节)(18字节)oneb描述器one常数设备描述符(0x01)twobcdUSB公司twoBCD公司设备也符合的USB规格号。fourB设备one等级类代码(由USB组织分配)如果等于零,则每个接口指定它自己的类代码如果等于0xFF,则类代码由供应商指定。否则字段是有效的类代码。fiveB设备子类one子类子类代码(由USB组织分配)sixB设备协议one协议协议代码(由USB组织分配)sevenB包装尺寸one数量零终结点的最大数据包大小。有效尺寸为8、16、32、64eightID供应商two身份证件供应商ID(由USB组织分配)tenIDP产品two身份证件产品ID(由制造商指定)twelveBCD设备twoBCD公司设备发布号fourteen图像制造商one索引制造商字符串描述符的索引fifteeni产品one索引产品字符串描述符索引sixteeniSerialNumber公司one索引序列号字符串描述符索引seventeenbNum配置one整数可能配置的数量
这个 bcdUSB公司字段报告设备支持的最高版本的USB。该值采用二进制编码的十进制格式,格式为0xJJMN,其中JJ是主版本号,M是次要版本号,N是次次要版本号。e、 g.USB 2.0报告为0x0200,USB 1.1报告为0x0110,USB 1.0报告为0x0100。
这个 b设备类,b设备子类和 B设备协议由操作系统用于为您的设备查找类驱动程序。通常只有bDeviceClass在设备级别设置。大多数类规范选择在接口级别标识自己,结果将bDeviceClass设置为0x00。这允许一个设备支持多个类。
这个 B包装尺寸字段报告端点0的最大数据包大小。所有设备都必须支持终结点零。
这个 ID供应商和 IDP产品由操作系统用于为您的设备查找驱动程序。供应商ID由USB-IF .
这个BCD设备具有与bcdUSB相同的格式,并用于提供设备版本号。此值由开发人员指定。
存在三个字符串描述符来提供制造商、产品和序列号的详细信息。不需要有字符串描述符。如果不存在字符串描述符,则应使用零索引。
bNum配置定义设备在其当前速度下支持的配置数。
一个USB设备可以有几种不同的配置,尽管大多数设备都很简单而且只有一种。配置描述符指定设备的供电方式、最大功耗、接口数量。因此,可以有两种配置,一种用于设备总线供电,另一种用于电源供电。由于这是接口描述符的“头”,因此使用不同于另一个配置的传输模式的一个配置也是可行的。一旦主机检查了所有配置,主机将发送一个SetConfiguration命令,该命令的值与其中一个配置的bConfigurationValue相匹配。这用于选择所需的配置。抵消场大小价值说明zero混合one数量描述符的大小(字节)oneb描述器one常数配置描述符(0x02)two总长度two数量返回数据的总长度(字节)fourB接口one数量接口数量fiveB配置one数量值用作选择此配置的参数sixI配置one索引描述此配置的字符串描述符的索引sevenBM属性one位图D7保留,设置为1。(USB 1.0总线供电)D6自供电D5远程唤醒D4..0保留,设置为0。eightB最大功率one妈妈2mA单元的最大功耗
读取配置描述符时,它返回整个配置层次结构,其中包括所有相关接口和端点描述符。这个 总长度字段反映层次结构中的字节数。
B接口指定此配置的接口数
B配置由SetConfiguration请求用于选择此配置。
I配置是以人类可读形式描述配置的字符串描述符的索引。
BM属性指定配置的电源参数。如果设备是自供电的,则设置为D6。位D7在usb1.0中用于表示总线供电的设备,但现在由bMaxPower完成。如果设备使用来自总线的任何电源,无论它是作为总线供电设备还是作为自供电设备,它都必须以bMaxPower报告其功耗。设备还可以支持远程唤醒,允许设备在主机处于挂起状态时唤醒主机。
B最大功率定义设备将从总线消耗的最大功率。这是以2mA为单位的,因此可以指定最大约500mA。该规范允许大功率总线供电设备从VBU中的电流不超过500mA。如果设备失去外部电源,则其消耗的电量不得超过bMaxPower中指示的值。如果没有外部电源,它将无法执行任何操作。
接口描述符可以看作是一个头,或者将端点分组到一个功能组中,执行设备的单个功能。接口描述符符合以下格式,抵消场大小价值说明zero混合one数量描述符大小(字节)(9字节)oneb描述器one常数接口描述符(0x04)twoB接口one数量接口数量three平衡设置one数量用于选择替代设置的值fourB点数one数量用于此接口的终结点数fiveBinterfaceclassone等级类代码(由USB组织分配)six子类接口one子类子类代码(由USB组织分配)sevenB接口协议one协议协议代码(由USB组织分配)eight接口one索引字符串描述符索引
B接口指示接口描述符的索引。它应该从零开始,并且每增加一个新的接口描述符。
平衡设置可用于指定替代接口. 这些可选接口可以用设置接口请求
B点数指示接口使用的终结点数。此值应排除端点0,并用于指示要遵循的端点描述符的数量。
BinInterfaceClass,BinInterfaceSubclass和 B接口协议可用于指定支持的类(例如HID、通信、大容量存储等),这允许许多设备使用类驱动程序,从而避免为设备编写特定的驱动程序。
接口允许接口的字符串描述。
端点描述符用于描述端点0以外的端点。端点0始终被假定为控制端点,并且在请求任何描述符之前进行配置。主机将使用这些描述符返回的信息来确定总线的带宽需求。抵消场大小价值说明zero混合one数量描述符大小(字节)(7字节)oneb描述器one常数终结点描述符(0x05)two修改地址one终结点终点地址
位0..3b端点编号。位4..6b保留。设为零Bits 7 Direction 0 = Out, 1 = In (Ignored for Control Endpoints)threeBM属性one位图位0..1传输类型00 = Control
01 = Isochronous10 = Bulk11 = Interrupt位2..7被保留。如果是等时端点,
Bits 3..2 = Synchronisation Type (Iso Mode)00 = No Synchonisation
01 = Asynchronous10 = Adaptive11 = SynchronousBits 5..4 = Usage Type (Iso Mode)
00 = Data Endpoint
01 = Feedback Endpoint10 = Explicit Feedback Data Endpoint11 = Reservedfour包长度two数量此端点能够发送或接收的最大数据包大小sixB间期one数量轮询终结点数据传输的间隔。帧计数中的值。对批量控制终结点忽略(&C)。对于中断端点,Isochronous必须等于1,并且字段的范围可以是1到255。
修改地址指示此描述符描述的端点。
BM属性指定传输类型。这可以是控制 ,中断 ,等时或批量传输. 如果指定了同步端点,则可以选择其他属性,例如同步和使用类型。
包长度指示此终结点的最大负载大小。
B间期用于指定某些传输的轮询间隔。单位以帧表示,因此对于低速/全速设备,这等于1ms,对于高速设备等于125us。
字符串描述符提供人类可读的信息,并且是可选的。如果不使用它们,则描述符的任何字符串索引字段都必须设置为零,表示没有可用的字符串描述符。字符串被编码在Unicode码可以制作格式和产品来支持多种语言。字符串索引0应返回受支持语言的列表。可以在中找到USB语言ID的列表通用串行总线语言标识符(LANGIDs)版本1.0抵消场大小价值说明zero混合one数量描述符的大小(字节)oneb描述器one常数字符串描述符(0x03)twoWLANGID[0]two数支持的语言代码0
(例如0x0409英语-美国)four瓦朗吉德[1]two数支持的语言代码1(例如0x0c09英语-澳大利亚)n瓦朗吉德[x]two数支持的语言代码x(例如0x0407德语-标准)上面的字符串描述符显示了字符串描述符0的格式。主机应读取此描述符以确定可用的语言。如果wIndex的语言支持发送,则获取描述符(字符串)请求所有后续字符串采用以下格式,抵消场大小价值说明zero混合one数量描述符的大小(字节)oneb描述器one常数字符串描述符(0x03)twoB串nUnicode码Unicode编码字符串