パイプ ポリシー修正のための WinUSB 関数
アプリケーションがエンドポイント パイプの既定ポリシー パラメーターを取得および設定できるようにするために、Winusb.dll はパイプの既定ポリシーを取得する WinUsb_GetPipePolicy 関数を公開します。 WinUsb_SetPipePolicy 関数を使用して、アプリケーションはポリシー パラメーターを新しい値に設定できます。
WinUSB では、エンドポイントのパイプにポリシーを適用することで、既定の振る舞いを変更できます。 これらのポリシーを使用することで、WinUSB をデバイスの機能に最も適合するように構成できます。 次の表に、WinUSB でサポートされているパイプ ポリシーの一覧を示します。
Note
表で説明されているポリシーは、指定したエンドポイントに対してのみ有効です。 他のエンドポイントにポリシーを設定しても、読み取りまたは書き込み要求に対する WinUSB の振る舞いには影響しません。
ポリシー番号 | ポリシー名 | 説明 | エンドポイント (方向) | 規定値 |
---|---|---|---|---|
0x01 | SHORT_PACKET_TERMINATE | バッファーがエンドポイントでサポートされている最大パケット サイズの倍数である場合、書き込み要求の完了時に長さ 0 のパケットを送信します。 | Bulk (OUT) Interrupt (OUT) |
FALSE |
0x02 | AUTO_CLEAR_STALL | データ フローを停止することなく、停止したパイプを自動的にクリアします。 | Bulk (IN) Interrupt (IN) |
FALSE |
0x03 | PIPE_TRANSFER_TIMEOUT | 要求をキャンセルする前に、タイムアウト間隔 (ミリ秒単位) が経過するまで待機します。 | Bulk (IN) Bulk (OUT) Interrupt (IN) Interrupt (OUT) |
制御の場合は 5 秒 (5,000 ミリ秒)。その他の場合は 0 |
0x04 | IGNORE_SHORT_PACKETS | ショート パケットを受信するか、一定数のバイトが読み取られると、読み取り要求が完了します。 ファイル サイズが不明な場合、要求はショート パケットで終了します。 | Bulk (IN) Interrupt (IN) |
FALSE |
0x05 | ALLOW_PARTIAL_READS | 呼び出し元が要求したよりも多くのデータを返すデバイスからの読み取り要求を許可します。 | Bulk (IN) Interrupt (IN) |
TRUE |
0x06 | AUTO_FLUSH | 読み取り要求からの超過データを保存し、次の読み取り要求に追加するか、超過データを破棄します。 | Bulk (IN) Interrupt (IN) |
FALSE |
0x07 | RAW_IO | キューとエラー処理をバイパスして、複数の読み取り要求のパフォーマンスを向上させます。 | Bulk (IN) Interrupt (IN) |
FALSE |
0x08 | MAXIMUM_TRANSFER_SIZE | WinUSB でサポートされている USB 転送の最大サイズを取得します。 これは読み取り専用ポリシーであり、WinUsb_GetPipePolicy を呼び出すことで取得できます。 | Bulk (IN) Bulk (OUT) Interrupt (IN) Interrupt (OUT) |
|
0x09 | RESET_PIPE_ON_RESUME | サスペンドから復帰した後、新しい要求を受け入れる前にエンドポイントのパイプをリセットします。 | Bulk (IN) Bulk (OUT) Interrupt (IN) Interrupt (OUT) |
FALSE |
次の表では、各パイプ ポリシーの使用方法のベスト プラクティスを示し、ポリシーを有効にした場合の振る舞いについて説明します。
ポリシー | 有効にする場合 | 動作 |
---|---|---|
SHORT_PACKET_TERMINATE(0x01) | デバイスで OUT 転送が長さ 0 のパケットで終了する必要がある。 ほとんどのデバイスにはこの要件はありません。 | 有効にした場合 (ポリシー パラメーター値が TRUE であるか 0 以外の場合)、エンドポイントでサポートされている最大パケット サイズの倍数であることが前提で、各書き込み要求の完了時に長さ 0 のパケットが送信されます。 ホスト コントローラーにデータを送信した後、WinUSB は長さ 0 のパケットで書き込み要求を送信し、WinUsb_WritePipe によって作成された要求を完了します。 |
AUTO_CLEAR_STALL | 失敗した転送によりエンドポイントが停止状態になることを避ける必要がある。 このポリシーは、RAW_IO が無効になっているときにエンドポイントに対する保留中の読み取り要求が複数ある場合にのみ便利です。 |
|
PIPE_TRANSFER_TIMEOUT | エンドポイントへの転送が特定の時間内に完了する必要がある。 |
|
IGNORE_SHORT_PACKETS | RAW_IO が無効になっており、読み取り要求を完了するためのショート パケットが必要ない。 |
|
ALLOW_PARTIAL_READS | 要求バッファーのサイズがエンドポイントの最大パケット サイズの倍数である場合、デバイスが要求よりも多くのデータを送信できる。 アプリケーションが読み取る合計バイト数を特定するために、先に数バイトを読み取る必要がある場合に使用します。 |
|
AUTO_FLUSH | ALLOW_PARTIAL_READS ポリシーが有効になっている。 デバイスは要求されたよりも多くのデータを送信でき、アプリケーションは他のデータを必要としません。 これは、要求バッファーのサイズが最大エンドポイント パケット サイズの倍数であることが前提です。 |
AUTO_FLUSH は、ALLOW_PARTIAL_READS が有効な場合の WinUSB の振る舞いを定義します。 ALLOW_PARTIAL_READS を無効にした場合、AUTO_FLUSH 値は WinUSB によって無視されます。 WinUSB は残りのデータを破棄するか、呼び出し元の次の読み取り要求と共に送信できます。
|
RAW_IO | パフォーマンスが優先され、アプリケーションは同じエンドポイントに同時に読み取り要求を送信する。 RAW_IO は、WinUsb_ReadPipe で呼び出し元から渡されるバッファーに特定の制限を課します。
|
有効にした場合、転送はキューとエラー処理をバイパスして、複数の読み取り要求のパフォーマンスを向上させます。 WinUSB は読み取り要求を次のように処理します。
この設定を有効にした場合、ある転送の最後のパケットと次の転送の最初のパケットとの間の遅延が短くなるため、複数の読み取り要求のパフォーマンスが大幅に向上します。 |
RESET_PIPE_ON_RESUME | デバイスはサスペンド後のデータのトグル状態を保持しません。 | サスペンドから復帰すると、WinUSB は呼び出し元がエンドポイントに新しい要求を送信できるようになる前に、エンドポイントをリセットします。 |