USB デバイスの使用

このトピックでは、バージョン 2 以降のカーネル モード ドライバー フレームワーク (KMDF) またはユーザー モード ドライバー フレームワーク (UMDF) ドライバーが Windows ドライバー フレームワーク (WDF) によって提供される USB デバイス オブジェクト メソッドを使用して実行できる操作について説明します。

このチュートリアルは、次のセクションで構成されています。

簡単な KMDF ベースの USB クライアント ドライバーを記述する手順については、「最初の USB クライアント ドライバー (KMDF)を記述する方法」をご参照ください。

USB デバイス オブジェクトの作成

フレームワークの USB I/O ターゲット オブジェクト (WDFUSBDEVICE、WDFUSBINTERFACE、WDFUSBPIPE) を使用するには、クライアント ドライバーが最初に WdfUsbTargetDeviceCreateWithParameters を呼び出して USB デバイス オブジェクトを作成する必要があります。 通常、ドライバーは、その EvtDevicePrepareHardware コールバック関数から WdfUsbTargetDeviceCreateWithParameters を呼び出します。

ドライバーが WdfUsbTargetDeviceCreateWithParameters を呼び出すと、フレームワークは WDFUSBDEVICE オブジェクトを作成し、USB デバイスを表す FDO に関連付けます。 このメソッドは、USB クライアント ドライバーが物理デバイスとの通信に使用できる新しいフレームワーク USB デバイス オブジェクトへのハンドルを返します。

WdfUsbTargetDeviceCreateWithParameters を呼び出した後、ドライバーは WdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceRetrieveConfigDescriptor を呼び出して、デバイスから USB 記述子を取得できます。 これらの記述子には、デバイスの最初の構成、そのインターフェース設定、および定義されたエンドポイントに関する情報が含まれています。 (USB 記述子は公式の USB 仕様で定義されています。)

USB デバイスの構成

WdfUsbTargetDeviceCreateWithParameters メソッドは、デバイスの最初の構成に含まれる各 USB インターフェイスのフレームワーク USB インターフェイス オブジェクトも作成します。

WdfUsbTargetDeviceCreateWithParameters を呼び出した後、クライアント ドライバーは WdfUsbTargetDeviceSelectConfig を呼び出して構成を選択する必要があります。 このメソッドは、選択した構成のインターフェイスの代替設定ごとにフレームワーク インターフェイス オブジェクトを作成します。

また、このメソッドは、選択した構成の各インターフェイスの各代替設定で定義されているエンドポイントを表すパイプ オブジェクトも作成します。

構成を選択したら、必要に応じて、構成のインターフェースの代替設定を変更できます。

WdfUsbTargetDeviceSelectConfig を呼び出して、デバイスを構成解除することもできます。

関連情報については、以下をご覧ください。

デバイス情報の取得

デバイスを構成した後、クライアント ドライバーは次のメソッドを呼び出して、USB デバイスに関する情報を取得できます。

WdfUsbTargetDeviceQueryUsbCapability
ホスト コントローラーと USB ドライバー スタックが特定の機能をサポートしているかどうかを判断します。 WdfUsbTargetDeviceQueryUsbCapability を呼び出す前に、ドライバーは WdfUsbTargetDeviceCreateWithParameters を呼び出す必要があります。

WdfUsbTargetDeviceGetIoTarget
USB デバイスに関連付けられている I/O ターゲット オブジェクトへのハンドルを返します。 ドライバーは、このハンドルを WdfRequestSend または WdfIoTargetStop に渡すことができます。

WdfUsbTargetDeviceRetrieveInformation
USB デバイスに関連付けられているバージョンと機能情報を取得します。

WdfUsbTargetDeviceIsConnectedSynchronous (KMDF のみ)
デバイスが接続されているかどうかを判断します。

WdfUsbTargetDeviceRetrieveCurrentFrameNumber (KMDF のみ)
現在の USB フレーム番号を取得します。

USB 記述子の取得

USB デバイスの記述子に含まれている Unicode 文字列を取得するには、ドライバーは、次のいずれかのメソッドを呼び出すことができます。

WdfUsbTargetDeviceGetDeviceDescriptor
デバイスの USB デバイス記述子を取得します。

WdfUsbTargetDeviceRetrieveConfigDescriptor
デバイス の USB 構成記述子、インターフェイス記述子、およびエンドポイント記述子を取得します。

WdfUsbTargetDeviceQueryString
ドライバーが提供するバッファーに Unicode 文字列をコピーします。

WdfUsbTargetDeviceAllocAndQueryString
フレームワークが提供するバッファーに Unicode 文字列をコピーします。

WdfUsbTargetDeviceFormatRequestForString
Unicode 文字列の要求を書式設定します。 ドライバーは、同期的または非同期的に要求を送信する WdfRequestSend を呼び出すことができます。

制御転送の送信

ドライバーは、標準、デバイス クラス固有、またはベンダー固有の USB コントロール転送を記述する I/O 要求を送信する次のメソッドを呼び出すことができます。

WdfUsbTargetDeviceSendControlTransferSynchronously
USB コントロール転送要求を同期的に送信します。

WdfUsbTargetDeviceFormatRequestForControlTransfer
USB コントロール転送の要求を書式設定します。 ドライバーは、同期的または非同期的に要求を送信する WdfRequestSend を呼び出すことができます。

関連情報については、「USB コントロール転送を送信する方法」をご参照ください。

デバイスのポートのリセットと電源循環

ドライバーは、デバイスが接続されている USB ポートをリセットまたは電源サイクルに次のメソッドを呼び出すことができます。

WdfUsbTargetDeviceResetPortSynchronously
デバイスの USB ポートをリセットする要求を同期的に送信します。

WdfUsbTargetDeviceCyclePortSynchronously (KMDF のみ)
デバイスの USB ポートの電源サイクルに要求を同期的に送信します。

WdfUsbTargetDeviceFormatRequestForCyclePort (KMDF only)
デバイスの USB ポートを電源サイクルするように要求を書式設定します。 ドライバーは、同期的または非同期的に要求を送信する WdfRequestSend を呼び出す必要があります。

関連情報については、「USB パイプ エラーから回復する方法」をご参照ください。

デバイスへの URB の送信

KMDF ドライバーが、URL を含む I/O 要求を送信して USB デバイスと通信する場合、ドライバーは次のメソッドを呼び出すことができます。

WdfUsbTargetDeviceCreateUrb (KMDF のみ)
USB 要求ブロック (URB) を割り当てます。 WdfUsbTargetDeviceCreateUrb を呼び出す前に、ドライバーは WdfUsbTargetDeviceCreateWithParameters を呼び出す必要があります。

WdfUsbTargetDeviceCreateIsochUrb (KMDF のみ)
等時性 USB 要求ブロック (URB) を割り当てます。 WdfUsbTargetDeviceCreateIsochUrb を呼び出す前に、ドライバーは WdfUsbTargetDeviceCreateWithParameters を呼び出す必要があります。

WdfUsbTargetDeviceSendUrbSynchronously (KMDF のみ)
URB を含む I/O 要求を同期的に送信します。

WdfUsbTargetDeviceFormatRequestForUrb (KMDF のみ)
URB を含む I/O 要求を書式設定します。 ドライバーは、同期的または非同期的に要求を送信する WdfRequestSend を呼び出す必要があります。

WdfUsbTargetDeviceWdmGetConfigurationHandle (KMDF のみ)
デバイスの USBD 構成ハンドルを返します。 一部の URB には、このハンドルが必要です。

URB に関する一般的な概念の背景情報については、「URB の割り当てと構築」をご参照ください。