USB中的描述符详解

USB描述符的分类与介绍

USB的符述符分为几类?有人可能会答:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符等。但这里说的不是这样的。上面的几类描述符属于USB标准描述符。另外还有HID描述符和Hub描述符。所以分类是这样的:
1. 标准描述符
            1) 设备描述符
             2) 配置描述符
             3) 字符串描述符
             4) 接口描述符
             5) 端点描述符
             6) 设备限定描述符
             7) 其他速率配置描述符
1 标准描述符

标准描述符是指一组设备描述符,包括设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符、设备限定描述符和其他速率配置描述符。这七种 描述符具有类似的格式,比如说它们的第一个字段都是bLength,第二个字段都是bDescriptorType。七种描述符在使用时以 bDescriptorType字段来区分。描述符类型与对应的bDescriptorType字段值对应关系为:

 1.1 设备描述符

设备描述符描述的是设备的整体信息,与设备本身一一对应,一个设备只能有一个设备描述符。在主机对USB设备枚举的过程中,首先要做的就是获取设备描述符,以对设备有一个整体的了解。
设备描述符由14个字段组成,总长度18字节:

 这些字段都有一个小写字母表示的前缀,它们所表示的意思如下:
 b 表一个字节,=8bits;
 w 表一个字,=16bits;
 bm 表按位寻址;
 bcd 用BCD码表示;
 i 表索引值
 id 表标识码
各字段含义:
 bLength: 表示描述符的长度,对于设备描述符来说,其值为18,即0x12。
 bDescriptorType: 描述符类型,对应表1中的值,设备描述符为0x01。
 bcdUSB:该设备遵循的USB版本号,以BCD码表示,USB1.1为0x0101,USB2.0为0x0200。
 bDeviceClass:该设备所属的标准设备类,USB协议中对常见的设备进行了分类。该字段值为0x01~0xFE时,表示是USB协议中已定义的设备类,常用的HID设备类编号为0x03,其它设备类编号参: http://www.usb.org/developers/defined_class
 bDeviceProtocol:用于表示USB设备类所采用的设备类协议,其值和bDeviceClass和bDeviceSubClass有关。当此 字段为0时,表示不使用任何设备类协议。如果该USB设备属于某个设备类和设备子类,则应该继续指明所采用的设备类协议。当该字段为0xFF时,表明设备 类协议由供应商自定义。
 bMaxPacketSize0:用于表示在USB设备中,端点0所支持最大数据包的长度,它以字节为单位。对于低速USB设 备,bMaxPacketSize0为8;对于全速USB设备,bMaxPacketSize0为8、16、32、64;对于高速USB设 备,bMaxPacketSize0为64。
 IdVendor:用于表示USB设备供应商的ID。USB组织中规定每种产品都必须包含一个供应商ID,这样可以使主机加载合适的驱动程序。
 idProduct:用于表示USB产品的ID,由设备供应商提供。idProduct用于表示特定的USB设备,在USB设备上电的时候可以帮助USB主机选择合适的驱动程序。
 bcdDevice:用于表示USB设备的版本号,它以BCD码的形式表示。一般来说bcdDevcie由设备供应商指定,在USB设备上电的时候可以帮助USB主机选择合适的驱动程序。
 iManufacturer:用于表示供应商字符串描述符的索引值。具体字符串的内容在后面字符串描述符中定义。如果没有供应商字符串,可以置0。
 iSerialNumber:用于表示设备序列号字符串描述符的索引值,如果没有,可以置为0。
 bNumConfigurations:用于表示该USB设备所支持的配置数。

1.2 配置描述符

一个USB设备可以有多种配置,不同的配置使设备工作在不同的状态下,每个配置必须有一个配置描述符。其格式包括8个字段,共9字节。

 各个字段含义:
 bLength:用于表示配置描述符的长度,固定为9个字节,即0x09。
 bDescriptorType:用于表示配置描述符的类型值,固定为0x02。
 wTotalLength:用于表示配置信息的总长度,包括配置描述符、接口描述符、端点描述符长度的总和。
 bNumInterfaces:用于表示配置所支持的接口数。一般来说,USB设备的接口至少有一个,因此其最小值为1。
 bConfigurationValue:用于表示USB设备的配置值。
 iConfiguration:用于指出配置字符串描述符的索引值。具体字符串的内容在后面字符串描述符中定义。如果没有配置字符串,可以置为0。
 bmAttributes:用于表示USB设备特性。bmAttributes是接位寻址的,第6位置1表示使用总线电源;第5位置1表示支持远程唤醒功能;该字段其他位均保留,一般来说,第0~4位置0即可,第7位置1即可。
 bMaxPower:用于表示USB设备运行时所需要消耗的总线电流,单位以2mA为基准。USB设备可以从USB总线上获得最大的电流为500mA,因此bMaxPower字段的最大值可以设置为250。
 
1.3 字符串描述符
在USB协议中字符串描述符是可选的。字符串描述符用于保存一些供应商名称、产品序列号等文本信息。它的长度是不固定的,随字符串的数量和信息的长度变化而变化。其格式如下:

 各字段含义:
 bLength:字符串描述符的长度,其值应为N+2。
 bDescriptorType:字符串描述符的类型值,为0x03。
 bString:UNICODE编码的字符串。
 
1.4 接口描述符
接口是端点的集合,负责完成USB的特定功能,例如数据的输入输出。接口描述符用于描述一个接口,包含了接口的特性,如端点个数,所属设备类和子类等。它有9个字段,共9字节。其格式如下:

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 物理描述符

HID设备的物理描述符主要用于报告物理设备的激活信息,其类型值为0x23,它是可选的,对大部分设备不需要使用此描述符。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值