1. UHCI 协议概述
1.1 基本概念
UHCI(Universal Host Controller Interface,通用主机控制器接口)是由 Intel 公司主导制定的 USB 主机控制器寄存器级接口规范。它定义了系统软件(USB 驱动程序)与 USB 主机控制器硬件之间的交互标准,使得操作系统能够通过一组标准化的寄存器、内存数据结构(如帧列表、传输描述符 TD、队列头 QH)来管理 USB 总线上的所有传输事务。
UHCI 的核心设计理念是将 USB 协议的时间关键性任务(如帧起始 SOF 生成、总线帧定时)交由硬件完成,而将传输调度、数据缓冲管理交由软件控制。这种软硬件分工使得 UHCI 控制器结构相对简单,适合集成到早期的 PC 芯片组中。
关键角色: UHCI 是 USB 主机控制器与系统软件之间的“契约”,它不描述 USB 电气特性,而是描述软件如何通过内存中的数据结构来驱动 USB 传输。
1.2 历史背景
UHCI 的诞生与 USB 1.0/1.1 标准的推广紧密相关:
- 1995-1996年: USB 1.0 规范发布,定义了 1.5 Mbps(低速)和 12 Mbps(全速)两种速率。Intel 随即提出 UHCI 作为主机控制器的标准接口。
- 1998年: USB 1.1 规范修订,UHCI 1.0 正式发布。同期 Compaq、Microsoft、National Semiconductor 等公司推出了竞争性的 OHCI(Open Host Controller Interface)规范。
- 2000年: USB 2.0 规范发布,引入 480 Mbps 高速模式。Intel 主导的 EHCI(Enhanced Host Controller Interface)成为高速主机控制器的标准,但 UHCI 仍被保留用于兼容全速/低速设备。
- 2002年至今: 在 USB 2.0 系统中,UHCI 与 EHCI 形成“伴侣控制器”架构——EHCI 负责高速传输,UHCI 负责全速/低速传输的兼容性支持。
| 特性 | UHCI (Intel) | OHCI (Compaq/Microsoft) | EHCI (Intel) |
|---|---|---|---|
| 主导厂商 | Intel | Compaq, Microsoft, National Semi. | Intel |
| 适用速率 | 全速 (12 Mbps) / 低速 (1.5 Mbps) | 全速 / 低速 | 高速 (480 Mbps) |
| 硬件复杂度 | 较低(依赖软件调度) | 较高(硬件自动调度) | 高(支持高速拆分事务) |
| 软件负担 | 较重(软件管理帧列表) | 较轻(硬件管理队列) | 中等(异步/周期调度分离) |
| 帧周期 | 1 ms(精确由硬件产生 SOF) | 1 ms | 125 µs(微帧) |
1.3 在 USB 1.x / 2.0 中的角色
UHCI 在 USB 协议栈中的位置如下图所示,它位于系统软件层与 USB 总线物理层之间,承担着“翻译官”和“调度员”的双重角色。
在 USB 1.x 时代,UHCI 是唯一的主机控制器接口标准之一(与 OHCI 并存)。进入 USB 2.0 时代后,UHCI 的角色发生了重要转变:
- 兼容性保障: USB 2.0 的 EHCI 控制器只支持高速模式。当全速或低速设备插入时,系统通过 UHCI(或 OHCI)控制器来管理这些设备的通信。
- 拆分事务(Split Transaction): 在 USB 2.0 的“伴侣控制器”架构中,EHCI 负责将高速帧(125 µs 微帧)中的时间槽分配给 UHCI,UHCI 再在其 1 ms 帧周期内完成全速/低速设备的传输。这种机制称为“拆分事务”,是 FPGA 验证中需要重点关注的时序交互点。
- 等时传输支持: UHCI 原生支持等时传输(Isochronous Transfer),为音频、视频等实时数据流提供确定的带宽和固定的传输延迟。等时传输在 UHCI 的帧列表调度中具有最高优先级,这也是本课程后续章节的核心调试对象。
FPGA 验证视角: 在 FPGA 中实现或验证 UHCI 时,需要特别关注帧列表(Frame List)的循环遍历机制、传输描述符(TD)的状态机跳转、以及等时传输的带宽预留算法。这些是 UHCI 区别于其他主机控制器接口的关键特征。
1.4 UHCI 帧列表与传输描述符结构
UHCI 的核心数据结构包括帧列表(Frame List)和传输描述符(Transfer Descriptor, TD)。帧列表是一个包含 1024 个指针的数组,每个指针指向一个等时传输描述符(Isochronous TD)或队列头(Queue Head, QH)。主机控制器在每个 1 ms 帧周期开始时,从帧列表的当前索引位置开始遍历,依次处理链表中的 TD。
| 参数 | 值 / 范围 | 说明 |
|---|---|---|
| 帧列表大小 | 1024 项 | 每项 4 字节,指向 TD 或 QH |
| 帧周期 | 1 ms | 由硬件 SOF 中断精确控制 |
| TD 类型 | 等时 / 普通 | 等时 TD 无重试机制,普通 TD 支持重试 |
| 最大数据载荷 | 1280 字节(等时) | 受限于 1 ms 帧内的可用带宽 |
| 链路指针 | 32 位物理地址 | 指向下一个 TD 或 QH,形成链表 |
1.5 等时传输在 UHCI 中的特殊性
等时传输是 UHCI 协议中最具挑战性的传输类型,也是本课程 FPGA 验证调试的核心对象。其特殊性体现在以下几个方面:
- 无重试机制: 等时 TD 不包含重试计数器,一旦传输失败(如 CRC 错误、数据溢出),数据直接丢弃,不会自动重发。这要求 FPGA 验证必须确保时序的精确性。
- 带宽预留: 等时传输在帧列表中占据固定位置,软件在初始化时需计算并预留足够的带宽(通常不超过帧总带宽的 90%)。
- 数据有效性标志: 等时 TD 的状态域中包含“数据缓冲区错误”(Data Buffer Error)和“Babble 错误”等标志位,FPGA 验证时需要模拟这些错误条件以测试驱动程序的容错能力。
- 与 DMA 的耦合: UHCI 通过 DMA 引擎直接从系统内存读取 TD 和数据缓冲区。等时传输对 DMA 延迟极其敏感——任何 DMA 延迟都可能导致帧内数据未就绪,进而产生“数据未就绪”(Data Not Ready)错误。
调试要点: 在 FPGA 验证环境中,等时传输的调试通常从以下三个维度展开:① 帧列表遍历时序是否正确;② DMA 读取 TD 和数据缓冲区的延迟是否在 1 ms 帧周期内;③ 等时 TD 的状态回写是否及时且准确。任何一个环节的偏差都会导致等时数据流的中断或质量下降。