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を指定するコントローラーの場合、ドライバーはUcxEndpointNeedToCancelTransfersを呼び出し、トランザクショントランスレーターハブ (TT) の背後にあるUSBフルまたは低速デバイスへの非同期 (バルクまたはコントロール) USB 転送をキャンセルするための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 を待機する必要があります。