USB ホスト コントローラー用 Windows ドライバー開発の概要
この記事では、Microsoft が提供する USB ホスト コントローラー拡張機能 (UCX) と通信するユニバーサル シリアル バス (USB) ホスト コントローラー ドライバーを開発するための、Windows オペレーティング システムでのサポートについて説明します。
仕様に準拠していない xHCI ホスト コントローラーを開発している場合、またはカスタムの非 xHCI ハードウェア (仮想ホスト コントローラーなど) を開発している場合は、UCX と通信するホスト コントローラー ドライバーを作成できます。 たとえば、USB デバイスをサポートする無線ドックを検討してください。 PC は、トランスポートとして TCP 経由の USB を使用することで、無線ドック経由で USB デバイスと通信します。
USB ホスト コントローラー拡張 (UCX)
USB ホスト コントローラー拡張機能は、システム提供のドライバー (Ucx01000.sys) です。 このドライバーは、Windows Driver Framework プログラミング インターフェイスを使用して、フレームワーク クラス拡張機能として実装されます。 ホスト コントローラー ドライバーは、そのクラス拡張機能のクライアント ドライバーとして機能します。 ホスト コントローラー ドライバーはハードウェアの操作とイベント、電源管理、PnP イベントを処理しますが、UCX は、ホスト コントローラー ドライバーへの要求をキューに入れ、その他のタスクを実行する抽象インターフェイスとして機能します。
UCX は、Windows の USB ホスト側ドライバーの 1 つです。 ホスト コントローラー デバイス スタックに、FDO として読み込まれます。
USB ホスト コントローラー ドライバー
UCX は拡張可能であり、さまざまなホスト コントローラー ドライバーをサポートするように設計されています。 Windows には、USB xHCI ホスト コントローラーをターゲットとする xHCI ドライバー (Usbxhci.sys) が用意されています。
ホスト コントローラー ドライバーは UCX のクライアントであり、カーネル モード ドライバー フレームワーク (KMDF) ドライバーとして作成されます。
Microsoft から提供されるバイナリ
ホスト コントローラー ドライバーを作成するには、UCX (Ucx01000.sys) とスタブ ライブラリ (Ucx01000.lib) が必要です。 スタブ ライブラリは Windows Driver Kit (WDK) に含まれています。 ライブラリには主に 2 つの役割があります。
- ホスト コントローラー ドライバーによって行われた呼び出しを変換し、UCX に渡します。
- バージョン管理のサポートを提供します。 ホスト コントローラー ドライバーは、UCX のメジャー バージョン番号がホスト コントローラー ドライバーと同じであり、マイナー バージョン番号がホスト コントローラー ドライバーと同じ以上である場合にのみ、UCX で動作します。
開発ツール
WDK には、ヘッダー、ライブラリ、ツール、サンプルなど、ドライバーの開発に必要なリソースが含まれています。
作業の開始
公式仕様で、アーキテクチャのさまざまなコンポーネント (デバイス、ホスト コントローラー、ハブ) について想定されている動作の説明を参照してください。
xHCI for Universal Serial Bus: 仕様
UCX のアーキテクチャ概要
Microsoft 提供の USB ドライバー スタックについて理解しましょう。
アーキテクチャ: USB ホスト コントローラー拡張機能 (UCX)
UCX オブジェクトとハンドルについて理解する
UCX は、WDF オブジェクト機能を拡張して、USB 固有の UCX オブジェクトを独自に定義します。 WDF オブジェクトの詳細については、「フレームワーク オブジェクトの概要」を参照してください。
UCX は、基になるホスト コントローラー ドライバーへの要求をキューに入れるために、これらのオブジェクトを使用します。 詳細については、ホスト コントローラー ドライバー で使用される UCX オブジェクトとハンドルに関する記事を参照してください。
UCX オブジェクト | 説明 |
---|---|
ホスト コントローラー オブジェクト (UCXCONTROLLER) | ホスト コントローラー ドライバーによって作成されるホスト コントローラーを表します。 ドライバーがホスト コントローラー インスタンスごとに作成するホスト コントローラー オブジェクトは、1 つに限定する必要があります。 UcxControllerCreate メソッドを呼び出すことによって、通常は EVT_WDF_DRIVER_DEVICE_ADD コールバック内で作成されます。 |
ルート ハブ オブジェクト (UCXROOTHUB) | ホスト コントローラーのルート ポートの状態を取得および制御します。 UcxRootHubCreate メソッドを呼び出すことにより、通常は EVT_WDF_DRIVER_DEVICE_ADD コールバック内でホスト コントローラー ドライバーによって作成されます。 |
USB デバイス オブジェクト (UCXUSBDEVICE) | バスに接続されている物理 USB デバイスを表します。 **UcxUsbDeviceCreate メソッドを呼び出すことにより、通常は EVT_UCX_CONTROLLER_USBDEVICE_ADD コールバック内でホスト コントローラー ドライバーによって作成されます。 |
Endpoint オブジェクト (UCXENDPOINT) | USB デバイス オブジェクト上のエンドポイントを表します。 **UcxEndpointCreate メソッドを呼び出すことにより、通常は EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD または EVT_UCX_USBDEVICE_ENDPOINT_ADD コールバック内でホスト コントローラー ドライバーによって作成されます。 |
Stream オブジェクト (UCXSTREAMS) | 1 つの一括エンドポイントにわたる、デバイスへのパイプの数を表します。 UcxStaticStreamsCreate メソッドを呼び出すことにより、通常は EVT_UCX_ENDPOINT_STATIC_STREAMS_ADD コールバック内でホスト コントローラー ドライバーによって作成されます。 |
ドキュメントのセクション
ホスト コントローラー ドライバー用のルート ハブ コールバック関数
UCX は、ルート ハブに関連するほとんどの操作を処理します。 これにより、USB ハブ ドライバーは、通常のハブと対話する場合と同じ方法でルート ハブと対話できます。 ホスト コントローラー ドライバーは、そのコールバック関数を登録できます。
USB ホスト コントローラー ドライバーでの I/O 要求の処理
UCX は、受信した USB 要求ブロック (URB) の優先順位付けを行い、それらを適切なエンドポイント キューに転送します。
ホスト コントローラー ドライバーでの USB エンドポイントの構成
ホスト コントローラー ドライバーは、エンドポイントに関連付けられているキューを UCX が管理する場合や、コントローラー ハードウェアにエンドポイントをプログラミングする場合の一翼を担います。
クライアント ドライバーで使用される I/O要求、サポート ルーチン、構造体、およびインターフェイスの仕様を示します。 これらのルーチンおよび関連するデータ構造は、WDK ヘッダーで定義されています。
UCX は、フレームワーク クラス拡張機能と呼ばれます。
ホスト コントローラー ドライバーは、クライアント ドライバーと呼ばれます。