USB笔记 标准请求 获取描述符 Get Descriptor
格式
bmRequestType | bRequest | wValue | wIndex | wLength | Data |
---|---|---|---|---|---|
10000000B | GET_DESCRIPTOR | Descriptor Type and Descriptor Index | Zero or Language ID | Descriptor Length | Descriptor |
功能
主机用于请求一个指定的描述符。如果描述符存在,则这个请求返回指定的描述符。
bmRequestType
bmRequestType | 10000000B |
---|---|
bmRequestType.Recipient | 0b00000(Device) |
bmRequestType.Type | 0b00(Standard) |
bmRequestType.Direction | 0b1(Device-to-Host) |
接收端:设备(Device)
类型:标准(Standard)
方向:设备到主机(Device-to-Host)
bRequest
GET_DESCRIPTOR : 0x06
wValue
高字节:描述符类型。
低字节:描述符索引。
该字段在高字节中指定描述符类型,在低字节中指定描述符索引。当一个设备中实现了多个相同类型的描述符时,描述符索引用于选择特定的描述符(仅适用于配置configuration和字符串string描述符)。例如,一个设备可以实现多个配置描述符。对于其他可以通过GetDescriptor()请求的标准描述符,描述符索引应该设置为0。描述符索引的取值范围为从0到比设备实现的该类型描述符(不包括字符串描述符)的数量少1。
下面是一些标准描述符类型的值:
Descriptor Types | Value |
---|---|
DEVICE | 1 |
CONFIGURATION | 2 |
STRING | 3 |
INTERFACE | 4 |
ENDPOINT | 5 |
DEVICE_QUALIFIER | 6 |
OTHER_SPEED_CONFIGURATION | 7 |
INTERFACE_POWER | 8 |
OTG | 9 |
DEBUG | 10 |
INTERFACE_ASSOCIATION | 11 |
SECURITY | 12 |
KEY | 13 |
ENCRYPTION TYPE | 14 |
BOS | 15 |
DEVICE CAPABILITY | 16 |
WIRELESS_ENDPOINT_COMPANION | 17 |
SUPERSPEED_USB_ENDPOINT_COMPANION | 48 |
SUPERSPEEDPLUS_ISOCHRONOUS_ENDPOINT_COMPANION | 49 |
wIndex
对于字符串描述符,该字段为语言ID(Language ID)。
对于其他描述符,该字段为0x0000。
wLength
wLength字段指定要返回的字节数。如果描述符的长度大于wLength字段,则最多只返回wLength的字节数。如果描述符的长度短于wLength字段,则返回整个描述符,也就是实际的长度。
Data
数据阶段(Data stage)的数据包(Data packet):请求的描述符。
说明
对设备的标准请求支持以下几种类型的描述符:device,device_qualifier,configuration,other_speed_configuration,BOS(Binary device Object Store)和string描述符。
high-speed设备支持设备限定描述符(device_qualifier descriptor),以返回设备的非运行速度的信息(包括默认端点的wMaxPacketSize和其他速度的配置数)。
其他速度配置描述符(other_speed_configuration descriptor)返回的信息与配置描述符(configuration descriptor)的结构相同,但如果设备以其他速度运行,则返回配置信息。对配置描述符(configuration descriptor)的请求会在一次请求中返回配置描述符(configuration descriptor)、所有接口描述符(interface descriptor)、端点描述符(endpoint descriptor)和端点伙伴描述符(endpoint companion descriptor)(以Gen X speed运行时)。第一个接口描述符(interface descriptor)跟随配置描述符(configuration descriptor)。第一个接口的端点描述符跟随第一个接口描述符。此外,增强型超高速设备(Enhanced SuperSpeed devices)应为该接口中的每个端点返回端点伙伴描述符(endpoint companion descriptor),以返回增强型超高速设备所需的端点功能,这些功能将不适合现有的端点描述符占用范围内。如果有其他接口,它们的接口描述符、端点描述符和端点伙伴描述符(当以Gen X speed运行时)跟随第一个接口的端点和端点同伴(当以Gen X speed运行时)描述符。
另外通过BOS描述符定义了一个灵活且可扩展的框架,用于描述和添加设备级功能到USB标准规范中。BOS描述符定义了一个根描述符,它与配置描述符类似,是访问一系列相关描述符的基本描述符。主机可以读取BOS描述符并从wTotalLength字段中了解整个设备级描述符集的大小,也可以读入整个BOS描述符集的设备能力。主机无法读取单个设备功能描述符。整个集合只能通过使用GetDescriptor()请求,读取BOS描述符并使用wTotalLength字段中报告的长度来访问。
特定类或特定厂商的描述符遵循它们扩展或修改的标准描述符。
所有设备必须提供一个设备描述符和至少一个配置描述符。如果设备不支持所请求的描述符,它将以请求错误来响应,返回STALL。
支持的状态
默认状态(Default state),地址状态(Address state),配置状态(Configured state)。
当设备处于这些状态时,这是一个有效的请求。
示例
1、device descriptor
设备描述符的获取过程如下:
setup data:
2、device_qualifier descriptor
设备限定描述符的获取过程如下:
setup data:
3、configuration descriptor
配置描述符Configuration Descriptor的获取过程如下:
setup data:
4、other_speed_configuration descriptor
其他速度配置描述符Other_Speed_Configuration Descriptor的获取过程如下:
setup data:
5、BOS descriptor
BOS描述符(BOS Descriptor)的获取过程如下:
setup data:
6、string descriptor
字符串描述符String Descriptor的获取过程如下:
setup data:
1.String Descriptor Zero, Specifying Languages Supported by the Device
2.UNICODE String Descriptor
7.不支持的描述符
[参考资料]
Universal Serial Bus Specification Revision 2.0
Universal Serial Bus 3.1 Specification
Universal Serial Bus 3.2 Specification
USB Complete, 5th Edition
本文链接:https://blog.csdn.net/u012028275/article/details/111826105