USB 2.0 典型枚举流程
概述
本文从 USB 2.0 协议层 描述设备插入后、类驱动绑定前的典型枚举序列,聚焦控制传输三阶段(SETUP / 数据 / 状态)以及 Token、DATA0/DATA1、ACK 的交替关系(不含 NAK)。
与 Linux 内核 usbcore 的对应关系:用户看到设备节点之前,内核会完成上述标准请求;驱动 probe 发生在 SET_CONFIGURATION 之后。系列续篇见侧边栏 Linux 内核 → USB 子系统。
参与者为 Host 与 Device。每笔控制传输均符合规范中的 SETUP、可选数据阶段、状态阶段;GET_DESCRIPTOR 类请求的数据阶段为 IN,状态为 OUT + DATA1(ZLP);SET_ADDRESS / SET_CONFIGURATION 无数据阶段,状态阶段为 IN + 设备 DATA1(ZLP)。
阶段速查
| 步骤 | 请求 | 要点 |
|---|---|---|
| ① | GET_DESCRIPTOR (DEVICE, 8B) | 地址 0,先拿 bMaxPacketSize0 |
| ② | SET_ADDRESS | 分配新地址,状态阶段 ZLP |
| ③ | GET_DESCRIPTOR (DEVICE, 完整) | 读 18 字节设备描述符,可能多包 |
| ④ | GET_DESCRIPTOR (CONFIGURATION) | 按 wTotalLength 读整棵配置描述符树 |
| ⑤⑥ | GET_DESCRIPTOR (STRING) | 语言 ID + 厂商/产品/序列号等字符串 |
| ⑦ | SET_CONFIGURATION | 选中配置,枚举核心结束 |
抓包文件
可将 Wireshark 抓包 usb.pcapng 放到 docs/public/files/ 目录,重新构建后通过 /files/usb.pcapng 下载。
说明
- 未体现:
GET_STATUS、SET_INTERFACE、HIDSET_IDLE、MS OS 描述符、高速 Split 等;均为同类控制传输或总线扩展事务,可接在 SET_CONFIGURATION 前后。