论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710
第9章 RL-USB各种USB描述符简介
本章节为大家讲解USB的各种描述符。
9.1初学者重要提示
9.2 USB描述符概述
9.3 USB设备描述符
9.4 USB配置描述符
9.5 USB接口描述符
9.6 USB端点描述符
9.7 USB字符串描述符
9.8 USB设备限定符描述符
9.9 总结
9.1 初学者重要提示
- USB1.1和USB2.0规格书以及Cypress做的中文版USB文档,非常推荐大家学习:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100698
- USB初学 -- 入门篇 (USB基础知识速览)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100687 。
- 文献参考:
https://en.wikipedia.org/wiki/USB
https://zh.wikipedia.org/wiki/USB
https://en.wikipedia.org/wiki/USB_hardware
9.2 USB描述符概述(USB Descriptors)
USB设备使用描述符报告其属性,描述符是具有定义格式的数据结构。每个描述符都以一个字节宽的字段开始,该字段包含描述符中字节的总数,然后是一个标识描述符类型的字段。
将USB设备连接到USB总线时,主机通过总线枚举来识别和配置设备。设备加入USB网络后,USB主机立即发送设置请求。将指示该设备选择配置和接口,以匹配USB主机上运行的应用程序需求。选择配置和接口后,设备必须为活动的端点提供服务,以此与USB主机交换数据。
常用的描述符主要有:
- 设备描述符(Device Descriptor)
- 配置描述符(Configuration Descriptor)
- 接口描述符(Interface Descriptor)
- 一个或多个端点描述符(Endpoint Descriptor)
- 字符串描述符(String Descriptor)
字符串描述符是另一种可选的描述符,它为用户提供了有关设备的可读信息。
- 设备限定符描述符(Device Qualifier Descriptor)
它提供了支持高速性能的设备信息,该信息会根据设备的不同运行速度而不同。
- 复杂设备具有多个接口。每个接口可以有多个端点。例如,IP语音电话可能具有:
- 一个音频类接口,带有2个同步端点,用于在每个方向上传输音频数据。
- 一个HID接口,带有一个用于内置键盘的IN中断端点。
RL-USB支持用户在必要时可以选择覆盖USB描述符。当需要在运行时更改设备类或需要创建其他报告时,可能就是这种情况。
9.3 USB设备描述符(Device Descriptor)
设备描述符为主机提供了许多信息,如设备需要满足的USB规范、设备配置编号、设备支持的协议、供应商标识(idVendor又称为VID,每个公司只能从USB-IF获得唯一的VID)、产品标识(idProduct又称为PID,与数据包ID不同)和一个序列号(如果设备有)。 设备描述符包含了 USB 设备的重要信息。
9.4 USB配置描述符(Configuration Descriptor)
该配置描述符包含有关设备的功率需求,它可以支持的接口数量。一个设备可以具有多种配置,主机可以选择最符合应用软件要求的配置。
9.5 USB接口描述符(Interface Descriptor)
接口描述符(USB_INTERFACE_DESCRIPTOR)定义的端点的集合。该接口支持适用于特定任务的一组管道。每个配置可以具有多个接口。USB主机可以动态选择接口。
接口描述符永远不会在端点编号中包含端点0。如果接口仅使用端点0,则必须将字段bNumEndpoints设置为零。如果没有为设备选择任何类别,则不会加载任何标准USB驱动程序,并且开发人员必须提供自己的设备驱动程序。
例如,需要两个具有不同接口的设备。
第一个接口Interface0的bInterfaceNumber字段设置为0。
下一个接口Interface1的bInterfaceNumber字段设置为1,
bAlternativeSetting字段也设置为0(默认)。通过将字段bInterfaceNumber设置为1并将字段bAlternativeSetting设置为1而不是0 ,可以为此设备定义替代设置。使用bAlternativeSettings等于0的前两个接口描述符。但是,主机可以发送SetInterface()请求以启用替代设置。
9.6 USB端点描述符(Endpoint Descriptor)
端点描述符(USB_ENDPOINT_DESCRIPTOR)为每个端点指定传输类型,方向,轮询间隔,以及最大分组大小。端点0(默认端点)始终被假定为控制端点,并且从不包含描述符。
9.7 USB字符串描述符(String Descriptor)
字符串描述符(USB_STRING_DESCRIPTOR)是可选的,并将可读信息添加到其他描述符中。如果设备不支持字符串描述符,则必须将设备,配置和接口描述符中对字符串描述符的所有引用都设置为零。
字符串描述符以Unicode编码,因此单个产品可以支持多种语言。请求字符串描述符时,请求者使用USB-IF定义的16位语言ID(LANGID)指定所需的语言(详情请参阅语言标识符(LANGID))。字符串索引零用于所有语言,并返回一个字符串描述符,该描述符包含设备支持的两字节LANGID代码的数组。
LANGID代码的数组不是以NULL结尾的。数组的大小(以字节为单位)是通过描述符的第一个字节的值减去2而得出的。
UNICODE字符串描述符不是以NULL结尾的。字符串长度是通过从描述符的第一个字节的值中减去2来计算的。
9.8 USB设备限定符描述符(Qualifier Descriptor)
具有全速和高速设备信息不同的高速设备必须具有设备限定符描述符(USB_DEVICE_QUALIFIER_DESCRIPTOR)。例如,如果设备当前以全速运行,则设备限定符将返回有关如何以高速运行的信息,反之亦然。不包括供应商,产品,设备,制造商和序列号的字段。无论支持的速度如何,此信息对于设备而言都是恒定的。
如果全速设备接收GetDescriptor()请求device_qualifier,它必须回应错误请求。然后,主机不得请求other_speed_configuration描述符。
9.9 总结
本章就为大家介绍这么多,后面的应用设计中,描述符用到的地方很多,需要大家熟练掌握。