可擴展主機控制器接口

可擴展主機控制器接口（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).