USB ホスト コントローラー ドライバーでの I/O 要求の処理
UCX によって送信される I/O 要求を処理するためのホスト コントローラー ドライバーのベスト プラクティス。
UCX は、USB バス上のデバイスのホスト コントローラー ドライバーによって作成されたすべてのエンドポイントを追跡します。 ハブ ドライバーまたは USB デバイス スタックの上位にある別のドライバーによって送信されたデータ転送要求は、まず UCX によって処理されます。 UCX は、フレームワーク要求オブジェクトを正しいエンドポイント キューに転送する役割を担います。 要求に含まれる USB 要求ブロック (URB) は、エンドポイント ハンドルを指定できます。 エンドポイント ハンドルが指定されている場合、UCX はデバイスに存在するエンドポイントの中から対応するエンドポイントを確認します。 指定したエンドポイント ハンドルが存在する場合、要求はエンドポイントのキューに転送されます。 指定したエンドポイント ハンドルが見つからない場合、要求は失敗します。 ハンドルが指定されていない場合、要求は既定のエンドポイントに対するものとなり、UCX はそのデバイスのホスト コントローラ ドライバーの既定のエンドポイント キューに要求を転送します。
既存の USB ドライバーとの互換性を確保するには、ホスト コントローラーは URB 要求を完了するときに次の要件に準拠する必要があります。
- WdfRequestComplete は、DISPATCH_LEVEL で呼び出す必要があります。
- URB がそのフレームワーク キューに配信され、ドライバーが呼び出し側ドライバーのスレッドまたは DPC 上で同期的に URB の処理を開始した場合、要求も同期的に完了すべきではありません。 要求は別の DPC で完了する必要があります。これは、WdfDpcEnqueue の呼び出しでスケジュールできます。
- 上記の要件と同様に、EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE または EVT_WDF_REQUEST_CANCEL を受信すると、ホスト コントローラー ドライバーは、呼び出し元のスレッドまたは DPC とは別の DPC で URB 要求を完了する必要があります。 既定では、WDF はキューでキャンセルされた要求を同期的に完了します。 この動作により、URB 要求の問題が発生する可能性があります。 このため、ドライバーは、URB キューの EvtIoCanceledOnQueue コールバックを提供する必要があります。
IOCTL_INTERNAL_USB_SUBMIT_URB のフレームワーク要求オブジェクトには、要求の Parameters.Others.Arg1 にある URB が含まれています。 要求が完了したら、URB ステータスを USBD_STATUS_SUCCESS または障害の性質を示す障害ステータスに設定する必要があります。 エラー状態の値は、usb.h ヘッダー ファイルで定義されます。