可扩展主机控制器接口(eXtensible Host Controller Interface,缩写xHCI)是一种计算机接口规范,其定义了用于通用串行总线(USB)主机控制器的寄存器级描述,可以与USB 1.x、2.0和3.x兼容设备接口连接。该规范也被称为USB 3.0主机控制器规范。
xHCI在许多方面相较前几代USB主机控制器接口架构有着根本突破。前几代是:开放主机控制器接口(OHCI)、通用主机控制器接口(UHCI)和增强主机控制器接口(EHCI)。以下是xHCI架构的主要目标:
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上需要驱动的事务,哪怕没有数据被移动。另外,在从设备读取之时,即使没有要数据的读取,也会在每个调度间隔之时轮询设备。
传统的USB主机-控制器架构在应用于虚拟化环境时表现出一些严重的缺陷。传统的USB主机-控制器接口定义了一个相对简单的硬件数据泵;其中与整体总线管理(带宽分配、地址分配等)相关的关键状态驻留在主机适配器驱动程序(HCD)的软件中。尝试将标准的硬件IO虚拟化技术(复制I/O接口寄存器)应用于传统USB主机控制器接口是有问题的,因为跨越虚拟机(VM)的关键状态的管理不适用于硬件。xHCI架构将这一关键状态的控制转移到硬件,从而实现跨虚拟机的USB资源管理。xHCI虚拟化功能还提供:
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驱动程序之间的复杂交互和依赖性。
USB 3.0 SuperSpeed规范中增加了流支持,这主要是为通过USB实现高性能存储操作。USB端点与系统内存的缓冲区之间的关系通常是1:1,主机控制器只负责指导所有的数据传输。流通过提供一对多的“缓冲区”的关联改变了这个范例,并允许设备直接告知主机控制器将移动指向哪个缓冲区。与USB流端点相关联的USB数据传输是由xHCI所有的、相同的批量端点调度,但与传输相关联的数据缓冲区由设备决定。 xHCI USB流支持最多64K缓冲区与单个端点相关联。
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供应商设计的算法可以检测这种情况,并在其他端点变为忙碌时使该端点变为分页候选。
开放主机控制器接口(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驱动程序[4],较旧的内核也有在线的驱动程序可用。适用于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规范通过多个版本进行演变: