XHCI

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

## 參考資料

## 外部連結

* USB 官方網站（頁面存檔備份，存於網際網路檔案館）（英文）
* 開放主機控制器接口（OHCI）（英文）
* 英特爾通用主機控制器接口（UHCI）（頁面存檔備份，存於網際網路檔案館）（英文）
* 英特爾增強主機控制器接口（EHCI） （頁面存檔備份，存於網際網路檔案館）（英文）
* 英特爾可擴展主機控制器接口（xHCI） （頁面存檔備份，存於網際網路檔案館）（英文）