可扩展主机控制器接口

可扩展主机控制器接口（eXtensible Host Controller Interface，缩写xHCI）是一种计算机接口规范，其定义了用于通用串行总线（USB）主机控制器的寄存器级描述，可以与USB 1.x、2.0和3.x兼容设备接口连接。该规范也被称为USB 3.0主机控制器规范。

## 架构目标

xHCI在许多方面相较前几代USB主机控制器接口架构有着根本突破。前几代是：开放主机控制器接口（OHCI）、通用主机控制器接口（UHCI）和增强主机控制器接口（EHCI）。以下是xHCI架构的主要目标：

- 高效运行 – 闲置耗电与性能优于传统USB主机控制器架构。
- 与现有USB软件模型完全一致的设备级编程模型
- 将提供给软件的主机控制器接口与底层USB协议解耦
- 最小化主机内存访问，完全消除USB设备空闲时的主机内存访问
- 消除寄存器写入并最小化正常数据传输时的寄存器读取
- 消除“同伴控制器”模式
- 在系统资源受限情况下启用硬件“故障转移”模式，因此设备仍然可以访问，但可能有不利的功耗/性能
- 提供不同市场不同硬件功能的能力，例如针对特定市场的主机控制器功率、性能和成本折衷
- 定义一个可扩展架构，为新的USB规范和技术提供一条简单的路径，例如更高带宽接口、光传输介质等，使其不需要再定义一个USB主机控制器接口

## 架构细节

### 支持USB 1/2/3的速度

OHCI及UHCI控制器仅支持USB 1 设备（1.5 Mbit/s和12 Mbit/s）而EHCI仅支持USB 2 设备（480 Mbit/s）。

xHCI架构在设计上支持USB 1/2/3速度，包括USB 3 Gen1（5 Gbit/s）和USB 3 Gen2（10Gbit/s），且只需单个驱动程序堆栈。

### 供电效能

在USB最早于1995年开发之时，它是为台式机平台而设计，防止PC上的连接器不断增加（例如PS/2、串行端口、并行端口、游戏端口等），当时主机的功耗并不是重要的考虑因素。在那之后，移动平台已经成为选择之一，而其电池使功耗成为一项关键的考虑因素。传统USB主机控制器（OHCI、UHCI和EHCI）的架构非常相似，在USB上执行的事务的“日程安排”由主机内存中的软件构建，并且主机控制器硬件将连续读取调度以确定在USB上需要驱动的事务，哪怕没有数据被移动。另外，在从设备读取之时，即使没有要数据的读取，也会在每个调度间隔之时轮询设备。

- xHCI消除了基于USB事务日程的主机内存，在没有USB数据移动时，可以实现主机内存零活动。
- xHCI允许USB 3.0或更高版本的设备在数据可被读取时通知主机控制器，从而减少定期轮询设备的需求；并将使用中断处理的USB 2.0和1.1设备的管理从CPU驱动的USB驱动程序移动到USB主机控制器。如果不需要任何更改、并且如果没有任何设备有任何中断发送，EHCI、OHCI和UHCI主机控制器会自动为CPU处理轮询，但它们都依赖CPU为控制器设置日程表。如果使用中断事务的任何USB设备有要发送的数据，则xHCI主机控制器将发送中断，通知CPU有需要处理的USB中断事务。由于CPU不再需要管理USB总线的轮询，因此可以在低功耗状态下保持更久。
- xHCI不要求其实现支持所有高级的USB 2和3电源管理功能，包括USB 2 LPM、USB 3 U1和U2状态、HERD、LTM、功能唤醒等。但是这些功能是实现xHCI所有优点的必要条件。

### 虚拟化支持

传统的USB主机-控制器架构在应用于虚拟化环境时表现出一些严重的缺陷。传统的USB主机-控制器接口定义了一个相对简单的硬件数据泵；其中与整体总线管理（带宽分配、地址分配等）相关的关键状态驻留在主机适配器驱动程序（HCD）的软件中。尝试将标准的硬件IO虚拟化技术（复制I/O接口寄存器）应用于传统USB主机控制器接口是有问题的，因为跨越虚拟机（VM）的关键状态的管理不适用于硬件。xHCI架构将这一关键状态的控制转移到硬件，从而实现跨虚拟机的USB资源管理。xHCI虚拟化功能还提供：

- 各个USB设备（不管其在总线拓扑中的位置）直接分配给任何虚拟机
- 最小化运行时虚拟机之间的通信
- 支持原生USB设备共享
- 支持PCIe SR-IOV（single root I/O virtualization）

### 简化驱动程序架构

EHCI使用OHCI或UHCI控制器作为“同伴控制器”，其中USB 2设备通过EHCI堆栈管理，并且EHCI的端口逻辑允许将低速或全速USB设备路由到“同伴”的UHCI或OHCI控制器，其中低速或全速USB设备通过相应的UHCI或OHCI堆栈管理。举例来说，提供4个USB“标准A”连接器的USB 2 PCIe主机控制器卡通常会向系统软件提供一个4端口EHCI和两个2端口OHCI控制器。当一个高速USB设备连接到4个连接器之一时，该设备是受EHCI控制器的4个根集线器端口之一管理。如果一个低速或全速USB设备连接到连接器1或2，它将被路由到其中一个OHCI控制器的根集线器端口来管理，以及连接到连接器3或4的低速和全速USB设备将路由到另一个OHCI控制器的根集线器端口。EHCI对高速USB设备以及低速和全速USB设备组独立主机控制器的依赖性导致EHCI和OHCI/UHCI驱动程序之间的复杂交互和依赖性。

- xHCI架构消除了同伴控制器及其单独的驱动程序堆栈的需求。
- 以前由驱动程序执行的日程合并、带宽管理和USB设备地址分配功能，现在转入xHCI硬件，这使xHCI的软件堆栈更简单、精简、更低延迟。

### 流支持

USB 3.0 SuperSpeed规范中增加了流支持，这主要是为通过USB实现高性能存储操作。USB端点与系统内存的缓冲区之间的关系通常是1:1，主机控制器只负责指导所有的数据传输。流通过提供一对多的“缓冲区”的关联改变了这个范例，并允许设备直接告知主机控制器将移动指向哪个缓冲区。与USB流端点相关联的USB数据传输是由xHCI所有的、相同的批量端点调度，但与传输相关联的数据缓冲区由设备决定。

xHCI USB流支持最多64K缓冲区与单个端点相关联。

- xHCI流协议的支持允许USB设备选择xHCI调度时选择哪个缓冲区用于传输。

### 可扩展性

xHCI架构被设计为高度可扩展，能够支持1到255个USB设备和1到255个根集线器端口。因为每个USB设备最多定义31个端点，因此支持255个设备的xHCI最多能支持7,906个单独的总端点。通常来说，与一个端点关联的每个内存缓冲区是以一个物理内存块中的队列描述，其中的队列需要头指针、尾指针、长度等寄存器来定义其状态。有很多方法可以来定义队列状态，但如果每个队列要占用32个字节的寄存器空间，则几乎需要256KB的寄存器空间才能支持7,906个队列。一般来说，只有少量USB设备被同时连接到一个系统，并且平均来说，一个USB设备支持3-4个端点，而其中部分端点在同一时间处于活动状态。xHCI在系统内存中维护队列状态作为端点的上下文数据结构。上下文的设计使得它们可以被xHCI缓存，并且以端点的活动进行“分页”。因而，供应商可以根据其产品预期的实际使用模式调整其内部的xHCI端点上下文缓存的空间和资源，而不必按照架构本身的限制来设计。在内部缓存空间选择理想并且正常使用条件的的情况下，xHCI不出现上下文分页。USB端点的活动往往是突发性。也就是说，在任何时间点，都可能有大量端点准备好移动数据，但只有一个子集活跃于移动数据。例如，如果用户离开了设备，则鼠标的中断端点可能数小时不会传输数据。xHCI供应商设计的算法可以检测这种情况，并在其他端点变为忙碌时使该端点变为分页候选。

- xHCI架构本身设计的最大值允许大量USB设备、端口、中断向量，……但相应实现的定义只需要满足其营销所宣称的数值。举例来说，供应商可以将其平板电脑上实现的xHCI只支持最多16个USB设备。
- 供应商可以进一步利用xHCI架构特性来调整其内部资源，以匹配目标使用模式。例如，如果供应商经过可用性测试确定95%的平板电脑用户永远不会连接超过4个USB设备，并且每个USB设备通常定义4个端点（或更少），那么可以确定正常情况下内部缓存16个端点上下文就已足够，不会有由于端点上下文分页产生的系统内存活动。

## 历史

开放主机控制器接口（OHCI）规范由多家企业（Compaq、微软和National Semiconductor）联合定义，是支持USB 1.0设备的开放规范。通用主机控制器接口（UHCI）最初是英特尔为支持USB 1.0设备定义的一个专有接口的规范。UHCI规范最终公开，但那时其他行业已采用OHCI规范。

英特尔为支持USB 2.0设备定义了EHCI规范。EHCI架构模仿UHCI和OHCI控制器建立，需要软件在内存中构建USB事务日程，以及管理带宽和地址分配。为消除行业冗余定义USB 2.0主机控制器接口开放版本的重复努力，英特尔公司将EHCI规范提供给业界，无需许可费用。

英特尔的xHCI规范继续采用EHCI的许可模式，但行业内贡献有大幅度增长。超过100家公司为xHCI规范做出了贡献。USB开发者论坛（USB-IF）也资助了一套xHCI合规性测试，以最大化各种xHCI实现的兼容性。

xHCI 1.0控制器自2009年12月起出货。Linux内核自2009年包含xHCI驱动程序，较旧的内核也有在线的驱动程序可用。适用于Windows XP、Vista和7的驱动程序可以从相应的xHCI供应商处取得。Windows 8内建原生的xHCI支援。用于嵌入式系统的xHCI驱动程序可以从MCCI、Jungo以及其他软件供应商处取得。许多供应商还提供xHCI IP块，以便在SOC环境中定制。xHCI 1.1控制器和设备于2015年开始发货。

### 版本历史

xHCI规范使用“勘误”（errata）文件来定义特定版本的更新和说明。勘误文件中的更改在每个发布中累积。有关具体更改的详细信息，参阅相关的勘误文件。xHCI勘误文件中定义的大多数更改是澄清说明、语法或拼写更正，额外的交叉参考等，这些都不影响驱动程序的实现。体系结构的更改利用一个“Capability”（能力）标志来确定特定功能是否被一个xHCI实现支持，以及一个“Enable”（启用）标志来开启功能。

#### 预发布

在2010年正式发布之前，xHCI规范通过多个版本进行演变：

- xHCI 0.9：2008年8月发布。
- USB 0.95：2008年12月发布。
- USB 0.96：2009年8月发布。
- USB 0.96a：1.0发布候选，2010年4月。第一批设备发货基于此版本。

#### xHCI 1.0

- xHCI 1.0：首个公开发布，2010年5月21日。指定的USB数据速率为1.5 Mbit / s（低速），12 Mbit / s（全速），480 Mbit / s（高速）和5 Gbit / s（SuperSpeed）。
- xHCI 1.0, errata files 1-4：2011年1月17日发布。合并了来自 1.0公开发布 的初始评估反馈，保存-恢复的说明，以及硬件LPM支持。
- xHCI 1.0, errata files 1-6：2011年3月18日发布。澄清说明。
- xHCI 1.0, errata files 1-7：2011年6月13日发布。澄清说明。

#### xHCI 1.1

- xHCI 1.1：2013年12月21日发布。指定的USB 3.1数据速率为10 Gbit/s（SuperSpeed +）。这包含xHCI 1.0勘误文件1-21。允许控制器在HCSPARAMS2功能寄存器中请求更多的暂存器缓冲区（最多1023个）。

#### xHCI 1.2

- xHCI 1.2: 2019年5月。指定的USB 3.2 数据速率为10 Gbit/s (SuperSpeedPlus Gen1x2) 和 20 Gbit/s (SuperSpeedPlus Gen2x2).