USB ドライバー
USB バス用のカーネル モードの静止画像ドライバーは、複数の割り込み、一括 IN、および一括 OUT エンドポイントと共に 1 つの制御エンドポイントをサポートします。 制御エンドポイントと割り込みエンドポイントには、I/O 制御コードと DeviceIoControl を使用してアクセスできます。 一括エンドポイントには、ReadFile と WriteFile を使用してアクセスできます。
DeviceIoControl、ReadFile、または WriteFile を呼び出す前に、CreateFile (すべて Microsoft Windows SDK ドキュメントで説明) を呼び出してデバイス ハンドルを取得する必要があります。 各エンドポイントの種類 (制御、割り込み、一括 IN、一括 OUT) をサポートしていないデバイスの場合、CreateFile を 1 回呼び出すと、各エンドポイントへの転送パイプが開きます。
複数の割り込みまたは一括エンドポイントをサポートするデバイスの場合、CreateFile を 1 回呼び出すと、各種類の最上位のエンドポイントへの転送パイプが開きます。 別のエンドポイントを使用する場合は、次の操作を行う必要があります。
DeviceIoControl を呼び出し、IOCTL_GET_PIPE_CONFIGURATION の I/O 制御コードを指定して、ポートのエンドポイント インデックス番号 (つまり、返された USBSCAN_PIPE_INFORMATION 構造体配列へのインデックス) を決定します。 これらのインデックス番号は、ユニバーサル シリアル バス仕様で説明されているエンドポイント番号ではないことに注意してください。
CreateFile を呼び出すときに IStiDeviceControl::GetMyDevicePortName によって返されるポート名に円記号とエンドポイントのインデックス番号を追加します。
たとえば、(ポート名が "usbscan0" の) デバイスに、次のようなインデックス番号を持つ各種類 (割り込み、一括 IN、一括 OUT) の 2 つのエンドポイントがあるとします。
インデックス | Type | Endpoint# |
---|---|---|
0 | 割り込み | 0x01 |
1 | 一括 IN | 0x82 |
2 | 一括 IN | 0x83 |
3 | 一括 OUT | 0x04 |
4 | 一括 OUT | 0x05 |
5 | 割り込み | 0x06 |
ポート名が "usbscan0" の CreateFile を呼び出すと、関数は、インデックス値が 2、4、5 のエンドポイントと制御エンドポイントへの転送パイプを開きます。
ポート名が "usbscan0\1" の CreateFile を呼び出すと、関数は、インデックス値が 1、4、5 のエンドポイントと制御エンドポイントへの転送パイプを開きます。
このデバイスでは、割り込みエンドポイント 0、一括 IN エンドポイント 1、一括 OUT エンドポイント 3 を使用する場合は、"usbscan0\0"、"usbscan0\1"、"usbscan0\3" のポート名を指定して CreateFile を 3 回呼び出します。 これにより、3 つのデバイス ハンドルが作成されます。 DeviceIoControl、ReadFile、または WriteFile への後続の呼び出しが行われるたびに、目的のパイプに関連付けられているデバイス ハンドルを指定する必要があります。
サポートされている制御エンドポイントは 1 つだけなので、制御パイプを使用する I/O 制御コードを指定すると、CreateFile に指定されたエンドポイント (存在する場合) に関係なく、ドライバーは適切なエンドポイントを使用します。
すべての I/O 制御コードの説明については、「USB 静止画像 I/O 制御コード」を参照してください。
カーネル モード USB ドライバーは、パッケージまたはメッセージ プロトコルを実装していません。 読み取り操作では特定のパケット アラインメントは必要ありませんが、読み取り要求が最大パケット サイズ境界にアラインされている場合は、パフォーマンスを向上させることができます。 最大パケット サイズは、IOCTL_GET_CHANNEL_ALIGN_RQST I/O 制御コードを使用して取得できます。