1. USB协议基础:USB总线拓扑结构、主机与设备角色、USB速度等级概述
1.1 USB总线拓扑结构
USB(Universal Serial Bus)采用星形-级联拓扑结构,由主机(Host)、集线器(Hub)和设备(Device)三层节点构成。整个总线以主机为根,通过集线器向下扩展,最多支持7层深度(含根集线器)。
关键约束:USB 2.0 规范规定最大层数为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- 无关
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 影响 | 端点数量、传输类型、包大小、描述符注册均与速度相关 |