Windows の USB ホスト側ドライバー
この記事では、ユニバーサル シリアル バス (USB) ドライバー スタック アーキテクチャの概要について説明します。
次の図は、Windows 用の USB ドライバー スタックのアーキテクチャ ブロック図を示しています。 この図は、USB 2.0 と USB 3.0 の個別の USB ドライバー スタックを示しています。 デバイスが xHCI コントローラーに接続されている場合、Windows は USB 3.0 ドライバー スタックを読み込みます。
Windows は、eHCI、oHCI、または uHCI コントローラーに接続されているデバイスの USB 2.0 ドライバー スタックを読み込みます。 USB 2.0 ドライバー スタックは、Windows XP Service Pack 1 (SP1) 以降のバージョンの Windows オペレーティング システムに同梱されています。
USB 3.0 ドライバー スタック
Microsoft は、カーネル モード ドライバー フレームワーク (KMDF) インターフェイスを使用して USB 3.0 ドライバーを作成しました。 KMDF ドライバー モデルは複雑さを軽減し、安定性を向上させます。
USB 3.0 ホスト コントローラー ドライバー (Usbxhci.sys)
xHCI ドライバーは USB 3.0 ホスト コントローラー ドライバーです。 xHCI ドライバーの役割には、xHCI コントローラー ハードウェアの MMIO レジスターとホスト メモリ ベースのデータ構造の初期化、上位層ドライバーからの転送要求ブロックへの転送要求のマッピング、およびハードウェアへの要求の送信が含まれます。 転送が完了すると、ドライバーはハードウェアからの転送完了イベントを処理し、そのイベントをドライバー スタックに伝播します。 また、xHCI コントローラーのデバイス スロットとエンドポイント コンテキストも制御します。
Windows は、xHCI ドライバーをホスト コントローラーのデバイス スタック内のファンクション デバイス オブジェクト (FDO) として読み込みます。
USB ホスト コントローラー拡張機能 (Ucx01000.sys)
USB ホスト コントローラー拡張ドライバー (KMDF の拡張機能) は、xHCI ドライバーなど、基礎となるクラス固有のホスト コントローラー ドライバーの新しい拡張機能です。 新しいドライバーは拡張可能で、将来開発されると予想される他の種類のホスト コントローラー ドライバーをサポートするように設計されています。 USB ホスト コントローラー拡張機能は、ハブ ドライバーへの共通の抽象化されたインターフェイスとして機能し、ホスト コントローラー ドライバーへの要求をキューに入れるための汎用メカニズムを提供し、選択された特定の機能をオーバーライドします。 上位ドライバーによって開始されたすべての I/O 要求は、xHCI ドライバーより前にホスト コントローラー拡張ドライバーに到達します。 I/O 要求を受信すると、ホスト コントローラー拡張機能は要求を検証し、ターゲット エンドポイントに関連付けられた適切な KMDF キューに要求を転送します。 xHCI ドライバーは、処理の準備ができると、キューから要求を取得します。 USB ホスト コントローラー拡張ドライバーの役割は次のとおりです。
- xHCI ドライバーに USB 固有のオブジェクトを提供します。
- KMDF イベント コールバック ルーチンを xHCI ドライバーに提供します。
- ホスト コントローラーに関連付けられたルート ハブの操作を管理および制御します。
- チェーンされた MDL、ストリームなど、クライアント ドライバーによって構成可能な機能を実装します。
USB ハブ ドライバー (Usbhub3.sys)
3.0 デバイス用の USB ドライバー スタック内の新しいハブ ドライバーは、KMDF ドライバー モデルを使用します。 ハブ ドライバーは、主に次のタスクを実行します。
- USB ハブとそのポートを管理します。
- ダウンストリーム ポートに接続されているデバイスとその他のハブを列挙します。
- 列挙されたデバイスとハブの物理デバイス オブジェクト (PDO) を作成します。
Windows は、ハブ ドライバーを FDO としてハブ デバイス スタックに読み込みます。 新しいドライバーのデバイス列挙とハブ管理は、一連のステート マシンを通じて実装されます。 ハブ ドライバーは、電源管理と PnP 機能を KMDF に依存します。 ハブ管理に加えて、ハブ ドライバーは、USB クライアント ドライバー層によって送信された特定の要求の事前チェックと処理も実行します。 たとえば、ハブ ドライバーは構成選択要求を解析して、その要求によってどのエンドポイントが構成されるかを判断します。 情報を解析した後、ハブ ドライバーは USB ホスト コントローラー拡張機能に要求を送信するか、さらなる処理を実行します。
USB 2.0 ドライバー スタック
Windows は、eHCI、oHCI、または uHCI コントローラーに接続されているデバイスの USB 2.0 ドライバー スタックを読み込みます。 USB 2.0 ドライバー スタックのドライバーは、Windows XP SP1 以降のバージョンの Windows オペレーティング システムに同梱されています。 USB 2.0 ドライバー スタックは、USB 2.0 仕様で定義されている High-Speed USB デバイスを容易にするように設計されています。
USB ドライバー スタックの下部には、ホスト コントローラー ドライバーがあります。 これは、ポート ドライバー、Usbport.sys、および同時に実行される 3 つ以上のミニポート ドライバーで構成されます。 システムがホスト コントローラーハードウェアを検出すると、これらのミニポート ドライバーのいずれかを読み込みます。 ミニポート ドライバーは、読み込まれた後、ポート ドライバー、Usbport.sys を読み込みます。 ポート ドライバーは、ホスト コントローラー ドライバーの役割のうち、特定のプロトコルから独立した側面を処理します。
Usbuhci.sys (ユニバーサル ホスト コントローラー インターフェイス) ミニポート ドライバーは、Windows 2000 に付属の Uhcd.sys ミニクラス ドライバーを置き換えます。 Usbohci.sys (オープン ホスト コントローラー インターフェイス) ミニポート ドライバーは、Openhci.sys を置き換えます。 Usbehci.sys ミニポート ドライバーは高速 USB デバイスをサポートしており、Windows XP SP1 以降および Windows Server 2003 以降のオペレーティング システムに導入されました。
USB 2.0 をサポートする Windows のすべてのバージョンでは、オペレーティング システムは USB 1.1 と USB 2.0 のホスト コントローラーを同時に管理できます。 オペレーティング システムは、両方のタイプのコントローラが存在することを検出すると、ホスト コントローラごとに 1 つずつ、2 つの別個のデバイス ノードを作成します。 その後、Windows は、システム構成に応じて、USB 2.0 準拠のホスト コントローラー ハードウェアの場合は Usbehci.sys ミニポート ドライバーを読み込み、USB 1.1 準拠のハードウェアの場合は Usbohci.sys または Openhci.sys を読み込みます。
ポート ドライバーの上には、ハブ ドライバーとしても知られる USB バス ドライバー Usbhub.sys があります。 これは、システム上の各ハブのデバイス ドライバーです。
USB 共通クラス汎用親ドライバー (Usbccgp.sys)
USB 共通クラスの汎用親ドライバーは、マイクロソフトが提供する複合デバイス用の親ドライバーです。 deviceClass が 0 または 0xef で、numInterfaces がデバイス記述子で 1 より大きい場合、ハブ ドライバーは親複合ドライバーを列挙して読み込みます。 ハブ ドライバーは、親複合ドライバーの互換性 ID を「USB\COMPOSITE」として生成します。 Usbccgp.sys は Windows Driver Model (WDM) ルーチンを使用します。
親複合ドライバーは複合デバイス内のすべての関数を列挙し、それぞれの関数に対して PDO を作成します。 これにより、デバイスの各関数に適切なクラスまたはクライアント ドライバーがロードされます。 各関数ドライバー (子 PDO) は要求を親ドライバーに送信し、親ドライバーは要求を USB ハブ ドライバーに送信します。
Usbccgp.sys は、WINDOWS オペレーティング システムの SP1 以降のバージョンの Windows XP に含まれています。 Windows 8 では、USB 3.0 仕様で定義されている機能サスペンド機能とリモート ウェイクアップ機能を実装するためにドライバーが更新されました。
詳細については、「USB 汎用親ドライバー (Usbccgp.sys)」を参照してください。
WinUSB (Winusb.sys)
Windows USB (WinUSB) は、マイクロソフトが提供する USB デバイス用の汎用ドライバーです。 WinUSB アーキテクチャは、カーネル モード ドライバー (Winusb.sys) とユーザー モード ダイナミック リンク ライブラリ (Winusb.dll) で構成されます。 カスタム ファンクション ドライバーを必要としないデバイスの場合、Winusb.sys をファンクション ドライバーとしてデバイスのカーネル モード スタックにインストールできます。 ユーザー モード プロセスは、一連のデバイス I/O 制御要求を使用するか、WinUsb_Xxx 関数を呼び出すことで、Winusb.sys と通信できます。 詳細については、「開発者向け WinUSB の概要」を参照してください。
Windows 8 では、Microsoft が提供する WinUSB 用の情報 (INF) ファイル Winusb.inf には、デバイス識別子文字列として USB\MS_COMP_WINUSB が含まれています。 これにより、MS OS 記述子に一致する WinUSB 互換 ID を持つデバイスのファンクション ドライバーとして Winusb.sys が自動的に読み込まれるようになります。 このようなデバイスは WinUSB デバイスと呼ばれます。 ハードウェアの製造元は WinUSB デバイス用の INF ファイルを配布する必要がないため、エンド ユーザーにとってドライバーのインストール プロセスが簡単になります。 詳細については、「WinUSB デバイス」を参照してください。
USB クライアント ドライバー
複合または非複合の各 USB デバイスは、クライアント ドライバーによって管理されます。 USB クライアント ドライバーは、USB ドライバー スタックのクライアントであるクラスまたはデバイス ドライバーです。 このようなドライバーには、マイクロソフトまたはサードパーティ ベンダーのクラスおよびデバイス固有のドライバーが含まれます。 Microsoft が提供するクラス ドライバーの一覧については、「サポートされている USB デバイス クラスのドライバー」を参照してください。 クライアント ドライバーは、USB ドライバー スタックによって公開されるパブリック インターフェイスを呼び出すことによって、デバイスと通信するための要求を作成します。
複合デバイスのクライアント ドライバーは、ドライバー スタック内の場所を除いて、非複合デバイスのクライアント ドライバーと何ら変わりません。
非複合デバイスのクライアント ドライバーは、ハブ ドライバーのすぐ上に階層化されます。
複数の関数を公開し、親クラス ドライバーを持たない複合 USB デバイスの場合、Windows は、ハブ ドライバーとクライアント ドライバー層の間に USB 汎用親ドライバー (Usbccgp.sys) を読み込みます。 親ドライバーは、複合デバイスの関数ごとに個別の PDO を作成します。 クライアント ドライバー (関数の FDO) は、汎用の親ドライバーの上に読み込まれます。 ベンダーは、関数ごとに個別のクライアント ドライバーを提供することを選択できます。
USB クライアント ドライバーは、ドライバーの要件に応じて、ユーザー モードまたはカーネル モードで実行できます。 USB クライアント ドライバーは、KMDF、UMDF、または WDM ルーチンを使用して記述できます。
クライアント ドライバーのヘルパー ライブラリ
マイクロソフトは、カーネル モード ドライバーおよびアプリケーションが USB ドライバー スタックと通信できるように、次のヘルパー ライブラリを提供しています。
Usbd.sys
マイクロソフトは、USB クライアント ドライバーのルーチンをエクスポートする Usbd.sys ライブラリを提供しています。 このヘルパー ルーチンは、クライアント ドライバーの操作タスクを簡略化します。 たとえば、ヘルパー ルーチンを使用すると、USB クライアント ドライバーは、構成の選択など、特定の操作用の USB 要求ブロック (URB) を構築し、それらの URL を USB ドライバー スタックに送信できます。
Usbdex.lib
このヘルパー ライブラリは、Windows 8 の新機能です。 ライブラリは、主に URB の割り当てと構築のためのルーチンをエクスポートします。 これらのルーチンは、Usbd.sys によってエクスポートされた従来のルーチンの一部を置き換えます。 新しいルーチンでは、クライアント ドライバーが USB ドライバー スタックに登録する必要があり、登録用のハンドルが維持されます。 そのハンドルは、他の Usbdex.lib ルーチンの呼び出しに使用されます。 新しいルーチンによって割り当てられた特定の URB には、USB ドライバーが追跡と処理を向上させるために使用する URB コンテキストがあります。 詳細については、「URBの 割り当てと構築」を参照してください。
Winusb.dll
Winusb.dll は、カーネル モードでデバイスの関数ドライバーとして読み込まれる Winusb.sys と通信するための WinUSB 関数を公開するユーザー モード DLL です。 アプリケーションはこれらの関数を使用して、デバイスの構成、デバイスに関する情報の取得、および I/O 操作の実行を行います。 これらの関数の使用方法については、「WinUSB 関数を使用して USB デバイスにアクセスする方法」を参照してください。