Windows の USB ホスト側ドライバー

このトピックでは、ユニバーサル シリアル バス (USB) ドライバー スタック アーキテクチャの概要について説明します。

次の図は、Windows 8の USB ドライバー スタックのアーキテクチャ ブロック図を示しています。 図は、USB 2.0 と USB 3.0 用の個別の USB ドライバー スタックを示しています。 Windowsは、デバイスが xHCI コントローラーに接続されているときに USB 3.0 ドライバー スタックを読み込みます。 USB 3.0 スタックは、Windows 8の新機能です。

Windowsは、eHCI、oHCI、または uHCI コントローラーに接続されているデバイスの USB 2.0 ドライバー スタックを読み込みます。 USB 2.0 ドライバー スタックは、service Pack 1 (SP1) 以降のバージョンの Windows オペレーティング システムを備えた Windows XP に付属しています。

architectural block diagram for usb 2.0 and 3.0 driver stacks.

USB 3.0 ドライバー スタック

USB 3.0 スタックは、Windows 8の新機能です。 Microsoft では、カーネル モード ドライバー フレームワーク (KMDF) インターフェイスを使用して新しいドライバーを作成しました。 KMDF ドライバー モデルは、複雑さを軽減し、安定性を向上させます。

USB 3.0 ホスト コントローラー ドライバー (Usbxhci.sys)

xHCI ドライバーは USB 3.0 ホスト コントローラー ドライバーです。 xHCI ドライバーの役割には、xHCI コントローラー ハードウェアの MMIO レジスタとホスト メモリ ベースのデータ構造の初期化、上位レイヤー ドライバーから転送要求ブロックへの転送要求のマッピング、ハードウェアへの要求の送信などがあります。 転送が完了すると、ドライバーはハードウェアからの転送完了イベントを処理し、ドライバー スタックにイベントを伝達します。 また、xHCI コントローラーのデバイス スロットとエンドポイント コンテキストも制御します。

xHCI ドライバーは、Windows 8の新機能であり、オペレーティング システムの以前のバージョンで利用可能だった eHCI ミニポート ドライバーの拡張機能ではありません。 新しいドライバーは、カーネル モード ドライバー フレームワーク (KMDF) インターフェイスを使用して作成され、すべてのコントローラー電源管理と PnP イベントに KMDF を使用します。 Windows、xHCI ドライバーを、ホスト コントローラーのデバイス スタック内の関数デバイス オブジェクト (FDO) として読み込みます。

USB ホスト コントローラー拡張機能 (Ucx01000.sys)

USB ホスト コントローラー拡張機能ドライバー (KMDF の拡張機能) は、基になるクラス固有のホスト コントローラー ドライバー (xHCI ドライバーなど) の新しい拡張機能です。 新しいドライバーは拡張可能であり、将来開発される予定の他の種類のホスト コントローラー ドライバーをサポートするように設計されています。 USB ホスト コントローラー拡張機能は、ハブ ドライバーに対する一般的な抽象化インターフェイスとして機能し、ホスト コントローラー ドライバーに要求をキューに格納するための一般的なメカニズムを提供し、選択した特定の機能をオーバーライドします。 上位ドライバーによって開始されたすべての I/O 要求は、xHCI ドライバーの前にホスト コントローラー拡張機能ドライバーに到達します。 I/O 要求を受信すると、ホスト コントローラー拡張機能によって要求が検証され、ターゲット エンドポイントに関連付けられている適切な KMDF キューに要求が転送されます。 xHCI ドライバーは、処理の準備ができたら、キューから要求を取得します。 USB ホスト コントローラー拡張機能ドライバーの役割は次のとおりです。

  • xHCI ドライバーに USB 固有のオブジェクトを提供します。
  • XHCI ドライバーに KMDF イベント コールバック ルーチンを提供します。
  • ホスト コントローラーに関連付けられているルート ハブの操作を管理および制御します。
  • チェーンされた MDL、ストリームなど、クライアント ドライバーによって構成可能な機能を実装します。

USB ハブ ドライバー (Usbhub3.sys)

新しいハブ ドライバーは、3.0 デバイス用の USB ドライバー スタックで KMDF ドライバー モデルを使用します。 ハブ ドライバーは、主に次のタスクを実行します。

  • USB ハブとそのポートを管理します。
  • ダウンストリーム ポートに接続されているデバイスとその他のハブを列挙します。
  • 列挙されたデバイスとハブの物理デバイス オブジェクト (PDO) を作成します。

Windowsハブ ドライバーを FDO としてハブ デバイス スタックに読み込みます。 新しいドライバーのデバイス列挙とハブ管理は、一連のステート マシンを通じて実装されます。 ハブ ドライバーは、電源管理と PnP 関数に KMDF に依存しています。 ハブ管理に加えて、ハブ ドライバーは、USB クライアント ドライバー層から送信された特定の要求の予備チェックと処理も実行します。 たとえば、ハブ ドライバーは select-configuration 要求を解析して、要求によって構成されるエンドポイントを決定します。 情報を解析した後、ハブ ドライバーは USB ホスト コントローラー拡張機能またはそれ以上の処理に要求を送信します。

USB 2.0 ドライバー スタック

Windowsは、eHCI、oHCI、または uHCI コントローラーに接続されているデバイスの USB 2.0 ドライバー スタックを読み込みます。 USB 2.0 ドライバー スタックのドライバーは、SP1 以降のバージョンの Windows オペレーティング システムと共に Windows XP に付属しています。 USB 2.0 ドライバ スタックは、USB 2.0 仕様で定義されている高速 USB デバイスを容易にするように設計されています。

USB ドライバー スタックの下部には、ホスト コントローラー ドライバーがあります。 ポート ドライバー、Usbport.sys、同時に実行される 3 つのミニポート ドライバーの 1 つ以上で構成されます。 システムがホスト コントローラー ハードウェアを検出すると、これらのミニポート ドライバーのいずれかが読み込まれます。 ミニポート ドライバーは、読み込まれた後、ポート ドライバーを読み込みますUsbport.sys。 ポート ドライバーは、特定のプロトコルに依存しないホスト コントローラー ドライバーの職務のこれらの側面を処理します。

Usbuhci.sys (ユニバーサル ホスト コントローラー インターフェイス) ミニポート ドライバーは、Windows 2000 に付属しているUhcd.sys ミニクラス ドライバーを置き換えます。 Usbohci.sys (オープン ホスト コントローラー インターフェイス) ミニポート ドライバーは、Openhci.sysを置き換えます。 Usbehci.sys ミニポート ドライバーは、高速 USB デバイスをサポートし、SP1 以降および Windows Server 2003 以降のオペレーティング システムWindows XP で導入されました。

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 共通クラスの汎用親ドライバーは、複合デバイス用の Microsoft 提供の親ドライバーです。 deviceClass が 0 または0xefで、numInterfaces がデバイス記述子で 1 より大きい場合、ハブ ドライバーは親複合ドライバーを列挙して読み込みます。 ハブ ドライバーは、親複合ドライバーの互換性のある ID を "USB\COMPOSITE" として生成します。 Usbccgp.sysは、Windows ドライバー モデル (WDM) ルーチンを使用します。

親複合ドライバーは、複合デバイス内のすべての関数を列挙し、それぞれに PDO を作成します。 これにより、デバイス内の各関数に対して適切なクラスまたはクライアント ドライバーが読み込まれます。 各ファンクション ドライバー (子 PDO) は、親ドライバーに要求を送信し、USB ハブ ドライバーに送信します。

Usbccgp.sysは、SP1 以降のバージョンの Windows オペレーティング システムを含む Windows XP に含まれています。 Windows 8では、ドライバーは、USB 3.0 仕様で定義されている関数の中断とリモート ウェイク アップ機能を実装するように更新されています。

詳細については、「 USB 汎用親ドライバー (Usbccgp.sys)」を参照してください。

WinUSB (Winusb.sys)

Windows USB (WinUSB) は、Microsoft が提供する USB デバイス用の汎用ドライバーです。 WinUSB アーキテクチャは、カーネル モード ドライバー (Winusb.sys) とユーザー モードダイナミック リンク ライブラリ (Winusb.dll) で構成されます。 カスタム関数ドライバーを必要としないデバイスの場合、Winusb.sysは、ファンクション ドライバーとしてデバイスのカーネル モード スタックにインストールできます。 ユーザー モード プロセスは、一連のデバイス I/O 制御要求を使用するか、WinUsb_Xxx関数を呼び出すことによって 、Winusb.sys と通信できます。 詳細については、 WinUSB を参照してください。

Windows 8では、WinUSB の Microsoft 提供情報 (INF) ファイル Winusb.inf には、デバイス識別子文字列として USB\MS_COMP_WINUSB が含まれています。 これにより、Winusb.sysは、MS OS 記述子に一致する WinUSB 互換 ID を持つデバイスのファンクション ドライバーとして自動的に読み込まれます。 このようなデバイスは WinUSB デバイスと呼ばれます。 ハードウェア製造元は、WinUSB デバイス用の INF ファイルを配布する必要はありません。ドライバーのインストール プロセスをエンド ユーザーにとって簡単にします。 詳細については、「WinUSB デバイス」を参照してください。

USB クライアント ドライバー

複合または非複合の各 USB デバイスは、クライアント ドライバーによって管理されます。 USB クライアント ドライバーは、USB ドライバー スタックのクライアントであるクラスまたはデバイス ドライバーです。 このようなドライバーには、Microsoft またはサード パーティベンダーのクラスおよびデバイス固有のドライバーが含まれます。 Microsoft によって提供されるクラス ドライバーの一覧については、「 サポートされている USB デバイス クラスのドライバー」を参照してください。 クライアント ドライバーは、USB ドライバー スタックによって公開されるパブリック インターフェイスを呼び出すことによって、デバイスと通信するための要求を作成します。

複合デバイスのクライアント ドライバーは、ドライバー スタック内の場所を除き、非複合デバイスのクライアント ドライバーと変われません。

非複合デバイスのクライアント ドライバーは、ハブ ドライバーのすぐ上に階層化されます。

複数の関数を公開し、親クラス ドライバーを持たない複合 USB デバイスの場合、Windowsは、ハブ ドライバーとクライアント ドライバー層の間に USB 汎用親ドライバー (Usbccgp.sys) を読み込みます。 親ドライバーは、複合デバイスの関数ごとに個別の PDO を作成します。 クライアント ドライバー (関数の FDO) は、汎用親ドライバーの上に読み込まれます。 ベンダーは、関数ごとに個別のクライアント ドライバーを提供することを選択できます。

USB クライアント ドライバーは、ドライバーの要件に応じて、ユーザー モードまたはカーネル モードで実行できます。 USB クライアント ドライバーは、KMDF、UMDF、または WDM ルーチンを使用して記述できます。

クライアント ドライバーのヘルパー ライブラリ

Microsoft では、カーネル モード ドライバーとアプリケーションが USB ドライバー スタックと通信するのに役立つ次のヘルパー ライブラリを提供しています。

  • Usbd.sys

    Microsoft は、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 デバイスにアクセスする方法」を参照してください。

ユニバーサル シリアル バス (USB) ドライバー
USB ドライバー開発ガイド