版权归原作者所有,如有侵权,请联系我们

[科普中国]-可扩展主机控制器接口

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

可扩展主机控制器接口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主机控制器接口。1

架构细节支持所有速度OHCI及UHCI控制器仅支持USB 1速度驱动程序(1.5 Mbit/s和12 Mbit/s)而EHCI仅支持USB 2驱动程序(480 Mbit/s)。

xHCI架构在设计上支持所有USB速度,包括SuperSpeed(5 Gbit/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所有优点的必要条件。2

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

各个USB设备(不管其在总线拓扑中的位置)直接分配给任何虚拟机;

最小化运行时虚拟机之间的通信;

支持原生USB设备共享;

支持PCIe SR-IOV。

简化驱动程序架构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控制器的根集线器端口。

xHCI架构消除了同伴控制器及其单独的驱动程序堆栈的需求。

以前由驱动程序执行的日程合并、带宽管理和USB设备地址分配功能,现在转入xHCI硬件,这使xHCI的软件堆栈更简单、精简、更低延迟。

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

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

可扩展性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个端点上下文就已足够,不会有由于端点上下文分页产生的系统内存活动。4

本词条内容贡献者为:

宋春霖 - 副教授 - 江南大学