Skip to content

USB 2.0 典型枚举流程

概述

本文从 USB 2.0 协议层 描述设备插入后、类驱动绑定前的典型枚举序列,聚焦控制传输三阶段(SETUP / 数据 / 状态)以及 Token、DATA0/DATA1、ACK 的交替关系(不含 NAK)。

与 Linux 内核 usbcore 的对应关系:用户看到设备节点之前,内核会完成上述标准请求;驱动 probe 发生在 SET_CONFIGURATION 之后。系列续篇见侧边栏 Linux 内核 → USB 子系统

参与者为 HostDevice。每笔控制传输均符合规范中的 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_STATUSSET_INTERFACE、HID SET_IDLE、MS OS 描述符、高速 Split 等;均为同类控制传输或总线扩展事务,可接在 SET_CONFIGURATION 前后。

基于 VitePress 构建