1. USB 子系统概述:总线历史、版本演进与物理拓扑

通用串行总线(Universal Serial Bus,USB)自 1996 年正式发布以来,已成为嵌入式系统与个人计算领域最成功的即插即用接口。在 Linux 实时通信场景中,USB 中断传输(Interrupt Transfer)的延迟特性直接受总线版本、拓扑深度与主机控制器架构影响。本节从历史演进与物理结构两个维度建立 USB 子系统的全景认知。

1.1 USB 总线发展历史与关键里程碑

USB 标准的诞生源于 1990 年代 PC 外设接口混乱的局面——串口、并口、PS/2、游戏口互不兼容,且不支持热插拔。Intel、Microsoft、IBM 等七家公司联合成立 USB 实施者论坛(USB-IF),旨在定义一种统一、低速低成本、支持热插拔的通用总线。

年份 版本 信号速率 关键特性
1996 USB 1.0 1.5 Mbps(低速) 首次定义热插拔、即插即用、4 线接口
1998 USB 1.1 12 Mbps(全速) 修正时序问题,成为首个广泛部署版本
2000 USB 2.0 480 Mbps(高速) 引入微帧(microframe)、中断传输轮询间隔细化
2008 USB 3.0 5 Gbps(超高速) 增加双总线架构(SS 与非 SS)、全双工传输
2013 USB 3.1 10 Gbps 编码效率提升至 128b/132b,Type-C 接口引入
2017 USB 3.2 20 Gbps 双通道(2-lane)操作,仅限 Type-C
2019 USB4 40 Gbps 基于 Thunderbolt 3 协议隧道,动态带宽分配
实时视角: USB 2.0 引入的微帧(125 µs)是中断传输轮询间隔的最小粒度单位。对于实时通信,USB 2.0 高速模式下的中断端点轮询间隔可设置为 1–255 个微帧(即 125 µs – 31.875 ms),直接影响中断延迟上界。

1.2 USB 版本演进对中断传输的影响

不同 USB 版本在传输机制上的差异,决定了中断传输在实时场景中的适用性:

  • USB 1.x(低速/全速): 帧周期固定为 1 ms。中断传输轮询间隔以帧为单位,最小 1 ms。适用于人机交互设备(HID),但对微秒级实时响应力不从心。
  • USB 2.0(高速): 帧周期仍为 1 ms,但内部划分为 8 个微帧(125 µs 每个)。中断端点可在微帧级别调度,最小轮询间隔 125 µs。这是 Linux 实时 USB 通信的常用基线。
  • USB 3.x(超高速): 采用异步全双工架构,中断传输不再依赖轮询,而是由设备主动发起异步通知(ERDY 握手)。延迟更低,但 Linux 主机控制器驱动(如 xHCI)的调度模型与 2.0 完全不同。
  • USB4: 基于隧道协议,中断传输被封装在更高层协议中,实时性依赖隧道带宽分配策略,目前嵌入式实时场景应用较少。
实践建议: 在嵌入式 Linux 实时通信项目中,优先选择 USB 2.0 高速或 USB 3.0 超高速设备。USB 2.0 高速中断传输的 125 µs 轮询粒度,配合 Linux PREEMPT_RT 内核,可达到 200–500 µs 级别的确定性延迟。

1.3 USB 物理拓扑结构:Host – Device – Hub

USB 总线采用树形星型拓扑,由唯一的主机(Host)作为根节点,通过集线器(Hub)向下扩展,最多支持 127 个设备(含 Hub 自身)。拓扑深度限制为 7 层(含根 Hub)。

USB 物理拓扑结构(Host – Hub – Device) USB 主机控制器 根 Hub(Root Hub) Hub 1(第1层) Hub 2(第1层) Hub 3(第2层) 设备 A(HID) 设备 B(传感器) 设备 C(存储) 设备 D(音频) 拓扑深度限制:最多 7 层(含根 Hub),总设备数 ≤ 127 个(含 Hub) 中断传输延迟随拓扑深度增加而累积,每经过一层 Hub 增加约 1–2 帧延迟

1.4 拓扑结构中的关键角色

角色 功能描述 实时关注点
主机(Host) 唯一的总线主控,负责调度所有传输事务、管理电源、枚举设备 主机控制器类型(EHCI/xHCI)决定中断传输调度算法
设备(Device) 功能端点集合,每个端点有唯一地址和传输类型 中断端点需在描述符中声明 bInterval 轮询间隔
集线器(Hub) 信号中继与拓扑扩展,检测设备连接/断开事件 每层 Hub 引入约 1–2 帧的转发延迟,影响中断响应

1.5 Linux 视角下的 USB 子系统层次

在 Linux 内核中,USB 子系统自底向上分为三层:

  1. 主机控制器驱动层(HCD): 直接操作硬件寄存器,实现 OHCI/UHCI/EHCI/xHCI 规范。实时场景下,xHCI 支持中断事件 TRB 环形缓冲区,延迟更低。
  2. USB 核心层(USB Core): 提供设备枚举、地址分配、管道管理、URB(USB Request Block)生命周期管理。中断传输通过 usb_fill_int_urb() 构造 URB。
  3. 设备驱动层(Device Driver): 实现具体设备功能,如 HID、CDC ACM、音频类。驱动通过 usb_submit_urb() 提交中断传输请求。
Linux USB 子系统软件层次(中断传输路径) 用户空间应用 / 实时任务 USB 设备驱动(HID / CDC / 自定义) USB Core(URB 管理 / 管道 / 调度) 主机控制器驱动(EHCI / xHCI) 中断传输路径
实时陷阱: Linux USB 核心层的 URB 提交与完成回调运行在中断上下文或工作队列中。若设备驱动在 URB 完成回调中执行阻塞操作(如 msleep、mutex_lock),将直接导致中断传输延迟抖动。实时场景下必须使用 GFP_ATOMIC 标志且回调内不可睡眠。

1.6 本章小结

  • USB 从 1.0 到 4.0 的演进中,中断传输的轮询粒度从 1 ms 细化到 125 µs(USB 2.0 高速),再到 USB 3.x 的异步通知模式。
  • 物理拓扑为树形星型结构,深度 ≤ 7 层,设备数 ≤ 127。每层 Hub 引入额外延迟,实时系统应尽量缩短拓扑路径。
  • Linux USB 子系统分为 HCD、USB Core、设备驱动三层。中断传输 URB 的构造与提交是设备驱动的核心工作,回调函数必须遵循原子上下文约束。