最近忙于公司的项目和本人的驾驶证考试,拖延了这个系列第三篇的完成,先向各位支持我的DX表示一下歉意。不过好在驾驶证的蝴蝶桩考试顺利通过,自己先庆贺一下
这段时间做一个手持机的项目,第一次真正感受到了手头这个小设备的功力。事情是这样的:要将n年前写的基于51的固件代码移植到AVR,问题出现了….,枚举不成功!立刻想到用协议分析仪看看……(此处省略168字),结果当然是一目了然,几分钟轻松搞定!关于这次的经历,回头专门写一个帖子吧,先卖个关子,哈。
闲话少说,本篇图解USB标准描述符。
数据采集设备:HD-USB12 USB协议分析仪。
还是先复习一下USB协议的相关内容。USB通迅配置是通过描述符完成的,下面对USB标准描述符进行说明。
一、USB标准描述符
1、标准设备描述符
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | 数字 | 描述符的大小=12H |
1 | bDecriptorType | 1 | 常量 | 设备描述符类型=01H |
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标准付值) |
10 | idProduct | 2 | ID | 产品标志(由厂商付值) |
12 | bcdDevice | 2 | BCD码 | 设备发行号(BCD 码) |
14 | iManufacturer | 1 | 索引 | 描述厂商信息的字串的索引。 |
15 | iProduct | 1 | 索引 | 描述产品信息的字串的索引。 |
16 | iSerialNumber | 1 | 索引 | 描述设备序列号信息的字串的索引。 |
17 | bNumConfigurations | 1 | 数字 | 可能的设置数 |
2、标准配置描述符
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | 数字 | 描述符的大小=09H |
1 | bDescriptorType | 1 | 常量 | 配置描述符类型=02H |
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 为一个单位。 |
3、标准接口描述符
偏移量 | 域 | 大小 | 值 | 说明 |
0 | bLength | 1 | 数字 | 描述符的大小=09H |
1 | bDescriptorType | 1 | 常量 | 接口描述符类型=04H |
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 | 索引 | 描述此接口的字串描述符的索引值。 |
4、标准端点描述符
偏移量 | 域 | 大小 | 值 | 说明 |
0 | bLength | 1 | 数字 | 描述符的大小=07H |
1 | bDescriptorType | 1 | 常量 | 端点描述符类型=05H |
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。对于中断传送的端点此域值的范围为1到255。 |
5、语言描述符
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | N+2 | 描述符的大小 |
1 | bDescriptorType | 1 | 常量 | 字串描述符类型=03H |
2 | wLANGID[0] | 2 | 数字 | 语言标识(LANGID)码0 |
… | … | … | … | … |
N | wLANGID[x] | 2 | 数字 | 语言标识(LANGID)码X |
6、UNICODE字串描述符
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | 数字 | 描述符的大小 |
1 | bDescriptorType | 1 | 常量 | 字串描述符类型=03H |
2 | bString | N | 数字 | UNICODE 编码的字串 |
二、图解枚举过程中的描述符
1、枚举成功后主机得到的第一个描述符(设备描述符),见图1
(图1)(本数据由HD-USB12 USB协议分析仪采集)
a、 Index[38 - 44]:设备发送到主机的描述,详见图2。
b、图2为设备描述符,其各字段含义参考上面标准设备描述符。
2、枚举成功后主机得到的第二个描述符(配置描述符),见图3
a、Index[54 - 56]:设备发送到主机的描述,详见图4。
b、图4为配置描述符,其各字段含义参考上面标准配置描述符。
3、随后为配置描述符、接口描述符及端点描述符见图5
a、Index[67 - 78]:设备发送到主机的描述,详见图6、图7、图8及图9。
b、图6为配置描述符,其各字段含义参考上面标准配置描述符。
c、图7为接口描述符,其各字段含义参考上面标准接口描述符。
d、图8及图9为端点描述符,其各字段含义参考上面标准端点描述符。
以上描述符不包括高速USB的描述符,如速度配置描述符等,详细请参考USB标准。
用户237467 2010-3-2 14:53