USB ホスト コントローラー ドライバーでの USB エンドポイントの構成
UCX はエンドポイント オブジェクトの作成を管理し、USB ホスト コントローラーに対してエンドポイントのプログラムまたはプログラム解除を行うようにホスト コントローラーに通知します。
エンドポイントがプログラムされると、UCX による管理も行われます。 エンドポイントの状態が変化するのは、デバイスがバスに接続されたときやバスから切断されたとき、サスペンドやリセットなどの電源イベントが発生したとき、代替設定の変更など新しいエンドポイント作成が発生したときです。
エンドポイントの構成
UCX は、エンドポイントを USB ホスト コントローラーにプログラミングする必要があるときまたは解放する必要があるときに、ホスト コントローラー ドライバーによって実装されたコールバック関数を呼び出してドライバーに通知します。 EVT_UCX_USBDEVICE_ENABLE が呼び出されると、ドライバーは、デバイスの既定のエンドポイントへの転送を実行するためにコントローラーを準備します。 コントローラーの準備には、既定のエンドポイントのプログラミングが含まれます。 EVT_UCX_USBDEVICE_DISABLE が呼び出されると、ドライバーは既定のエンドポイントのプログラムを解除し、デバイスに関連付けられている他のコントローラー リソースを解放します。 EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE が呼び出されると、コントローラーにプログラムする既定以外のエンドポイントの一覧と、コントローラーから削除する既定以外のエンドポイントの別の一覧がドライバーに渡されます。 するとホスト コントローラー ドライバーは、指定された既定以外のエンドポイントをコントローラーにプログラムし、また、既定以外のエンドポイント (他の一覧で指定) をコントローラーから削除します。
キューの状態管理
UCX は、ホスト コントローラー ドライバーによって実装されたコールバック関数を呼び出して、エンドポイント キューの状態を変更します。 するとドライバーは、UCX に渡されたエンドポイント キューと、ドライバー内で維持されている第 2 レベルのキューに対して、対応するアクションを実行します。 以下のシナリオでは、エンドポイント キューが中止または削除されます。
- USB デバイス クライアント ドライバーが、URB_FUNCTION_ABORT_PIPE 要求を送信した。
- サスペンド中。
- デバイスが接続されているハブで、デバイスの切断が検出された。
- インターフェイス選択の設定要求中。
UCX は、キューの中止または削除についてホスト コントローラー ドライバーに通知する場合、EVT_UCX_ENDPOINT_ABORT または EVT_UCX_ENDPOINT_PURGE を呼び出します。 後で UCX によってエンドポイント キューが必要になった場合、UCX は EVT_UCX_ENDPOINT_START コールバックを呼び出して、キューを開始するようにドライバーに通知します。
転送の取り消し
ホスト コントローラー ドライバーが GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL を宣言しているコントローラーの場合、トランザクション トランスレーター (TT) ハブの背後にある USB 高速または低速デバイスへの非同期 (バルクまたはコントロール) USB 転送を取り消すには、ドライバーは UcxEndpointNeedToCancelTransfers を呼び出し、 EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS を実装する必要があります。 それ以外のすべての場合、ドライバーは必要に応じて UcxEndpointNeedToCancelTransfers を呼び出すことで、EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS 通知 (このエンドポイントで転送の取り消しが許可され、ドライバーが転送の取り消しを続行できることを示す) を取得できます。 または、ドライバーは UcxEndpointNeedToCancelTransfers を呼び出さずに、転送を直接取り消すこともできます。
ホスト コントローラー ドライバーは、この GUID に対する要求に常に失敗する場合、これら 2 つの関数呼び出しを完全に無視できます。
ドライバーが UcxEndpointNeedToCancelTransfers をまったく呼び出さなかった場合、ドライバーの EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS コールバックは呼び出されず、コールバックの登録中に NULL になる可能性があります。
ドライバーは、UcxEndpointNeedToCancelTransfers を使用する場合、転送がコントローラーにプログラムされた後取り消されたときにこのメソッドを呼び出し、完了する前に EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS を待機する必要があります。