1. USB协议基础:USB总线拓扑结构、主机与设备角色、USB速度等级概述

1.1 USB总线拓扑结构

USB(Universal Serial Bus)采用星形-级联拓扑结构,由主机(Host)、集线器(Hub)和设备(Device)三层节点构成。整个总线以主机为根,通过集线器向下扩展,最多支持7层深度(含根集线器)。

关键约束:USB 2.0 规范规定最大层数为7层(包括根集线器),超过此限制会导致信号时序不满足规范要求。
USB 总线拓扑结构(星形-级联) USB 主机 (Host) 根集线器 (Root Hub) 集线器 (Hub) L1 集线器 (Hub) L1 集线器 (Hub) L1 设备 (Device) 设备 (Device) 复合设备 (Composite) 集线器 (Hub) L2 设备 (Device) 最大层数:7层(含根集线器) | 每个集线器最多可连接 7 个下游端口

1.2 主机与设备角色

USB 总线采用主从(Master-Slave)通信模型,主机始终控制总线上的所有事务,设备不能主动发起数据传输。

角色 职责 典型实现 数量
主机(Host) 调度总线事务、管理枚举、分配带宽、检测设备插拔 PC、嵌入式 SoC(如 i.MX6/8、RK3399) 每个总线唯一
集线器(Hub) 信号中继、速度转换、电源管理、设备连接检测 独立 Hub 芯片(如 GL850G)、集成在 SoC 内 最多 5 层级联
设备(Device) 响应主机请求、实现具体功能(存储、HID、串口等) U 盘、鼠标、键盘、USB Gadget 最多 127 个(含 Hub)
Gadget 视角:在嵌入式 Linux 中,运行 gadget 驱动的设备扮演的是设备角色,而非主机角色。它通过 dwc2、dwc3 等控制器 IP 模拟 U 盘、网卡、串口等功能。

1.3 USB 速度等级

USB 规范定义了四种速度等级,不同速度在信号编码、线缆长度、电源要求上存在显著差异。

速度等级 速率 信号编码 最大线缆长度 引入版本 典型应用
LS (Low Speed) 1.5 Mbps NRZI + 位填充 5 m USB 1.0 鼠标、键盘、游戏手柄
FS (Full Speed) 12 Mbps NRZI + 位填充 5 m USB 1.1 音频设备、HID、串口转换器
HS (High Speed) 480 Mbps NRZI + 位填充 5 m USB 2.0 U 盘、外置硬盘、视频采集
SS (SuperSpeed) 5 Gbps / 10 Gbps 8b/10b / 128b/132b 3 m USB 3.x 高速存储、显示、网卡
Gadget 开发注意:LS 和 FS 使用 D+/D- 差分信号;HS 在 FS 基础上增加 Chirp 握手;SS 增加独立的 TX/RX 差分对。在 Gadget 驱动中,dwc3 控制器支持 SS,而 dwc2 通常只支持 HS/FS。

1.4 速度协商与识别

设备插入后,主机通过检测 D+/D- 线上的上拉电阻位置和电气特性来判断设备速度等级:

  • LS 设备:D- 线上拉 1.5 kΩ 到 3.3V
  • FS 设备:D+ 线上拉 1.5 kΩ 到 3.3V
  • HS 设备:先以 FS 模式上拉 D+,然后通过 Chirp J/K 握手切换到 HS
  • SS 设备:通过独立的 SS 差分对进行握手,与 D+/D- 无关
USB 速度识别流程(设备插入 → 枚举前) 设备插入端口 主机检测上拉电阻 ? LS (D- 上拉) FS (D+ 上拉) FS 模式 → Chirp 握手 → 切换到 HS SS (独立差分对握手) SS 设备兼容 HS/FS 端口时降速运行 HS 设备插入 SS 端口时以 HS 运行

1.5 速度等级对 Gadget 开发的影响

在编写 USB Gadget 驱动时,速度等级直接影响以下方面:

  • 端点数量:LS 最多 3 个端点(含控制端点 0),FS/HS 最多 16 个 IN + 16 个 OUT,SS 最多 32 个 IN + 32 个 OUT
  • 传输类型:LS 仅支持控制传输和中断传输;FS/HS/SS 支持控制、中断、批量、等时四种传输类型
  • 数据包大小:控制端点最大包大小:LS=8 字节,FS=64 字节,HS=64 字节,SS=512 字节
  • 描述符配置:Gadget 驱动需要为不同速度提供独立的描述符(usb_descriptor_header 中的 speed 标志)
实践要点:在 Linux Gadget 驱动中,使用 usb_assign_descriptors() 函数为不同速度注册描述符。如果只注册 FS 描述符,HS 设备会降速到 FS 运行;如果只注册 HS 描述符,FS 设备将无法枚举。
/* Linux Gadget 驱动中速度相关描述符注册示例 */
static struct usb_descriptor_header *fs_function_descs[] = {
    (struct usb_descriptor_header *) &fs_interface_desc,
    (struct usb_descriptor_header *) &fs_endpoint_desc,
    NULL,
};

static struct usb_descriptor_header *hs_function_descs[] = {
    (struct usb_descriptor_header *) &hs_interface_desc,
    (struct usb_descriptor_header *) &hs_endpoint_desc,
    NULL,
};

static struct usb_descriptor_header *ss_function_descs[] = {
    (struct usb_descriptor_header *) &ss_interface_desc,
    (struct usb_descriptor_header *) &ss_endpoint_desc,
    (struct usb_descriptor_header *) &ss_ep_comp_desc,  /* SuperSpeed 端点伴侣描述符 */
    NULL,
};

/* 在 bind 函数中注册 */
usb_assign_descriptors(fs_function_descs, hs_function_descs, ss_function_descs, NULL);

1.6 本章小结

知识点 核心要点
拓扑结构 星形-级联,主机为根,最多 7 层,127 个设备
主机角色 唯一总线主控,调度所有事务,管理枚举和带宽
设备角色 被动响应,Gadget 驱动实现设备功能
速度等级 LS 1.5M / FS 12M / HS 480M / SS 5G+
速度识别 上拉电阻位置 + Chirp 握手 + 独立差分对
Gadget 影响 端点数量、传输类型、包大小、描述符注册均与速度相关