可延伸主機控制器介面
可延伸主機控制器介面(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為控制器設定日程表。[1][2][3]如果使用中斷事務的任何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驅動程式[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規範通過多個版本進行演變:
- 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) (頁面存檔備份,存於網際網路檔案館)(英文)