4. USB 主机控制器标准:OHCI、UHCI、EHCI、xHCI 标准对比

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
适配提示: 在嵌入式 Linux 中,OHCI 和 UHCI 驱动通常由 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 个
驱动复杂度 低 高
移植要点: 在嵌入式 Linux 中,OHCI 驱动通常与 EHCI 或 xHCI 配合使用(作为 Companion Controller)。移植时需注意 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 之间切换,提高批量传输效率。
常见陷阱: EHCI 的 Companion Controller 配置在 Device Tree 中必须正确声明 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。
驱动适配: Linux 内核的 xHCI 驱动(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 标准的核心组件与数据流差异:

四种 USB 主机控制器标准硬件架构对比 四种 USB 主机控制器标准硬件架构对比 OHCI USB 1.x Low/Full Speed 硬件 ED 链表遍历 硬件带宽管理 每帧中断 UHCI USB 1.x Low/Full Speed 软件帧列表管理 软件带宽分配 每帧中断 EHCI USB 2.0 High Speed 异步列表 + 周期性列表 iTD / siTD / qTD 微帧中断 xHCI USB 3.x / 2.0 / 1.x TRB 命令环 TRB 事件环 中断聚合 说明:OHCI 和 UHCI 仅支持 USB 1.x;EHCI 支持 USB 2.0 并依赖 Companion Controller 兼容低速设备;xHCI 统一管理所有速度等级,无需 Companion。 USB 主机控制器标准演进时间线 OHCI / UHCI 1996 - USB 1.0 EHCI 2000 - USB 2.0 xHCI 2008 - USB 3.0 xHCI 1.2 2013 - USB 3.1

4.7 驱动移植中的关键差异点

在嵌入式 Linux 驱动移植过程中,不同 HCI 标准带来的差异主要体现在以下方面:

  1. 寄存器映射与访问:OHCI/EHCI/xHCI 使用 MMIO 寄存器,UHCI 使用 I/O 端口。移植时需在 struct hc_driver 中正确设置 hcd_priv 和 start 回调。
  2. 中断处理:OHCI/UHCI 每帧产生中断,EHCI 每微帧产生中断,xHCI 通过事件环聚合中断。中断处理函数中需区分 HCD_FLAG_POLL_RH 和 HCD_FLAG_DEAD 标志。
  3. DMA 一致性:所有标准都依赖 DMA 传输描述符。xHCI 的 TRB 环要求 64 字节对齐,且必须使用 dma_alloc_coherent 分配。
  4. 电源管理:xHCI 支持 D3cold 和 USB3 LPM,而 OHCI/EHCI 仅支持 D0/D3hot。移植时需实现 suspend/resume 回调。
代码示例: 在 Device Tree 中声明 EHCI + OHCI Companion 控制器的典型配置:
&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 方案,成为现代嵌入式系统的主流选择。