USB 标准请求
2021-06-01
22791
52
USB定义了8个字节的标准请求,通过这些请求,可以对设备的状态进行更改或对设备进行枚举。
USB的标准请求的数据传输方式都是控制传输方式,所以使用的端点是设备的默认端点0。
USB这8个字节的的控制请求不包括传输过程中的数据,但包括了控制请求的数据长度。当数据长度为不为0时,设备或主机向对方传输相应长的数据。这些数据有可能是设备返回给主机的回应数据,也可能是主机发给设备的控制参数。
为什么USB的标准请求命令(不包括数据)的长度是8呢?
这是因为USB协议规定,端点0的最大包长度至少为8字节,所以任何设USB备都可能通过端点0接收字节的标准请求。括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节
USB标准请求的超时
- 主机发给设备的请求,如果设备需要返回数据,响应时间必须在500ms内完成,如不返回数据,必须在50ms内完成。
- 主机发送数据给设备,响应时间为5秒内。
出自USB2.0规范9.2.6.4
USB标准请求的数据结构
USB标准请求的个字节分为5个部分,其变量分别定义为: 1字节的bmRequestType,1 字节的bReqest,2字节的wValue,2字节的wIndex和2字节的wLength.
1字节 | 1字节 | 2字节 | 2字节 | 2字节 |
---|---|---|---|---|
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
typedef union _BM_REQUEST_TYPE {
struct _BM {
UCHAR Recipient:2;
UCHAR Reserved:3;
UCHAR Type:2;
UCHAR Dir:1;
#ifdef __cplusplus
} s;
#else
};
#endif
UCHAR B;
} BM_REQUEST_TYPE, *PBM_REQUEST_TYPE;
typedef struct _USB_DEFAULT_PIPE_SETUP_PACKET {
BM_REQUEST_TYPE bmRequestType;
UCHAR bRequest;
union _wValue {
struct {
UCHAR LowByte;
UCHAR HiByte;
};
USHORT W;
} wValue;
union _wIndex {
struct {
UCHAR LowByte;
UCHAR HiByte;
};
USHORT W;
} wIndex;
USHORT wLength;
} USB_DEFAULT_PIPE_SETUP_PACKET, *PUSB_DEFAULT_PIPE_SETUP_PACKET;
bmRequestType字段(1字节)
D7,下一步数据的传输方向
0 = 主机到设备(SET请求)
1 = 设备到主机(GET请求)
//
// bmRequestType.Dir
//
#define BMREQUEST_HOST_TO_DEVICE 0
#define BMREQUEST_DEVICE_TO_HOST 1
D6-D5,命令的类型
00 = 标准请求命令
01 = 类请求命令(UVC规范中的请求属于类请求命令)
10 = 用户定义的请求命令
11 = 保留
//
// bmRequestType.Type
#define BMREQUEST_STANDARD 0
#define BMREQUEST_CLASS 1
#define BMREQUEST_VENDOR 2
D4-D0,命令接受者的类型
00000 = 接受者为设备
00001 = 接收者为接口
00010 = 接受者为端点
00011 = 其它
4…31 = 保留
其他值保留。
//
// bmRequestType.Recipient
//
#define BMREQUEST_TO_DEVICE 0
#define BMREQUEST_TO_INTERFACE 1
#define BMREQUEST_TO_ENDPOINT 2
#define BMREQUEST_TO_OTHER 3
bRequest字段(1)
标准请求的及代码
bRequest | Value |
---|---|
GET_STATUS | 0 |
CLEAR_FEATURE | 1 |
SET_FEATURE | 3 |
SET_ADDRESS | 5 |
GET_DESCRIPTOR | 6 |
SET_DESCRIPTOR | 7 |
GET_CONFIGURATION | 8 |
SET_CONFIGURATION | 9 |
GET_INTERFACE | 10 |
SET_INTERFACE | 11 |
SYNCH_FRAME | 12 |
SET_ENCRYPTION | 13 (USB2.0以后) |
GET_ENCRYPTION | 14 |
SET_HANDSHAKE | 15 |
GET_HANDSHAKE | 16 |
SET_CONNECTION | 17 |
SET_SECURITY_DATA | 18 |
GET_SECURITY_DATA | 19 |
SET_WUSB_DATA | 20 |
LOOPBACK_DATA_WRITE | 21 |
LOOPBACK_DATA_READ | 22 |
SET_INTERFACE_DS | 23 |
SET_SEL | 48 |
SET_ISOCH_DELAY | 49 |
USB设备请求
bmRequestType | bRequest | 描述 |
---|---|---|
1000 0000b | GET_STATUS (0) | 返回设备的状态。主要用于确定设备是否能够远程唤醒,以及设备是自供电还是总线供电。 |
0000 0000b | CLEAR_FEATURE (01) | 禁用 DEVICE_REMOTE_WAKEUP 或 TEST_MODE 功能。 |
0000 0000b | SET_FEATURE (03) | 启用 DEVICE_REMOTE_WAKEUP 或 TEST_MODE 功能。 |
0000 0000b | 设置地址(05) | 在枚举期间,该指令用于为设备分配地址 (1 -127)。 |
1000 0000b | GET_DESCRIPTOR (06) | 返回由 wValue 参数选择的描述符表。 |
0000 0000b | SET_DESCRIPTOR (07) | 设置指定的描述符值。 |
1000 0000b | GET_CONFIGURATION (08) | 返回活动设备配置的索引值。 |
0000 0000b | 设置配置(09) | 使指定的设备配置变为活动状态。 |
USB接口请求
bmRequestType | bRequest | 描述 |
---|---|---|
1000 0001b | GET_STATUS (0) | 返回接口的状态。目前,两个返回的字节都“保留以备将来使用”。 |
0000 0001b | CLEAR_FEATURE (01) | 禁用界面功能。 |
0000 0001b | SET_FEATURE (03) | 启用指定的接口功能。 |
1000 0001b | GET_INTERFACE (0A) | 检索当前活动接口的索引。 |
0000 0001b | SET_INTERFACE (11) | 用界面指示激活。 |
USB端点请求
bmRequestType | bRequest | 描述 |
---|---|---|
1000 0010b | GET_STATUS (0) | 返回端点的状态。 |
0000 0010b | CLEAR_FEATURE (01) | 禁用端点功能。 |
0000 0010b | SET_FEATURE (03) | 启用端点功能。 |
1000 0010b | SYNCH_FRAME (12) | 用于上报端点同步帧。 |
USB集线器请求/USB HUB请求
- Get Hub Status (GET_STATUS)
- Get Port Status (GET_STATUS)
- Clear Hub Feature (CLEAR_FEATURE)
- Clear Port Feature (CLEAR_FEATURE)
- Get Bus State (GET_STATE) obsolete since USB 2.0
- Set Hub Feature (SET_FEATURE)
- Set Port Feature (SET_FEATURE)
- Get Hub Descriptor (GET_DESCRIPTOR)
- Set Hub Descriptor (SET_DESCRIPTOR)
- Clear TT Buffer (CLEAR_TT_BUFFER)
- Reset TT (RESET_TT)
- Get TT State (GET_TT_STATE)
- Stop TT (STOP_TT)
USB标准请求
不同的请求类型对于其接收者,wValue和wIndex的字段表示的含义有所差别。下面我们进行列表显示:
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) | 数据过程 |
---|---|---|---|---|---|
0x00 | CLEAR_FEATURE(1) | 特性选择 | 0 | 0 | 没有数据 |
0x01 | CLEAR_FEATURE(1) | 特性选择 | 接口号 | 0 | 没有数据 |
0x02 | CLEAR_FEATURE(1) | 特性选择 | 端点号 | 0 | 没有数据 |
0x80 | GET_CONFIGURATION(8) | 0 | 0 | 1 | 配置制 |
0x80 | GET_DESCRIPTOR(6) | 描述符类型(高字节)和描述符索引(低字节) | 0或语言ID(字符串描述符) | 描述符的长度 | 描述符 |
0x81 | GET_INTERFACE(0x0a) | 0 | 接口号 | 1 | 备用(转换)接口 |
0x80 | GET_STATUS(0) | 0 | 0 | 2 | 设备状态 |
0x81 | GET_STATUS(0) | 0 | 接口号 | 2 | 接口状态 |
0x82 | GET_STATUS(0) | 0 | 端点号 | 2 | 端点状态 |
0x00 | SET_ADDRESS(5) | 设备地址 | 0 | 0 | 没有数据 |
0x00 | SET_CONFIGURATION(9) | 配置值 | 0 | 0 | 没有数据 |
0x00 | SET_DESCRIPTOR(7) | 描述符类型(高字节)和描述符索引(低字节) | 0或语言ID(字符串描述符) | 描述符的长度 | 描述符 |
0x00 | SET_FEATURE(3) | 特性选择 | 0 | 0 | 没有数据 |
0x01 | SET_FEATURE(3) | 特性选择 | 接口号 | 0 | 没有数据 |
0x02 | SET_FEATURE(3) | 特性选择 | 端点号 | 0 | 没有数据 |
0x01 | SET_INTERFACE(0x0b) | 备用接口号(转换接口号) | 接口号 | 0 | 没有数据 |
0x82 | SYNCH_FRAME(0x0c) | 0 | 端点号 | 2 | 帧号 |
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936