拡張可能なホストコントローラインターフェイス(xHCI )は、ユニバーサルシリアルバス(USB)用のコンピュータのホストコントローラの動作に関する詳細なフレームワークを提供する技術仕様です。USB 3.0ホストコントローラ仕様とも呼ばれるxHCIは、下位互換性を持つように設計されており、古いUSB 1.xから最新のUSB 3.xまで、幅広いUSBデバイスをサポートします。
従来のOpen Host Controller Interface(OHCI)、Universal Host Controller Interface(UHCI)、Enhanced Host Controller Interface(EHCI)とは異なり、xHCIはいくつかの技術的な改良が施されています。具体的には、単一の統一規格内で複数のデータ転送速度(低速、フルスピード、高速、スーパースピード)に対応できるように設計されています。これにより、計算リソースと電力リソースの管理効率が向上し、タブレットやスマートフォンなど、電力供給能力が限られているモバイルデバイスにとって特に有益です。さらに、xHCIは低速デバイスと高速デバイスが混在する環境をサポートするために必要なアーキテクチャを簡素化し、ドライバやシステムソフトウェアの開発を効率化します。
xHCIは、前身であるOpen Host Controller Interface(OHCI)、Universal Host Controller Interface(UHCI)、Enhanced Host Controller Interface(EHCI)に比べて、いくつかの重要な点で大幅な改善が見られます。
xHCIは、複数の速度への対応を強化し、電力管理を最適化し、基盤となるアーキテクチャを簡素化することで、USBホストコントローラ向けのより効率的で統一された標準規格としての役割を果たします。
xHCIは、多くの点で、従来のUSBホストコントローラインターフェースアーキテクチャ(Open Host Controller Interface(OHCI)、Universal Host Controller Interface(UHCI)、Enhanced Host Controller Interface(EHCI)など)とは根本的に異なるものです。xHCIアーキテクチャの主な目標は以下のとおりです。
OHCIおよびUHCIコントローラはUSB 1速度のデバイス(1.5 Mbit/sおよび12 Mbit/s)のみをサポートし、EHCIはUSB 2デバイス(480 Mbit/s)のみをサポートします。
xHCIアーキテクチャは、 単一のドライバスタックで、SuperSpeed(5Gbps)を含むすべてのUSB速度と将来の速度をサポートするように設計されています。
USBが最初に開発された1995年当時は、PCに現れつつあったPS/2、シリアルポート、パラレルポート、ゲームポートなどのコネクタの増加を抑えるためにデスクトッププラットフォームを対象としており、ホストの消費電力は当時重要な考慮事項ではありませんでした。それ以来、モバイルプラットフォームが主流となり、バッテリーによって消費電力が重要な考慮事項となりました。従来のUSBホストコントローラ(OHCI、UHCI、EHCI)のアーキテクチャは、USB上で実行されるトランザクションの「スケジュール」がホストメモリ内のソフトウェアによって構築され、ホストコントローラのハードウェアがスケジュールを継続的に読み取り、データが移動されない場合でも、USB上でどのトランザクションをいつ実行する必要があるかを判断するという点で非常に似ていました。さらに、デバイスからの読み取りの場合、読み取るデータがなくても、スケジュール間隔ごとにデバイスがポーリングされました。
従来のUSBホストコントローラアーキテクチャは、仮想化環境に適用すると深刻な欠点があります。従来のUSBホストコントローラインターフェースは、比較的単純なハードウェアデータポンプを定義しており、バス全体の管理(帯域幅割り当て、アドレス割り当てなど)に関連する重要な状態は、ホストコントローラドライバ(HCD)のソフトウェアにあります。I/Oインターフェースレジスタを複製する標準的なハードウェアI/O仮想化技術を従来のUSBホストコントローラインターフェースに適用しようとすると、仮想マシン(VM)間で管理する必要のある重要な状態がハードウェアで利用できないため、問題が発生します。xHCIアーキテクチャは、この重要な状態の制御をハードウェアに移行し、VM間でのUSBリソース管理を可能にします。xHCI仮想化機能には、次の機能も含まれています。
EHCIはOHCIまたはUHCIコントローラを「コンパニオンコントローラ」として利用します。USB 2デバイスはEHCIスタックを介して管理され、EHCIのポートロジックにより、低速またはフルスピードのUSBデバイスを「コンパニオン」のUHCIまたはOHCIコントローラのポートにルーティングできます。この場合、低速またはフルスピードのUSBデバイスはそれぞれのUHCIまたはOHCIスタックを介して管理されます。たとえば、4つのUSB「標準A」コネクタを備えたUSB 2 PCIeホストコントローラカードは、通常、システムソフトウェアに対して1つの4ポートEHCIコントローラと2つの2ポートOHCIコントローラを提供します。高速USBデバイスが4つのコネクタのいずれかに接続されると、そのデバイスはEHCIコントローラの4つのルートハブポートのいずれかを介して管理されます。コネクタ1または2に低速または高速USBデバイスが接続された場合、それらのデバイスは管理のためにいずれかのOHCIコントローラのルートハブポートにルーティングされます。また、コネクタ3または4に接続された低速および高速USBデバイスは、もう一方のOHCIコントローラのルートハブポートにルーティングされます。高速USBデバイスと低速および高速USBデバイスのグループに対して、EHCIがそれぞれ別のホストコントローラに依存しているため、EHCIドライバとOHCI/UHCIドライバの間で複雑な相互作用と依存関係が生じます。
ストリームのサポートは、主に USB を介した高性能ストレージ操作を可能にするために、USB 3.0 SuperSpeed 仕様に追加されました。従来、USB エンドポイントとシステム メモリ内のバッファの間には 1:1 の関係があり、ホスト コントローラがすべてのデータ転送の指示のみを担当していました。ストリームはこのパラダイムを変更し、1 対多の「エンドポイントからバッファへ」の関連付けを提供し、デバイスがホスト コントローラにどのバッファを移動するかを指示できるようにしました。USB ストリーム エンドポイントに関連付けられた USB データ転送は、他のバルク エンドポイントと同様に xHCI によってスケジュールされますが、転送に関連付けられたデータ バッファはデバイスによって決定されます。
xHCIアーキテクチャは、1~255個のUSBデバイスと1~255個のルートハブポートをサポートできる、高い拡張性を持つように設計されています。各USBデバイスは最大31個のエンドポイントを定義できるため、255個のデバイスをサポートするxHCIは、合計7,906個の個別のエンドポイントをサポートする必要があります。従来、エンドポイントに関連付けられた各メモリバッファは、物理メモリブロックのキューで記述され、キューの状態を定義するために、ヘッドポインタ、テールポインタ、長さ、およびその他のレジスタが必要です。キューの状態を定義する方法は多数ありますが、各キューに32バイトのレジスタ空間があると仮定すると、 7,906個のキューをサポートするには、約256KBのレジスタ空間が必要になります。通常、システムに接続されるUSBデバイスは少数であり、平均してUSBデバイスは3~4個のエンドポイントをサポートし、そのうちのサブセットのみが同時にアクティブになります。xHCIは、エンドポイントコンテキストデータ構造として、システムメモリにキューの状態を保持します。コンテキストは、xHCI によってキャッシュされ、エンドポイントのアクティビティに応じて「ページイン」および「ページアウト」されるように設計されています。そのため、ベンダーは、自社製品で想定される実際の使用モデルに合わせて、サポートするアーキテクチャ上の制限ではなく、内部の xHCI エンドポイント コンテキスト キャッシュ スペースとリソースを拡張できます。理想的には、通常の使用条件下では xHCI によるコンテキスト ページングが発生しないように内部キャッシュ スペースが選択されます。また、USB エンドポイントのアクティビティはバースト的になる傾向があります。つまり、任意の時点で多数のエンドポイントがデータ転送の準備ができているかもしれませんが、実際にデータを転送しているのはその一部だけです。たとえば、ユーザーがデスクから離れている場合、マウスの割り込み IN エンドポイントは数時間データを転送しない可能性があります。xHCI ベンダー固有のアルゴリズムは、この状態を検出し、他のエンドポイントがビジー状態になった場合に、そのエンドポイントをページアウト候補にすることができます。
オープンホストコントローラインターフェース(OHCI)仕様は、 USB 1.0デバイスをサポートするためのオープン仕様として、コンパック、マイクロソフト、ナショナルセミコンダクターなどの企業連合によって定義されました。ユニバーサルホストコントローラインターフェース(UHCI)は、インテルが当初USB 1.0デバイスをサポートするための独自インターフェースとして定義した仕様です。UHCI仕様は最終的に公開されましたが、それは業界全体がOHCI仕様を採用した後でした。
EHCI仕様は、USB 2.0デバイスをサポートするためにインテルによって定義されました。EHCIアーキテクチャは、USBトランザクションスケジュールをメモリ上に構築し、帯域幅とアドレス割り当てを管理するソフトウェアを必要とするUHCIおよびOHCIコントローラをモデルとしています。USB 2.0ホストコントローラインターフェイスのオープンバージョンを定義するという業界の重複した取り組みを排除するため、インテルはEHCI仕様をライセンス料なしで業界に公開しました。
IntelのxHCI仕様においても、EHCIライセンスモデルは継続されましたが、業界からの貢献が大幅に拡大しました。100社を超える企業がxHCI仕様に貢献しています。USBインプリメンターズフォーラム(USB-IF)は、様々なxHCI実装の互換性を最大限に高めるため、一連のxHCI準拠テストにも資金を提供しています。
xHCI 1.0 コントローラは 2009 年 12 月より出荷されています。2009 年以降の Linux カーネルには xHCI ドライバが含まれていますが[ 6 ]、それ以前のカーネル用のドライバはオンラインで入手できます。XP、Vista、Windows 7 用の Windows ドライバは、それぞれのxHCIベンダーから入手できます。組み込みシステム用の xHCI ドライバは、MCCI、Jungo 、その他のソフトウェア ベンダーから入手できます。xHCI IP ブロックも、SOC 環境でのカスタマイズ用に複数のベンダーから入手できます。xHCI 1.1 コントローラとデバイスは 2015 年に出荷が開始されました。
xHCI仕様では、「正誤表」ファイルを使用して、特定のリリースに対する更新と明確化を定義します。正誤表ファイル内の変更は、各リリースに蓄積されます。具体的な変更の詳細については、関連する正誤表ファイルを参照してください。xHCI正誤表ファイルで定義されている変更のほとんどは、明確化、文法やスペルの修正、追加の相互参照などであり、ドライバの実装には影響しません。アーキテクチャ上の変更と判断された変更では、特定の機能がxHCI実装でサポートされているかどうかを判断するためにCapabilityフラグを使用し、その機能を有効にするためにEnableフラグを使用します。
xHCI仕様は、2010年の正式リリースまでにいくつかのバージョンを経て進化を遂げた。
{{cite web}}: CS1 maint: タイトルとしてアーカイブされたコピー (リンク)