可扩展主机控制器接口(xHCI)
2026-04-20
本文链接为:http://www.usbzh.com/article/detail-1616.html ,欢迎转载,转载请附上本文链接。
1. 概述
可扩展主机控制器接口(xHCI)定义了通用串行总线(USB)主机控制器的寄存器级描述。
它能够直接对接 USB 1.x、2.0、3.0 兼容设备,不需要使用配套控制器(如 OHCI/UHCI/EHCI 组合)。
┌─────────────────────────────────────────────────────────────┐
│ xHCI 主机控制器 │
└───────────────────────┬─────────────────────────────────────┘
│
┌───────────────┴───────────────┬───────────────────────────── ┐
│ │ │
┌───────▼───────┐ ┌───────▼───────┐ ┌───────▼───────┐
│ 能力寄存器 CAP │ │ 操作寄存器 OP │ │ 端口寄存器 PORTSC │
│ CAPLENGTH/VERSION │ │ USBCMD/USBSTS/CRCR │ │ 连接/复位/速度 │
│ HCSPARAMS1~3 │ │ DCBAAP/COMMAND RING │ └───────────────┘
│ DBOFF/RTSOFF │ └───────────────┬───────┘
└───────────────┘ │
│
┌───────────────────────────────────────────────▼───────────────────────────────────────────┐
│ 内存数据结构 │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ 设备上下文数组 │───►│ 设备上下文 DC │ │端点上下文 EC │ │ 命令环 CR │ │
│ │ DCBAAP │ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ │
│ └───────────────┘ │ │ │ │
│ │ │ │ │
│ ┌────────▼───────┐ ┌─────────▼───────┐ ┌────────▼───────┐ │
│ │ 输入 TR 环 │ │ 输出 TR 环 │ │ 事件环 ER │◄───────┘
│ │ Transfer Ring │ │ Transfer Ring │ │ Event Ring │
│ └────────┬────────┘ └─────────┬───────┘ └────────┬───────┘
│ │ │ │
└───────────────────────────────┼────────────────────────┼────────────────────┼─────────────┘
│ │ │
┌────────▼────────┐ ┌─────────▼────────┐ ┌──────▼───────┐
│门铃寄存器 Doorbell │ │运行时寄存器Runtime │ │ 中断 IR & IMOD │
│写=通知控制器有任务 │ │MFINDEX/ERSTBA/ERDP│ │ │
└──────────────────── └────────────────────┘ └──────────────┘
┌─────────────────────────────────────────────────────────────┐
│ xHCI 主机控制器 │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────────┴───────────────────┐
│ │
┌─────────▼───────────┐ ┌─────────▼───────────┐
│ 命令环 Command Ring │ │ 事件环 Event Ring │
│ │ │ │
│ 驱动 → 控制器:初始化、配置、命令 │ 控制器 → 驱动:完成事件、中断、错误 │
└─────────┬───────────┘ └─────────┬───────────┘
│ │
│ │
┌─────────▼───────────┐ ┌─────────▼───────────┐
│ 设备上下文数组 DCBAAP │ │ 运行时寄存器 IR │
│ 每个设备槽指向一个设备上下文 │ │ ERST / ERDP / IMOD │
└─────────┬───────────┘ └─────────────────────┘
│
│
┌─────────▼───────────┐
│ 设备上下文 DC │
│ ┌─────────────────┐
│ │ 端点上下文 0 │
│ │ 端点上下文 1 │
│ │ 端点上下文 2 │
│ └────────┬────────┘
└───────────┼───────────┘
│
│ 每个端点一个独立环
▼
┌─────────────────────────────────────────────────────┐
│ 传输环 Transfer Ring │
│ │
│ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ TRB │→ │ TRB │→ │ TRB │→ │ TRB │→ ... │
│ └───────┘ └───────┘ └───────┘ └───────┘ │
│ │
└─────────────────────────────────────────────────────┘
│
│ 驱动写门铃 = 启动传输
▼
┌─────────────────────────────────────────────────────┐
│ 门铃寄存器 Doorbell │
└─────────────────────────────────────────────────────┘
1.1 命令环 Command Ring(CR)
- 驱动发给 xHCI 的全局命令
- 如:初始化、复位、分配设备槽、管理集线器
1.2 事件环 Event Ring(ER)
- xHCI 发给驱动的完成/中断事件
- 传输完成、端口变化、错误等
1.3 设备上下文数组 DCBAAP
- 每个设备占一个槽(Slot)
- 每个槽指向:设备上下文 DC + 多个端点上下文 EC
1.4 传输环 Transfer Ring(TR)
- 每个端点一个独立环
- 真正收发数据的队列
- 完全替代 EHCI 的 QH / qTD / iTD / siTD
1.5 门铃 Doorbell
- 驱动写一下门铃 = 告诉控制器:
“这个端点的传输环有任务了,快来处理”
1.66. 运行时寄存器 Runtime
- 管理事件环、中断、微帧时钟
- 实现中断节流(IMOD)降低 CPU 占用
xHCI 与 EHCI 最大区别
- EHCI:QH + qTD + iTD + siTD + 周期/异步双调度
- xHCI:全统一为 TR 环 + 事件环 + 门铃
2. 技术细节
- xHCI 控制器通过内存映射寄存器与操作系统通信。
- 可在 PCI 配置空间中按固定类别信息搜索:
- 类 ID:0x0C
- 子类 ID:0x03
- 接口号:0x30
- 该设备的配置空间包含两个基地址寄存器:BAR0、BAR1。
- 两个 32 位地址组合成一个 64 位地址,指向控制器寄存器的基地址。
3. 能力寄存器(Capability Registers)
位于 PCI 配置空间给出的内存地址。
| 偏移(十六进制) | 名称 | 说明 |
|---|---|---|
| 00 | CAPLENGTH | 能力寄存器长度 |
| 01 | RSVD | 保留 |
| 02 | HCIVERSION | 接口版本号 |
| 04 | HCSPARAMS1 | 结构参数 1 |
| 08 | HCSPARAMS2 | 结构参数 2 |
| 0C | HCSPARAMS3 | 结构参数 3 |
| 10 | HCCPARAMS1 | 能力参数 |
| 14 | DBOFF | 门铃寄存器偏移 |
| 18 | RTSOFF | 运行时寄存器空间偏移 |
| 1C | HCCPARMS2 | 能力参数 2 |
4. 操作寄存器(Operational Registers)
位于能力寄存器之后,地址 = 基地址 + CAPLENGTH。
| 偏移(十六进制) | 名称 | 说明 |
|---|---|---|
| 00 | USBCMD | USB 命令 |
| 04 | USBSTS | USB 状态 |
| 08 | PAGESIZE | 页大小 |
| 14 | DNCTRL | 设备通知控制 |
| 18 | CRCR | 命令环控制 |
| 30 | DCBAAP | 设备上下文基地址数组指针 |
| 38 | CONFIG | 配置寄存器 |
补充说明:
读取 CRCR 会返回 0,软件需自行维护该地址。
CRCR 第 0 位是 消费者周期状态(CCS) 标志。
5. 端口寄存器(Port Registers)
位于操作寄存器末尾,固定偏移 0x400。
每个根集线器端口对应一组寄存器,数量由 HCSPARAMS1 中的 MaxPorts 决定。
| 偏移(十六进制) | 名称 | 说明 |
|---|---|---|
| 00 | PORTSC | 端口状态与控制 |
| 04 | PORTPMSC | 端口电源管理状态与控制 |
| 08 | PORTLI | 端口链路信息 |
| 0C | 保留 | 保留 |
6. 运行时寄存器(Runtime Registers)
地址 = 基地址 + RTSOFF。
| 偏移(十六进制) | 名称 | 说明 |
|---|---|---|
| 00 | MFINDEX | 微帧索引 |
| 20 | IR0–1023 | 中断器寄存器组 |
从偏移 0x20 开始,每个中断器寄存器组定义事件环的内存地址,用于在 USB 总线上收发事件与数据。
中断器寄存器内部字段:
| 偏移 | 名称 | 说明 |
|---|---|---|
| 00 | IMAN | 中断器管理 |
| 04 | IMOD | 中断节流控制 |
| 08 | ERSTSZ | 事件环段表大小 |
| 10 | ERSTBA | 事件环段表基地址 |
| 18 | ERDP | 事件环出队指针 |
7. 门铃寄存器(Doorbell Registers)
地址 = 基地址 + DBOFF。
长度由 HCSPARAMS1 中的 MaxSlots(最大设备槽数)决定。
每个门铃寄存器 32 位,用于通知控制器:指定设备槽有待处理操作。
8. 虚拟寄存器
xHCI 支持虚拟控制器,可在一台物理机上支持多个虚拟机。
这些寄存器由虚拟机宿主配置管理,为客户机提供一套完整的虚拟寄存器副本。
10. 同时集成 EHC 与 xHC 的芯片组
部分芯片组(如 Intel Panther Point,ID:8086:1e31)同时集成 EHCI 和 xHCI。
两者共享同一组端口,端口归属由硬件开关决定:
- 0 = EHCI
- 1 = xHCI
切换端口归属需操作两个 PCI 配置寄存器:
- USB3_PSSEN(0xD0):开启 USB3 超高速
- XUSB2PR(0xD8):将 USB2 端口切换给 xHCI
示例(将所有端口切到 xHCI):
#define USB3_PSSEN 0xd0
#define XUSB2PR 0xd8
u32 *usb3_pssen = (u32 *)(pci_header + USB3_PSSEN);
u32 *xusb2pr = (u32 *)(pci_header + XUSB2PR);
*usb3_pssen = 0xFFFFFFFF; // 开启 USB3 超高速
*xusb2pr = 0xFFFFFFFF; // USB2 端口切到 xHCI
本文链接为:http://www.usbzh.com/article/detail-1616.html ,欢迎转载,转载请附上本文链接。
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控制器





