1. 参考
本文所描述的信息来自 USB2.0规范《Universal Serial Bus Specification》9.3章和9.4章,有兴趣可以去阅读原文。
2. 概述
- usb2.0规定USB设备必须通过 默认控制管道(Default Control Pipe) 响应主机的请求。
- 请求是使用 控制传输(Control Transfers) 进行的。
注:所有的usb设备都必须支持控制传输
- 请求的内容设置包(Setup Packet)中发送到设备。每个(Setup Packet)有八个字节:
偏移量 (Offset) | 字段 (Field) | 大小 (Size) | 值 (Value) | 描述 (Description) |
---|---|---|---|---|
0 | bmRequestType | 1 | Bitmap | 请求的特征: D7: 数据传输方向 0 = 主机到设备 1 = 设备到主机 D6…5: 类型 0 = 标准(Standard) 1 = 类(Class) 2 = 供应商(Vendor) 3 = 保留 D4…0: 接收者 0 = 设备(Device) 1 = 接口(Interface) 2 = 端点(Endpoint) 3 = 其他 4…31 = 保留 |
1 | bRequest | 1 | Value | 特定请求(参见表9-3) |
2 | wValue | 2 | Value | 字大小字段,根据请求而变化 |
4 | wIndex | 2 | Index或Offset | 字大小字段,根据请求而变化;通常用于传递索引或偏移量 |
6 | wLength | 2 | Count | 如果有数据阶段,要传输的字节数 |
- 本文仅关注 标准请求(Standard Requests), 类请求(Class Requests) 和 供应商请求(Vendor Requests) 暂不讨论。
3. wIndex格式
wIndex
字段通常在请求中用于指定端点或接口,需要遵守特定格式。
3.1 wIndex
指定端点时的格式
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
方向(Direction): 0:OUT端点 1:IN端点 | 保留(重置为零) | 端点编号(Endpoint Number) |
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 |
---|---|---|---|---|---|---|---|
保留(重置为零) |
3.2 wIndex
指定接口时的格式
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
接口编号(Interface Number) |
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 |
---|---|---|---|---|---|---|---|
保留(重置为零) |
4.标准设备请求 (Standard Device Requests)
4.1 标准设备请求 (Standard Device Requests)总表
bmRequestType | bRequest | wValue | wIndex | wLength | Data |
---|---|---|---|---|---|
00000000B 00000001B 00000100B | CLEAR_FEATURE(1) 清除设备或端点的特性 | Feature Selector 特性选择器 | 0 Interface (接口) Endpoint (端点) | 0 | None |
10000000B | GET_CONFIGURATION(8) 获取当前设备配置值 | 0 | 0 | 1 | Configuration Value 当前使用的配置号 |
10000000B | GET_DESCRIPTOR(6) 获取设备描述符 | Descriptor Type (描述符类型) and Descriptor Index (描述符索引) | 0 or Language ID (语言ID) | Descriptor Length (描述符长度) | Descriptor (描述符) |
10000001B | GET_INTERFACE(10) 获取当前接口的备用设置 | 0 | Interface (接口) | 1 | Alternate Interface (备用接口) |
10000000B 00000001B 00000100B | GET_STATUS(0) 获取设备、接口或端点的状态 | 0 | 0 Interface (接口) Endpoint (端点) | 2 | Device (设备), Interface (接口), or Endpoint Status (端点状态) |
00000000B | SET_ADDRESS(5) 设置设备地址 | Device Address (设备地址) | 0 | 0 | None |
00000000B | SET_CONFIGURATION(9) 设置设备配置 | Configuration Value (配置值) | 0 | 0 | None |
00000000B | SET_DESCRIPTOR(7) 设置设备描述符 | Descriptor Type (描述符类型) and Descriptor Index (描述符索引) | 0 or Language ID (语言ID) | Descriptor Length (描述符长度) | Descriptor (描述符) |
00000000B 00000001B 00000100B | SET_FEATURE(3) 设置设备或端点的特性 | Feature Selector (特性选择器) | 0 Interface (接口) Endpoint (端点) | 0 | None |
10000001B | SET_INTERFAC(11) 设置接口的备用设置 | Alternate Setting (备用设置) | Interface (接口) | 0 | None |
10000010B | SYNCH_FRAME(12) 同步帧编号 | 0 | Endpoint (端点) | 2 | Frame Number (帧编号) |
4.2 bRequest 具体数值
以下是将图片中的表格转换为Markdown格式,并在英文名后添加中文名后的结果:
bRequest | Value |
---|---|
GET_STATUS (获取状态) | 0 |
CLEAR_FEATURE (清除功能) | 1 |
Reserved for future use (保留供将来使用) | 2 |
SET_FEATURE (设置功能) | 3 |
Reserved for future use (保留供将来使用) | 4 |
SET_ADDRESS (设置地址) | 5 |
GET_DESCRIPTOR (获取描述符) | 6 |
SET_DESCRIPTOR (设置描述符) | 7 |
GET_CONFIGURATION (获取配置) | 8 |
SET_CONFIGURATION (设置配置) | 9 |
GET_INTERFACE (获取接口) | 10 |
SET_INTERFACE (设置接口) | 11 |
SYNCH_FRAME (同步帧) | 12 |
4.3 Descriptor Types 具体数值
描述符类型 | 值 |
---|---|
设备 (DEVICE) | 1 |
配置 (CONFIGURATION) | 2 |
字符串 (STRING) | 3 |
接口 (INTERFACE) | 4 |
端点 (ENDPOINT) | 5 |
设备限定符 (DEVICE_QUALIFIER) | 6 |
其他速度配置 (OTHER_SPEED_CONFIGURATION) | 7 |
接口电源 (INTERFACE_POWER) | 8 |
注:INTERFACE_POWER描述符在当前版本的USB接口电源管理规范中定义。
5. 总结
本文仅仅介绍一下标准设备请求的格式,关于标准请求的详细信息再之后的文章中进行介绍。