Setup 包①
每个 USB 设备都必须响应默认管道上的 Setup 包。Setup 包用于设备的检测和配置,并执行一些常用功能,例如设置 USB 设备的地址,请求设备的描述符或检查端点的状态。
符合 USB 规范的主机希望所有请求最多在 5 秒内得到处理。它还为特定请求指定了更严格的时间规定:
- 不包含数据阶段(data stage)的标准设备请求必须在 50 毫秒内完成。
- 包含数据阶段的标准设备请求必须在请求后 500毫秒 开始返回数据。(1)每个数据包必须在成功传输前一个包的 500毫秒内发送。(2)状态阶段(status stage)必须在最后一个数据包传输后的 50 毫秒内完成。
- SetAddress 命令(该命令包含数据阶段)必须在 50ms 内处理命令并返回状态。在发送下一个请求之前,设备将有 2 毫秒的时间更改地址。
即使对于最慢的设备,这些超时时间也是可以接受的,但是对于调试来说增加了限制。50ms 的时间并不能在 9600bps 的异步串行端口上发送多少字符数据,也没有提供在线调试器/仿真器(In Circuit Debugger/Emulator)单步执行或中断执行以检查内部寄存器的功能。所以 USB 的调试需要使用迥异于其他微控制器的调试方法。
附:随便翻阅XP DDK,可能会注意到主机控制器驱动程序现在具有一个 USBUSER_OP_SEND_ONE_PACKET 命令,该命令有如下注释,“此 API 被 USB 事务传输工具用来实现 ‘单步调试(single step)’”。尽管尚未发布这种工具,但我们希望能很快看到它。
每个请求都以一个 8 字节长的 Setup 包开始,该包具有以下格式:
Offset | Field | Size | Value | Description |
0 | bmRequestType | 1 | Bit-Map | D7 Data Phase Transfer Direction 0 = Host to Device 1 = Device to Host D6..5 Type 0 = Standard 1 = Class 2 = Vendor 3 = Reserved D4..0 Recipient 0 = Device 1 = Interface 2 = Endpoint 3 = Other 4..31 = Reserved |
1 | bRequest | 1 | Value |
Request |
2 | wValue | 2 | Value |
Value |
4 | wIndex | 2 | Index or Offset |
Index |
6 | wLength | 2 | Count |
Number of bytes to transfer if there is a data phase |
标准请求(Standard requests)对所有 USB 设备来说都是通用的,接下来会详细介绍。类请求(Class requests)对于类驱动程序是通用的。例如,所有符合 HID 类的设备将具有一组通用的类特定请求,这些和通信类别的设备不同,和大容量存储类别的设备也不同。
最后,是供应商自己定义的请求。这些是作为 USB 设备设计者可以指定的请求,通常因设备而异,这就看各自的想象力和实现了。
一个通用的请求可以发送到不同的接收者,并基于接收者执行不同的功能。例如,GetStatus 这个标准请求可以发给设备,接口或端点。如果接收者是设备,它将返回一个包含远程唤醒状态以及设备是否自供电的标志;如果接收者是接口,则它始终返回零;如果接收者是端点它将返回该端点的暂停标志(halt flag)。
wValue 和 wIndex 字段允许参数与请求一起传递。wLength 用于指定在存在数据阶段时要传输的字节数。
标准请求
USB 规范的 9.4 节(注:Standard Device Requests)详细说明了需要为每个 USB 设备实现的“标准设备”请求。该标准提供了按请求对项目进行分组的单个表。考虑到大多数固件将按收件者解析设置数据包,我们将选择按收件者分解请求,以简化检查和实施。
标准设备请求
当前有 8 个标准设备请求,所有请求在下表中详细说明。
bmRequestType | bRequest | wValue | wIndex | wLength | Data |
1000 0000b | GET_STATUS (0x00) | Zero | Zero | Two | Device Status |
0000 0000b | CLEAR_FEATURE (0x01) | Feature Selector | Zero | Zero | None |
0000 0000b | SET_FEATURE (0x03) | Feature Selector | Zero | Zero | None |
0000 0000b | SET_ADDRESS (0x05) | Device Address | Zero | Zero | None |
1000 0000b | GET_DESCRIPTOR (0x06) | Descriptor Type & Index | Zero or Language ID | Descriptor Length | Descriptor |
0000 0000b | SET_DESCRIPTOR (0x07) | Descriptor Type & Index | Zero or Language ID | Descriptor Length | Descriptor |
1000 0000b | GET_CONFIGURATION (0x08) | Zero | Zero | 1 | Configuration Value |
0000 0000b | SET_CONFIGURATION (0x09) | Configuration Value | Zero | Zero | None |
- GetStatus:发送给设备的 GetStatus 请求,设备将在数据阶段返回 2Byte 的数据,格式如下:

D0 置位表示是自供电设备,清零表示是总线供电设备。D1 置位表示设备使能了远程唤醒功能,能够在挂起时唤醒主机。远程唤醒位可以通过 SetFeature 和 ClearFeature 设置,参数 DEVICE_REMOTE_WAKEUP (0x01)。
- SetFeature/ClearFeature:SetFeature 和 ClearFeature 可用于设置 boolean 型的功能。指定设备作为接收者,支持的选项只有 DEVICE_REMOTE_WAKEUP 和 TEST_MODE,Test 模式允许设备到处多种条件,更多内容在 USB 规范 2.0 中详述。
- SetAddress:SetAddress 用于枚举(enumeration)阶段为设备分配一个唯一的地址,地址在 wValue 字段中且最大值为 127。该请求特别的地方在于,直到状态阶段完成,设备才完成地址设置。其他所有请求必须在状态阶段之前完成。
- SetDescriptor/GetDescriptor:SetDescriptor/GetDescriptor 用于返回 wValue 字段指定的描述符。一个配置描述符的请求将在一个请求事务中返回设备描述符和所有的接口、端点描述符。(1)端点描述符:不能直接通过 SetDescriptor/GetDescriptor 请求访问;(2)接口描述符:不能直接通过 SetDescriptor/GetDescriptor 请求访问;(3)字符串描述符:wIndex 中包含语言 ID,支持多语言。
- GetConfiguration/SetConfiguration:GetConfiguration/SetConfiguration 用于请求或者获取设备当前的配置。对于 GetConfiguration 请求,将在数据阶段返回 1Byte 指示设备的状态。值为 0 意味着设备还没有完成配置,非 0 表示设备已完成配置。SetConfiguration 用于使能设备,它应该在 wValue 字段的低字节处包含 bConfigurationValue 值以选中要使能的配置。
标准接口请求
规范目前定义了 5 个标准接口请求,在下表中详细说明。有趣的是,只有两个请求执行可理解的操作。
bmRequestType | bRequest | wValue | wIndex | wLength | Data |
1000 0001b | GET_STATUS (0x00) | Zero | Interface | Two | Interface Status |
0000 0001b | CLEAR_FEATURE (0x01) | Feature Selector | Interface | Zero | None |
0000 0001b | SET_FEATURE (0x03) | Feature Selector | Interface | Zero | None |
1000 0001b | GET_INTERFACE (0x0A) | Zero | Interface | One | Alternate Interface |
0000 0001b | SET_INTERFACE (0x11) | Alternative Setting | Interface | Zero | None |
- wIndex 用来指定操作的接口,格式如下:

- GetStatus:GetStatus 用来返回接口的状态,发往接口的该请求应该返回 2Byte 数据,内容 0x00,0x00(这两个字节留着未来使用)。
- SetFeature/ClearFeature:SetFeature 和 ClearFeature 可用于设置 boolean 型的功能。指定接口作为接收者,目前的 USB 规范 Revision 2 版本没有指定任何功能。
- GetInterface/SetInterface:GetInterface 和 SetInterface 用来设置备用的接口,详细内容在接口描述符章节中。
标准端点请求
标准端点请求有 4 个,下表列述:
bmRequestType | bRequest | wValue | Windex | wLength | Data |
1000 0010b | GET_STATUS (0x00) | Zero | Endpoint | Two | Endpoint Status |
0000 0010b | CLEAR_FEATURE (0x01) | Feature Selector | Endpoint | Zero | None |
0000 0010b | SET_FEATURE (0x03) | Feature Selector | Endpoint | Zero | None |
1000 0010b | SYNCH_FRAME (0x12) | Zero | Endpoint | Two | FrameNumber |
- wIndex 用来指定操作的端口和请求的方向,格式如下:

- GetStatus:GetStatus 返回 2Byte 数据,指示端点的状态(Halted/Stalled) ,格式如下:
- SetFeature/ClearFeature:SetFeature 和 ClearFeature 可用于设置端点的功能。标准目前定义了一个端点选项 ENDPOINT_HALT (0x00) ,允许主机停止并清除一个端点。只有端点 0 之外的端点才推荐拥有该项功能。
- SynchFrame:用于报告端点同步帧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!