目录
2.2配置描述符(Configuration Descriptor)
2.3接口描述符(Interface Descriptor)
2.6设备限定描述符(Device Qualifier Descriptor)
2.7其他速率配置描述符(Other Speed Configuration Descriptor)
2.8接口电源描述符(Interface Power Descriptor)
1.描述符概念
描述符是一种数据结构,存储在USB设备中,用于描述一个USB设备的所有信息。USB主机通过获取描述符可以知道插入的USB设备是什么设备,具有什么功能,使用哪类传输方式及数据量的大小等。不同的描述符从不同的层级来表示设备的属性。
USB1.1协议中定义的标准描述符有:
- 设备描述符(Device Descriptor):
- 配置描述符(Configuration Descriptor):
- 接口描述符(Interface Descriptor):
- 端点描述符(Endpoint Descriptor):
- 字符串描述符(String Descriptor):
USB2.0又新增了3个新的标准描述符:
- 设备限定描述符(Device Qualifier Descriptor)
- 其他速率配置描述符(Other Speed Configuration Descriptor)
- 接口电源描述符(Interface Power Descriptor)
其他类型描述符,只在特定USB设备中使用,并非必须的:如HID描述符、报表描述符等。
2.USB2.0标准描述符介绍
2.1设备描述符(Device Descriptor)
设备描述符描述了一个 USB 设备的总体信息,包括USB版本号、设备类型、制造商标识(VID)、产品标识(PID)等信息。它是枚举过程中主机从设备读取的第一个描述符描述。每一个设备有且只有一个设备描述符。Windows系统根据设备的VID和PID进行驱动匹配,如果设备是多接口的,还会根据接口号进行匹配。正式产品中的VID需要向USB组织去申请,PID由厂商自己定义。设备描述符总共有 18 个字节,分为 14 个字段,详细介绍如下表。
2.2配置描述符(Configuration Descriptor)
配置描述符用于描述一个USB设备的配置信息,如接口总数、当前配置、供电方式、远程唤醒和须获取电流量等。主机使用 Set_Configuration 请求来选择一个配置描述符,用Get_Configuration 请求来返回一个配置描述符。当主机请求获取一个配置描述符的时候,与配置描述符相关的所有接口、端点描述符都会一并返回。配置描述符由 9 个字节组成,分为 8 个字段。
2.3接口描述符(Interface Descriptor)
接口描述符用于描述一个接口的属性,如接口类型、使用了哪些非0端点、所属设备类和子类等。一个配置可有多个接口,每个接口有唯一编号。一个接口就代表着USB设备的一种功能,其接口下的端点用于实现该接口下的数据通讯功能。接口描述符总是作为配置描述符的一部分被返回,主机不能通过 Get_Descriptor 请求直接获取接口描述符。接口描述符由 9 个字节组成,分为 9 个字段。
2.4端点描述符(Endpoint Descriptor)
端点描述符用于描述端点的属性,包括输入/输出方向、端点号和端点容量等。USB协议规定,端点0没有端点描述符,其它端点都必须包含端点描述符。端点0不需要描述符,它也不能直接由 Get_Descriptor请求来获得。端点描述由7个字节组成,分为6个字段。
2.5字符串描述符(String Descriptor)
字符串描述符就是用字符串描述一个设备的属性,描述的属性包括设备厂商名字、产品名字、产品序列号、各个配置名字、各个接口名字等,字符串描述比较直观,方便阅读。字符串描述符对于设备来说是可选的,如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0。
2.6设备限定描述符(Device Qualifier Descriptor)
用于描述高速USB设备在其它速率下该设备的总体信息,该信息会根据设备的不同运行速度而变化。例如设备正在全速运行,那么该描述符会通知主机关于设备在高速模式下运行的方式或特性;同样,如果在设备以高速运行,此描述符将告诉主机有关全速配置的信息。
如果USB设备既需要采用高速传输又需要兼容全速传输,则其必须支持设备限定描述符。如果请求了该描述符,而设备仅支持全速操作,那么设备会响应为“STALL”。
2.7其他速率配置描述符(Other Speed Configuration Descriptor)
用于描述高速USB设备在其它速率下的配置信息。其他速度配置描述符与设备限定描述符配合使用,主机只能在成功取得设备限定描述符之后,才能请求其他速度配置描述符。其他速度配置描述符与配置描述符有相同的结构,区别在于其他速度配置描述符是在设备操作当前并未使用的速度模式时才会启用的。
2.8接口电源描述符(Interface Power Descriptor)
待补充????
2.9 HID设备和描述符
USB设备中有一大类就是HID(Human Interface Devices:人机接口)设备,这类设备包括鼠标、键盘、游戏手柄等,它主要用于人与计算机进行交互,并且是USB最早支持的一类设备。HID设备支持低速、全速、高速三种设备。由于HID设备要求用户输入能够得到及时响应,故其传输方式通常采用“中断传输”
HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括三个HID设备类特定的描述符:HID描述符、报告描述符(Report)、实体描述符(Physical)
HID设备的类型定义放在接口描述符中。HID设备描述符与其他五大描述符之间的层次关系如下图:
2.9.1 HID描述符
HID描述符主要用于识别HID通信所使用的额外描述符。
其中下级描述符类型有如下3种定义:
2.9.2 Report描述符
Report(报告)描述符用于描述一个报告以及报告里面数据的用途及属性。USB HID设备是通过报告来给传送数据的,报告其实就是一个数据包,设备通过报告把自己的状态报告给主机。
Report描述符是 USB 的所有描述里面最复杂的一个,因为他和其他的不一样,没有固定的长度和表,是一个可变而且变化多样的一类描述符。例如鼠标,当主机给鼠标设备发送请求后,鼠标需要把自己当前信息上报给主机,这个信息是鼠标左移、鼠标右移、鼠标滑轮滚动、鼠标左键、鼠标右键的当前状态数据的集合,而鼠标各种各样,有的只有两个按键,有的是七八个按键,这么多类型不一样的鼠标,主机是怎么知道鼠标设备发上来的一堆数据(报告)中哪个数据代表哪个按键,报告描述符就是用来解决这个问题。
报告描述符是由一个一个通用项(Item)组成,每一个通用项(Item)可以描述一个或者多个相同功能的数据(比如同时描述8个按钮),包括数据的用途和各种属性。
Item有两种类型,Short Item和Long Item,结构组成如下,一般Short Item使用较多。
以Short Item为例,其域段含义如下:
bSize:代表后面的数据,最大 4 bytes。
bType:代表了这个 Item 是什么类型的 Item,这里有三种大的类型:
- Main(0x00)
- Global(0x01)、
- Local(0x02)。
bTag:代表在对应的 Item 下的更加细的分类,也可以称之为标签。
- Main分为:Input、Output、Feature、Collection、End Collection。
- Global分为:Usage Page、 Logical Minimum、Logical Maximum、Physical Minimum、Physical Maximum、Report Size、Report ID等等。
- Local分为:Usage、Usage Minimum、Usage Maximum、String 等等。
2.9.3 Physical描述符
Physical(实体)描述符用于描述HID设备的行为特性,是可选的描述符,HID设备根据其本体的设备特性选择是否包含实体描述符。
3.USB2.0各种描述符之间的关系
- 一个USB设备只有一个设备描述符;
- 设备描述符决定了该设备有多少种配置,每种配置都有一个配置描述符;
- 配置描述符中又定义了该配置有多少个接口,每个接口都有一个接口描述符;
- 接口描述符中又定义了该接口有多少个端点,每个端点都有一个端点描述符;
- 如果有HID描述符或音频接口描述符,则在接口描述符的后面。
一个设备至少要包含设备描述符、配置描述符和接口描述符,如果USB设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。USB描述符之间的关系是一层一层的,如下图所示。
主机在获取描述符时,首先获取设备描述符,再获取配置描述符,然后根据配置描述符中的配置集合总长度,一次将配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符一次读回。
4. USB请求
在USB总线接口协议中,对命令一词提供的英文单词为“Request”,意为请求的意思,USB主机使用请求来对USB的描述符进行读取和配置,这样USB主机才可以获取设备的产品信息和能力以及完成USB通信。
USB协议中规定了一些标准USB设备请求,如下表所示。
USB设备必须支持标准USB请求。除了这些标准设备请求,USB协议中还允许使用自定义的请求来完成更多的操作。
主机发给设备的请求,如果设备需要返回数据,响应时间必须在500ms内完成,如不返回数据,必须在50ms内完成。否则将产生请求超时错误。
能看到这里,你可真是个狠人,相信已经很累了吧,那就扫个码吧,让你放松一下。