增强型主机控制器接口(EHCI)
2026-04-20
本文链接为:http://www.usbzh.com/article/detail-1611.html ,欢迎转载,转载请附上本文链接。
EHCI(Enhanced Host Controller Interface) 是 USB 2.0 唯一指定的主机控制器接口标准,由 Intel 主导开发,USB 实施者论坛(USB‑IF)强制统一规范,解决了 USB 1.x 时代 OHCI 与 UHCI 两套不兼容标准共存的问题。
EHCI规范
USB-IF坚持由英特尔生产单一实现,所以USB2.0只有了一个标准EHCI。
- https://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/ehci-specification-for-usb.pdf
- https://www.intel.la/content/dam/www/public/us/en/documents/technical-specifications/ehci-v1-1-addendum.pdf
1 接口概述
- PC 上 EHCI 控制器仅挂载于 PCI 总线,这是规范规定的唯一访问方式。
- USB 2.0 兼容 USB 1.x 设备,但 EHCI 本身不直接支持低速/全速设备,需搭配配套控制器companion controllers(UHCI 或 OHCI 二选一,不会同时存在)。
如下示意(左下角,配套UHCI或者OHCI)
- PCI 识别标识:
- 类代码:0x0C
- 子类代码:0x03
- 接口代码:0x20
- 寄存器基地址存于 PCI 配置空间的 BAR0,为内存映射地址。
2 能力寄存器(Capability Registers)
位于 PCI BAR0 给出的内存地址,只读,描述控制器硬件属性。
| 偏移(十六进制) | 名称 | 说明 |
|---|---|---|
| 00 | CAPLENGTH | 能力寄存器区域长度 |
| 01 | 保留 | — |
| 02 | HCIVERSION | 接口版本号(BCD 格式) |
| 04 | HCSPARAMS | 结构参数 |
| 08 | HCCPARAMS | 能力参数 |
| 0C | HCSP‑PORTROUTE | 配套端口路由描述 |
3 运行寄存器(Operation Registers)
位于能力寄存器之后,地址 = BAR0 基地址 + CAPLENGTH,用于控制与状态查询。
| 偏移(十六进制) | 名称 | 说明 |
|---|---|---|
| 00 | USBCMD | USB 命令寄存器-启动 / 停止控制器、复位、使能调度 |
| 04 | USBSTS | USB 状态寄存器-中断、错误、端口变化 |
| 08 | USBINTR | USB 中断使能寄存器 |
| 0C | FRINDEX | USB 帧索引 -当前微帧编号(低 13 位有效) |
| 10 | CTRLDSSEGMENT | 4G 段选择器 |
| 14 | PERIODICLISTBASE | 周期列表基地址 |
| 18 | ASYNCLISTADDR | 异步列表下一项地址 - 异步队列链表头 |
| 40 | CONFIGFLAG | 配置标志寄存器 |
| 44 | PORTSC[1–N_PORTS] | 端口状态/控制寄存器组-端口连接、复位、速度、使能 |
3.1 USB 命令寄存器(USBCMD)
| 位域 | 名称 | 说明 |
|---|---|---|
| 31–24 | 保留 | — |
| 23–16 | 中断阈值 | 两次中断间处理的微帧数 |
| 15–12 | 保留 | — |
| 11 | 异步调度暂停模式使能 | — |
| 10 | 保留 | — |
| 9–8 | 异步调度暂停模式计数 | — |
| 7 | 轻量级主机控制器复位 | 复位控制器,不影响已连接设备 |
| 6 | 异步推进门铃中断 | 软件可触发中断 |
| 5 | 异步调度使能 | — |
| 4 | 周期调度使能 | — |
| 3–2 | 可编程帧列表大小 | 配置帧列表容量 |
| 1 | 主机控制器复位 | 全局硬复位 |
| 0 | 运行 | 启动/停止控制器 |
3.2 USB 状态寄存器(USBSTS)
| 位域 | 名称 | 说明 |
|---|---|---|
| 31–16 | 保留 | — |
| 15 | 异步调度状态 | — |
| 14 | 周期调度状态 | — |
| 13 | 回收状态 | — |
| 12 | 已停机 | 控制器已停止 |
| 11–6 | 保留 | — |
| 5 | 门铃中断 | — |
| 4 | 主机系统错误 | — |
| 3 | 帧列表翻转 | — |
| 2 | 端口变化检测 | — |
| 1 | USB 错误中断 | — |
| 0 | USB 传输中断 | — |
3.3 USB 中断使能寄存器(USBINTR)
| 位域 | 名称 | 说明 |
|---|---|---|
| 31–6 | 保留 | — |
| 5 | 异步推进中断使能 | — |
| 4 | 主机系统错误中断使能 | — |
| 3 | 帧列表翻转中断使能 | — |
| 2 | 端口变化中断使能 | — |
| 1 | USB 错误中断使能 | — |
| 0 | USB 传输中断使能 | — |
3.4 端口状态/控制寄存器(PORTSC)
| 位域 | 名称 | 说明 |
|---|---|---|
| 31–23 | 保留 | — |
| 22 | 过流唤醒使能 | — |
| 21 | 断开唤醒使能 | — |
| 20 | 连接唤醒使能 | — |
| 19–16 | 端口测试控制 | 测试模式配置 |
| 15–14 | 端口指示控制 | 0=关闭,1=黄,2=绿 |
| 13 | 配套端口控制 | 0=本控制器,1=配套控制器 |
| 12 | 端口供电 | — |
| 11–10 | 线路状态 | 差分信号电平 |
| 9 | 保留 | — |
| 8 | 端口复位 | — |
| 7 | 挂起 | — |
| 6 | 强制端口恢复 | — |
| 5 | 过流状态变化 | — |
| 4 | 过流 | — |
| 3 | 端口使能变化 | — |
| 2 | 端口使能 | — |
| 1 | 连接状态变化 | — |
| 0 | 已连接 | — |
4 异步队列列表(Asynchronous Queue List)
异步队列是队列头(Queue Head)构成的环形链表,每个队列头指向链表下一个队列头及本组第一个传输描述符(TD)。
- 使能异步调度后,控制器从 ASYNCLISTADDR 指向的第一个队列头开始遍历,直到遇到回收头标志的队列头。
- 首个队列头不检查回收头标志,可将首节点设为回收头形成闭环。
- 队列头缓存当前 TD,硬件直接用此副本执行传输。
4.1 队列头(Queue Head)
| 偏移(十六进制) | 名称 | 说明 |
|---|---|---|
| 00 | 水平链接指针 | 指向下一个队列头/TD |
| 04 | 端点特性 | 设备/端点/速度/包长等核心属性 |
| 08 | 端点能力 | 高带宽、拆分事务、调度掩码 |
| 0C | 当前 TD 地址 | 正在执行的 TD 物理地址 |
| 10 | 当前 TD 工作区 | 硬件缓存的 TD 副本 |
4.2 水平链接指针
| 位域 | 名称 | 说明 |
|---|---|---|
| 31–5 | 下一个队列头 | 环形链表中下一个队列头地址 |
| 4–3 | 保留 | — |
| 2–1 | 下一个队列类型 | 0=等时 TD,1=队列头,2=拆分事务等时 TD,3=帧跨度遍历节点 |
| 0 | 终止位 | 周期列表的尾节点置 1;异步列表不使用 |
4.3 端点特性
| 位域 | 名称 | 说明 |
|---|---|---|
| 31–28 | NAK 重载 | NAK 重试计数 |
| 27 | 控制端点 | 高速设备不使用 |
| 26–16 | 最大包长度 | 端点单次最大载荷 |
| 15 | 回收链表头 | 标记为异步列表首节点 |
| 14 | 数据翻转控制 | 为 1 则使用 TD 中的数据翻转位 |
| 13–12 | 端点速度 | 0=全速,1=低速,2=高速 |
| 11–8 | 端点号 | 端点编号 |
| 7 | 失活 | 仅周期列表使用 |
| 6–0 | 设备地址 | USB 设备地址 |
4.4 端点能力
| 位域 | 名称 | 说明 |
|---|---|---|
| 31–30 | 高带宽管道乘数 | 必须 >0,对应 1/2/3 事务/微帧 |
| 29–23 | 端口号 | 用于拆分事务 |
| 22–16 | 集线器地址 | 用于拆分事务 |
| 15–8 | 拆分完成掩码 | 用于拆分事务 |
| 7–0 | 中断调度掩码 | 用于拆分事务 |
EHCI 核心速记
一、基础框架
二、调度结构(最重要)
EHCI 分两套调度:
1. 周期性调度(Periodic)
用于:中断 + 等时 Isoch
结构:
- Periodic List(帧列表)
- 每微帧一个节点
- 节点可以是:
- iTD(等时传输描述符)
- siTD(拆分等时,用于 FS/LS)
- QH(中断队列头)
2. 异步调度(Asynchronous)
用于:控制 + 批量
结构:
- 一条环形链表:Async List
- 节点都是 QH(Queue Head)
- 每个 QH 下挂 qTD(队列传输描述符)
三、四大数据结构
EHCI 主机控制器
├─ 周期性调度列表 (Periodic List) 〈= 中断、等时传输
│ ├─ 微帧 0 ~ 微帧 7FFF
│ │
│ ├─ 节点类型:
│ │ ├─ iTD → 高速等时 Isoch
│ │ ├─ siTD → 全速/低速等时(拆分事务)
│ │ └─ QH → 中断端点(中断QH)
│ │ └─ qTD 链 → 中断传输
│
└─ 异步调度列表 (Async List) 〈= 控制、批量传输
└─ QH 环形链表
└─ qTD 链 → 控制/批量传输
1. QH —— Queue Head(队列头)
- 代表一个端点
- 保存:设备地址、端点号、最大包长、速度
- 内部缓存一个 qTD,硬件直接用
- 异步/中断都用 QH
2. qTD —— 普通传输描述符
- 用于:控制、批量、普通中断
- 一个 qTD 对应一次或多个数据包
- 记录缓冲区、长度、状态、DATA0/DATA1 翻转
- 不支持微帧内 burst
3. iTD —— 等时传输描述符
- 仅用于高速等时 Isoch
- 一个 iTD 可以覆盖 8 个微帧
- 每个微帧可发 1~3 个数据包(burst)
- 高带宽 = burst = 多事务/微帧
4. siTD —— 拆分等时描述符
- 用于:全速/低速等时
- 通过 EHCI 拆分事务(Split Transaction)转发
- 和高速 burst 无关
四、高带宽 burst 考点(你最关心)
一句话核心
高带宽 = 一个微帧内同一个端点连续多次事务 = burst
由 QH 中 Multiplier(乘数) 控制:
- 00 = 1 事务/微帧
- 01 = 2 事务/微帧
- 10 = 3 事务/微帧
- 11 = 保留
只有两类端点能用:
- 高速等时端点
- 高速中断端点
实现结构:
- 等时:iTD 直接支持多包 burst
- 中断:QH 下多个 qTD 连发实现 burst
五、微帧与事务数量(标准答案)
- 1 微帧 = 125μs
- 单个端点最大事务数:3 个(burst)
- 整个微帧总事务数:数十个(由总线带宽决定)
- 周期性传输最多占用微帧 80% 时间
- 异步传输至少保留 20%
六、寄存器极简版
核心运行寄存器
- USBCMD:启动/停止控制器、复位、使能调度
- USBSTS:中断、错误、端口变化
- FRINDEX:当前微帧编号(低 13 位有效)
- PERIODICLISTBASE:周期性列表基址
- ASYNCLISTADDR:异步队列链表头
- PORTSC:端口连接、复位、速度、使能
七、一句话串联所有概念
本文链接为:http://www.usbzh.com/article/detail-1611.html ,欢迎转载,转载请附上本文链接。EHCI 使用 微帧(125μs) 调度,
iTD/QH 实现 1 微帧最多 3 个事务的 burst 高带宽传输,
周期性调度处理等时/中断,异步调度处理控制/批量,
所有传输由 TD/QH 描述,硬件自动执行。
翻译原文:https://wiki.osdev.org/Enhanced_Host_Controller_Interface
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936 USB技术交流3:1031974172
USB控制器





