目录

一、前言

在前一篇笔记中,我们系统拆解了 USB 描述符的类型、层级与作用,而描述符的核心应用场景正是 USB 设备的枚举过程—— 这是 USB 设备接入 Host 后,从物理连接到正常通信的必经流程。枚举过程本质是 Host 通过控制传输读取设备描述符、分配唯一地址、完成功能配置的完整交互,涉及设备状态的多轮切换与标准化的数据格式交互。本次笔记将结合设备状态切换图与控制传输流程,完整梳理 USB 设备的枚举过程,吃透设备从 “物理连接” 到 “功能可用” 的核心逻辑。

二、USB 枚举的核心状态切换流程

以 USB 设备的状态切换图为核心参考,我们可将枚举过程清晰拆解为 6 个关键状态,每个状态对应枚举的核心操作步骤,设备状态切换图如下:

请添加图片描述

  1. Attached(物理连接状态):USB 设备完成与 PC 端的物理连接,D+/D - 引脚产生电平跳变,Host 检测到总线上有新设备接入,但尚未对设备执行任何初始化操作;
  2. Powered(供电与速率识别状态):Host 为接入的 USB 设备提供电源,随后主动发起 Reset(复位)信号,通过检测 D+/D - 的电平变化识别设备的传输速率(低速 / 全速 / 高速),完成设备的基础属性检测;
  3. Default(默认状态):设备完成复位后进入默认工作状态,此时设备的通信地址(addr)固定为 0,Host 仅能通过地址 0 访问设备的端点 0(ep0)—— 这是枚举过程中唯一的通信通道;
  4. Address Assigned(地址分配状态):Host 通过控制传输向设备下发新的唯一通信地址,设备接收并暂存该地址,准备完成地址更新;
  5. Address(地址生效状态):设备将自身通信地址更新为 Host 分配的新地址(addr=N,N 为非 0 的唯一编号),此后 Host 需通过该新地址与设备进行后续交互;
  6. Configured(配置完成状态):Host 读取设备的配置描述符,选择适配的配置下发给设备,设备完成配置后进入可用状态,整个枚举过程正式结束。

需要强调的核心规则:所有 USB 数据传输均由 Host 端主动发起,枚举过程的每一步交互,都是 Host 通过控制传输向设备发起请求、获取信息,设备仅做被动响应,无主动发起通信的能力。

三、枚举的核心:Host 主导的控制传输

枚举过程的所有信息交互,均依托控制传输完成,控制传输是 Host 与设备交换枚举信息的唯一方式,完整的控制传输流程如下图:

请添加图片描述

控制传输的起始核心步骤是 SETUP 令牌包的发送:Host 先发送 SETUP 令牌包,核心作用是告知设备 “即将开始控制传输交互”,但该令牌包仅起基础通知作用,无法明确具体的操作类型(读 / 写)。

控制传输的读、写方向,完全由 SETUP 令牌包之后发送的 DATA0 数据包决定 ——DATA0 数据包是控制传输指令的核心载体,其完整格式包含 Sop(起始标识)、Sync(同步域)、PID(包标识)、Data(核心指令数据)、CRC(校验域)、Eop(结束标识),其中真正决定操作类型的是Data 字段,且该字段必须严格遵循 USB 协议定义的固定格式。

四、SETUP 阶段 DATA0 数据包格式拆解

DATA0 数据包的 Data 字段是控制传输指令的核心,其字节结构有明确的协议规范,具体格式参考下图:

请添加图片描述

我们对 Data 字段的核心字节做精准拆解:

  1. 第 0 字节(指令属性字节)

    • D7 位:标识数据传输方向(IN/OUT),决定 Host 是从设备读取数据,还是向设备写入数据;
    • D6~D5 位:标识传输类别,分为标准、类专属、自定义三类,枚举过程中均使用 “标准” 类别;
    • D4~D0 位:标识传输对象,明确指令的作用目标(设备、接口、端点、其他),枚举过程主要针对 “设备” 对象;
  2. 第 1 字节(设置需求字节):定义具体的枚举操作需求(如读取设备描述符、分配地址、设置配置),后续字节的内容由该字节的取值决定;

  3. 后续字节:根据第 1 字节的设置需求,补充指令的关键参数(如描述符类型、地址值、配置值),最后明确指令涉及的数据长度,保证 Host 与设备对指令的解析完全一致。

五、建立事务的数据格式与工具验证

在控制传输的建立事务(Setup Transaction)中,DATA0 数据包的 Data 字段需遵循 USB 协议预定义的标准化数据格式,具体可参考下表:

请添加图片描述

上表中涉及的各类 “宏”(指令常量)有固定的取值规范,是保证不同厂商设备与 Host 互通的核心,具体取值参考下图:

请添加图片描述

补充:这些宏的取值是 USB 协议统一预定义的标准常量,不同取值对应不同的枚举操作(如 0x06 对应 “读取描述符”,0x05 对应 “设置地址”),是枚举过程中指令互通的基础。

如果想要直观探究枚举过程中 DATA0 数据包的具体格式、宏取值的实际应用,可使用之前提到的 usbprotocolsuite 工具:加载枚举相关的.usb 示例文件,即可可视化查看每一步控制传输的 DATA0 数据包内容,将抽象的协议规范转化为具象的交互数据,加深对枚举过程的理解。

六、总结

  1. USB 枚举分 6 个核心状态,从物理连接到配置完成,设备地址从 0 更新为唯一编号;
  2. 枚举全程由 Host 主导,依托控制传输完成,SETUP 令牌包仅通知,指令由 DATA0 决定;
  3. DATA0 的 Data 字段有固定格式,第 0 字节定方向 / 类别 / 对象,第 1 字节定具体枚举需求。

七、结尾

USB 设备枚举过程是 USB 通信的核心入门流程,吃透状态切换逻辑与控制传输的指令格式,就能真正理解设备从 “物理连接” 到 “功能可用” 的完整过程。枚举过程的每一步都严格遵循协议规范,是理解 USB 标准化通信的绝佳案例。感谢各位的阅读,持续关注本系列笔记,一起深挖 USB 协议细节,夯实嵌入式通信开发的技术功底!

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐