USB标准请求、类特定请求总结
2021-11-30
10170
12
做USB开发,最常见的就是USB的控制请求的那8个字节的分析,如果抓包工具有协议分析那还好说,但是如果不带速协议分析,那其实还是挺郁闷的。所以说,如何快速的通过USB请求的那几个字段定位出是何请求,是可以大大的提高我们的协议分析效率的。
USB的请求这里包括USB的标准请求和特定类请求,其包括以下几个字段:
1字节 | 1字节 | 2字节 | 2字节 | 2字节 |
---|---|---|---|---|
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
各字段的数据长度分别可见上表,其数据组成也固定。
我们提到的USB标准请求和特定类请求的概念这里有必要做一下解释:
- USB标准请求:是USB设备支持的最基本的请求,凡是USB设备都得支持,不管你是HID设备,UVC设备或者UAC等其它设备,或者是自定义USB设备,凡是USB设备,都得支持这些请求。USB标准请求是USB设备通讯的基础,是对USB设备的最基本配置。
- 特定类请求:一些USB设备除了支持USB标准请求外,还支持其特定类的请求。这里的特定类是其它设类型规范,如HID设备,其有HID类特定请求,这些请求只能出现在HID设备中,其它类型的设备不能用。类特定请求是基本该设备类型的协议扩展,常见的类特定请求有UVC设备的类特定请求,UAC设备的类特定请求和HID设备的类特定请求。
我们知道,不管是什么类型的USB设备,按功能划分可分为控制整个USB设备的,控制某个接口、控制某个端点的,所以不管是USB标准请求还是类特定请求,控制请求的目的地就有设备、接口、端点,也有一些自定义的,如其它。
USB设备的请求都是由主机发起,设备接受响应,所以该请求后的数据就有方向性分为IN和OUT,该方向是相对USB主机来说。
以上的解释其实就是USB规范对bmRequestType字段的解释,更详尽的该字段解释可见:http://www.usbzh.com/article/detail-417.html
bmRequestType字段的USB标准请求(USB基本请求)
- 凡是以0x00开头的bmRequestType,都是主机向设备发送数据。
- 凡是以0x01开头的bmRequestType,都是主机向接口发送数据。
- 凡是以0x02开头的bmRequestType,都是主机向端点发送数据。
- 凡是以0x03开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
- 凡是以0x80开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
- 凡是以0x81开头的bmRequestType,都是设备的接口向主机发送数据。
- 凡是以0x82开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
- 凡是以0x83开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据
bmRequestType字段的类特定请求(HID,UVC,UAC,BOT)
类特定请求是在bmRequestType的基础上加0x20,所以是:
- 凡是以0x20开头的bmRequestType,都是主机向设备发送数据。
- 凡是以0x21开头的bmRequestType,都是主机向接口发送数据。
- 凡是以0x22开头的bmRequestType,都是主机向端点发送数据。
- 凡是以0x23开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
- 凡是以0xa0开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
- 凡是以0xa1开头的bmRequestType,都是设备的接口向主机发送数据。
- 凡是以0xa2开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
- 凡是以0xa3开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据
bmRequestType字段的厂商自定义请求(自定义,不常见)
类特定请求是在bmRequestType的基础上加0x40,所以是:
- 凡是以0x40开头的bmRequestType,都是主机向设备发送数据。
- 凡是以0x41开头的bmRequestType,都是主机向接口发送数据。
- 凡是以0x42开头的bmRequestType,都是主机向端点发送数据。
- 凡是以0x43开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
- 凡是以0xc0开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
- 凡是以0xc1开头的bmRequestType,都是设备的接口向主机发送数据。
- 凡是以0xc2开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
- 凡是以0xc3开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据
在USB请求中(包括标准请求和类特定请求)
- 其bRequest是协议类型,如SET_DESCRIPTOR、GET_IDLE,SET_ADDRESS,GET_CUR,SET_CUR等
- wValue 一般是类相关的,在UVC,UAC中可以是选择子,在标准请求中可以是具体的某些数据,比较详尽的内容
- wIndex,一般高字节为USB设备类的信息类型(如ReportId类型,描述符类型,UVC/UAC规范中的UnitId,终端ID等),低字节为接口的ID、端点的ID、ReportId或描述符索引。
- wLength:数据长度,和bmRequestType的最高位相配合使用
相关USB请求参见:
- USB标准请求:http://www.usbzh.com/article/detail-417.html
- UVC类特定请求:http://www.usbzh.com/article/detail-29.html
- UAC类特定请求:http://www.usbzh.com/article/detail-172.html
- HID类特定请求:http://www.usbzh.com/article/detail-686.html
- 大容量存储:http://www.usbzh.com/article/detail-617.html
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936