4. USB主机控制器标准
USB 主机控制器(Host Controller)是 USB 系统中负责管理总线事务、处理数据传输、维护帧时序的核心硬件单元。其对应的主机控制器接口(HCI)标准定义了软件驱动与硬件寄存器之间的交互规范。嵌入式 Linux 驱动开发者必须理解不同 HCI 标准的差异,才能正确选择驱动框架并进行移植适配。
本章深入对比四种主流标准:OHCI、UHCI、EHCI 和 xHCI,涵盖其设计背景、硬件差异、适用场景及驱动适配要点。
4.1 四种 HCI 标准概览
下表从总线类型、速度支持、传输描述符结构、中断机制和典型硬件平台五个维度进行横向对比:
| 对比维度 | OHCI | UHCI | EHCI | xHCI |
|---|---|---|---|---|
| 全称 | Open HCI | Universal HCI | Enhanced HCI | eXtensible HCI |
| 总线类型 | USB 1.x | USB 1.x | USB 2.0 | USB 3.x / 2.0 / 1.x |
| 速度支持 | Low/Full Speed | Low/Full Speed | High Speed (480 Mbps) | SuperSpeed (5/10/20 Gbps) + 向下兼容 |
| 传输描述符 | ED + TD 链表 | QH + TD 链表 | iTD/siTD + qTD | TRB 环(Transfer Request Block Ring) |
| 中断机制 | 每帧中断 | 每帧中断 | 微帧中断 | 事件中断 + 中断聚合 |
| 典型硬件 | NXP i.MX6UL, TI AM335x | Intel PIIX4, VIA VT82xx | Synopsys DWC2, Intel ICH | Synopsys DWC3, Intel xHCI |
ohci-hcd 和 uhci-hcd 模块提供;EHCI 对应 ehci-hcd;xHCI 对应 xhci-hcd。内核配置时需根据 SoC 集成的控制器 IP 选择对应的 HCD(Host Controller Driver)。
4.2 OHCI 与 UHCI:USB 1.x 时代的两种设计哲学
OHCI 和 UHCI 都服务于 USB 1.x(Low/Full Speed),但设计理念截然不同:
- OHCI(Open HCI):由 Compaq、Microsoft、National Semiconductor 联合制定。将更多硬件管理功能(如帧调度、SOF 生成、带宽管理)固化在控制器中,驱动负担较轻,适合嵌入式 SoC 集成。
- UHCI(Universal HCI):由 Intel 主导。将调度和带宽管理交给软件驱动,控制器仅提供基本寄存器接口,驱动复杂度高,但硬件实现更简单、成本更低。
下表列出两者在关键硬件差异上的对比:
| 硬件特性 | OHCI | UHCI |
|---|---|---|
| 帧列表管理 | 硬件自动遍历 ED 链表 | 软件维护帧列表(Frame List) |
| 带宽分配 | 硬件保证等时传输带宽 | 软件计算并配置 |
| 中断触发 | 每帧固定中断 | 每帧固定中断 |
| 寄存器数量 | 约 40 个 | 约 20 个 |
| 驱动复杂度 | 低 | 高 |
struct usb_hcd 的初始化顺序,以及 ohci_init() 中 hc_control 寄存器的配置。UHCI 多见于 x86 平台,嵌入式 ARM/MIPS 平台极少使用。
4.3 EHCI:USB 2.0 高速时代的核心标准
EHCI 专为 USB 2.0 High Speed(480 Mbps)设计,同时通过 Companion Controller 机制兼容 Low/Full Speed 设备。其硬件架构引入了 异步列表(Async List) 和 周期性列表(Periodic List) 两条调度链路。
EHCI 的关键硬件差异包括:
- 微帧(Microframe):将 1ms 帧划分为 8 个 125μs 微帧,支持更精细的等时调度。
- iTD/siTD:等时传输描述符(iTD)和拆分等时传输描述符(siTD),用于高速等时和 HS/FS 拆分事务。
- qTD:队列传输描述符,支持批量传输的连续数据段。
- 异步步进(Async Park):硬件自动在多个 QH 之间切换,提高批量传输效率。
companion 属性,否则 OHCI/UHCI 端口无法被正确路由。例如在 i.MX6 平台上,需要设置 fsl,usbphy 和 port-num 属性。
4.4 xHCI:统一 USB 3.x 与向下兼容的现代标准
xHCI 是当前最先进的主机控制器标准,设计目标是用单一控制器统一管理 USB 3.x SuperSpeed、USB 2.0 High Speed 和 USB 1.x Low/Full Speed 设备,彻底淘汰 Companion Controller 方案。
xHCI 的硬件架构核心是 TRB 环(Transfer Request Block Ring),所有传输请求、事件和命令都通过环上的 TRB 条目进行通信。其硬件差异主要体现在:
- 中断聚合(Interrupt Moderation):通过
IMOD寄存器设置中断间隔,减少 CPU 中断负载。 - 命令环(Command Ring):驱动通过命令环下发操作指令(如地址分配、端点配置)。
- 事件环(Event Ring):控制器通过事件环上报完成状态、错误信息等。
- 端口管理:所有端口(USB 2.0 和 USB 3.0)由同一组寄存器管理,无需额外 Companion。
drivers/usb/host/xhci.c)实现了完整的 TRB 环管理。移植时重点关注 xhci_run() 中的环初始化、xhci_irq() 中的事件处理,以及 xhci_mem_init() 中的内存分配。对于嵌入式 SoC 集成的 DWC3 控制器,通常使用 dwc3-of-simple 或 dwc3 驱动层。
4.5 四种标准适用场景对比
下表从实际嵌入式项目角度,给出各标准的推荐适用场景:
| 标准 | 适用场景 | 典型 SoC/平台 | 驱动选择 |
|---|---|---|---|
| OHCI | 仅需 Low/Full Speed 的低成本嵌入式系统;与 EHCI 配合作为 Companion | NXP i.MX6UL, TI AM335x, Allwinner H3 | ohci-hcd |
| UHCI | x86 兼容性要求;老旧 PC 平台 | Intel PIIX4, VIA VT82xx | uhci-hcd |
| EHCI | 需要 USB 2.0 High Speed 的嵌入式设备;与 OHCI 配合使用 | NXP i.MX6Q, Rockchip RK3288, Allwinner A64 | ehci-hcd |
| xHCI | 需要 USB 3.0/3.1 SuperSpeed 的高性能嵌入式系统;单一控制器兼容所有速度 | NXP i.MX8M, Rockchip RK3588, TI AM62x, Intel Alder Lake | xhci-hcd |
4.6 四种标准硬件架构对比 SVG 图
下图从硬件架构层面展示四种 HCI 标准的核心组件与数据流差异:
4.7 驱动移植中的关键差异点
在嵌入式 Linux 驱动移植过程中,不同 HCI 标准带来的差异主要体现在以下方面:
- 寄存器映射与访问:OHCI/EHCI/xHCI 使用 MMIO 寄存器,UHCI 使用 I/O 端口。移植时需在
struct hc_driver中正确设置hcd_priv和start回调。 - 中断处理:OHCI/UHCI 每帧产生中断,EHCI 每微帧产生中断,xHCI 通过事件环聚合中断。中断处理函数中需区分
HCD_FLAG_POLL_RH和HCD_FLAG_DEAD标志。 - DMA 一致性:所有标准都依赖 DMA 传输描述符。xHCI 的 TRB 环要求 64 字节对齐,且必须使用
dma_alloc_coherent分配。 - 电源管理:xHCI 支持
D3cold和USB3 LPM,而 OHCI/EHCI 仅支持D0/D3hot。移植时需实现suspend/resume回调。
&usbh_ehci {
compatible = "fsl,imx6q-usb-ehci";
reg = <0x02184000 0x200>;
interrupts = <0 43 IRQ_TYPE_LEVEL_HIGH>;
fsl,usbphy = <&usbphy1>;
phy_type = "utmi";
port-num = <1>;
companion = <&usbh_ohci>;
status = "okay";
};
&usbh_ohci {
compatible = "fsl,imx6q-usb-ohci";
reg = <0x02184400 0x200>;
interrupts = <0 44 IRQ_TYPE_LEVEL_HIGH>;
fsl,usbphy = <&usbphy1>;
port-num = <1>;
status = "okay";
};
4.8 总结
OHCI、UHCI、EHCI 和 xHCI 分别代表了 USB 主机控制器在不同时代的技术选择。嵌入式 Linux 驱动开发者需要根据 SoC 集成的控制器 IP、目标 USB 速度等级以及功耗要求,选择合适的 HCI 标准和对应的 HCD 驱动。xHCI 作为统一标准,正在逐步取代 EHCI + Companion 方案,成为现代嵌入式系统的主流选择。