_URB_ISOCH_TRANSFER構造体 (usb.h)
_URB_ISOCH_TRANSFER構造体は、USB クライアント ドライバーが等時性転送パイプにデータを送信したり、等時性転送パイプからデータを取得したりするために使用されます。
構文
struct _URB_ISOCH_TRANSFER {
struct _URB_HEADER Hdr;
USBD_PIPE_HANDLE PipeHandle;
ULONG TransferFlags;
ULONG TransferBufferLength;
PVOID TransferBuffer;
PMDL TransferBufferMDL;
struct _URB *UrbLink;
struct _URB_HCD_AREA hca;
ULONG StartFrame;
ULONG NumberOfPackets;
ULONG ErrorCount;
USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1];
};
メンバー
Hdr
URB ヘッダー情報を指定する _URB_HEADER 構造体へのポインター。 Hdr.Function はURB_FUNCTION_ISOCH_TRANSFERする必要があり、 Hdr.Length はこの可変長データ構造のサイズである必要があります。
PipeHandle
等時性パイプへの不透明なハンドルを指定します。 ホスト コントローラー ドライバーは、クライアント ドライバーが URB の種類が URB_FUNCTION_SELECT_CONFIGURATIONのデバイス構成を選択したとき、またはクライアント ドライバーが URB_FUNCTION_SELECT_INTERFACE 型の URB を持つインターフェイスの設定を変更すると、このハンドルを返します。
TransferFlags
0、1、または次のフラグの組み合わせを指定します。
TransferBufferLength
TransferBuffer で指定されたバッファーまたは TransferBufferMDL で説明されているバッファーの長さをバイト単位で指定します。 ホスト コントローラー ドライバーは、このメンバー内のパイプとの間で送受信されるバイト数を返します。
TransferBuffer
TransferBufferMDL で MDL が指定されている場合、転送の常駐バッファーへのポインターは NULL です。 このバッファーの内容は、 TransferFlags の値によって異なります。 USBD_TRANSFER_DIRECTION_INが指定されている場合、このバッファーには、ホスト コントローラー ドライバーから返されるときにデバイスから読み取られたデータが含まれます。 それ以外の場合、このバッファーには、デバイスに転送するためのドライバー指定のデータが含まれます。
TransferBufferMDL
TransferBuffer でバッファーが指定されている場合、常駐バッファーを記述する MDL へのポインターは NULL です。 バッファーの内容は、 TransferFlags の値によって異なります。 USBD_TRANSFER_DIRECTION_INが指定されている場合、記述されたバッファーには、ホスト コントローラー ドライバーから返されるときにデバイスから読み取られたデータが含まれます。 それ以外の場合、バッファーには、デバイスに転送するためのドライバー指定のデータが含まれます。 この MDL は、非ページ プールから割り当てる必要があります。
UrbLink
予約済み。 使用しないでください。
hca
予約済み。 使用しないでください。
StartFrame
転送を開始するフレーム番号を指定します。 この変数は、現在のフレームのシステム定義範囲内にある必要があります。 範囲は定数USBD_ISO_START_FRAME_RANGEによって指定されます。
TransferFlags でSTART_ISO_TRANSFER_ASAPが設定されている場合、このメンバーには、ホスト コントローラー ドライバーによって要求が返されたときに転送が開始されたフレーム番号が含まれます。 それ以外の場合、このメンバーには、この転送が開始されるフレーム番号を含める必要があります。
NumberOfPackets
可変長配列メンバー IsoPacket によって記述されるパケットの数を指定します。
ErrorCount
ホスト コントローラー ドライバーからの返り時にエラー状態で完了したパケットの数を格納します。
IsoPacket[1]
USB バスで転送される等時性転送パケットを記述する USBD_ISO_PACKET_DESCRIPTOR 構造体の可変長配列が含まれます。 このメンバーの詳細については、「解説」セクションを参照してください。
注釈
転送内のすべてのパケットでエラーが生成されたか、要求が適切な形式ではなく、まったく実行できなかった場合を除き、USB バス ドライバーは常に Hdr.Status で USBD_STATUS_SUCCESS の値を返します。 次の表に、 Hdr.Status で返される可能性のあるエラー コードを示します。
エラー値 | 意味 |
---|---|
USBD_STATUS_ISOCH_REQUEST_FAILED | 等時性要求のすべてのパケットがエラーで完了したことを示します。 |
USBD_STATUS_BAD_START_FRAME | 要求された開始フレームが現在の USB フレームのUSBD_ISO_START_FRAME_RANGE内にないことを示します。 |
USBD_ISO_NOT_ACCESSED_LATE | 要求された開始フレームに基づいて、すべてのパケットが送信に遅すぎてパケットが送信されなかったことを示します。 |
USBD_STATUS_INVALID_PARAMETER | いずれかの URB パラメーターが正しくなかったことを示します。 |
ホスト コントローラーは、USB デバイスに等時性要求を送信する前に、データの送受信先となるデバイスのエンドポイントに関する情報を必要とします。 この情報は、選択した構成記述子から取得されるエンドポイント記述子 (USB_ENDPOINT_DESCRIPTOR) に格納されます。 バス ドライバーは、エンドポイント記述子を取得した後、等時性転送パイプを作成してデータ転送を設定します。 パイプの属性は、 USBD_PIPE_INFORMATION 構造体に格納されます。 等時性転送の場合、メンバーは次のように設定されます。
- PipeType メンバーは転送の種類を指定し、UsbdPipeTypeIsochronous に設定されます。
- MaximumPacketSize メンバーは、1 つのパケットを構成するデータの量をバイト単位で指定します。 等時性転送の場合、パケット サイズは固定され、0 から 1024 の値を指定できます。 パケット サイズは、エンドポイント記述子の wMaxPacketSize 値と等しいか、または小さくなります。
- Interval メンバーは、エンドポイント記述子の bInterval 値から派生します。 この値は、バスでデータが送信される頻度を示すポーリング期間を計算するために使用されます。 フルスピードデバイスの場合、期間は1ミリ秒フレームの単位で測定されます。高速デバイスの場合、期間はマイクロフレームで測定されます。
フルスピード デバイスの場合、フレーム内で転送できるパケットは 1 つだけです。ビット 12.. 11 は予約され、ゼロに設定されます。
高速デバイスの場合、データは 1 つのパケットで転送することも、マイクロフレーム内で複数のパケットにまたがる場合もあります。
ビット 12.. 11 が n に設定されている場合は、マイクロフレームごとにバイトを転送 (n+1)*MaximumPacketSize
できます。 ビット 12.. 11 をゼロに設定すると、マイクロフレーム内で転送できるパケットは 1 つだけであることを示します。 ビット 12.. 11 が 1 に設定されている場合、ホスト コントローラーはマイクロフレームで 2 つのパケットを転送できます。
_URB_ISOCH_TRANSFER の IsoPacket メンバーは、転送バッファー レイアウトを記述するUSBD_ISO_PACKET_DESCRIPTORの配列です。 配列内の各要素は、1 つのマイクロフレームで転送されるデータに関連付けられます。 IsoPacket に n 個の要素がある場合、ホスト コントローラーの転送では、n フレーム (フルスピード デバイスの場合) またはマイクロフレーム (高速デバイスの場合) を使用してデータを転送します。 IsoPacket[i]。オフセット メンバーは、送受信するデータの量を追跡するために使用されます。 これは、要求の転送バッファー全体の先頭からバイト オフセットを設定することによって行われます。
たとえば、1024 バイト サイズのパケットを転送するために使用できるマイクロフレームは 5 つあります。
ビット 12.. 11 がゼロ (マイクロフレーム転送ごとに 1 つのパケットを示す) に設定されている場合、 IsoPacket には次のエントリが含まれます。
マイクロフレーム 1 IsoPacket.Element[0].Offset = 0
(開始アドレス)
マイクロフレーム 2 IsoPacket.Element[1].Offset = 1024
マイクロフレーム 3 IsoPacket.Element[2].Offset = 2048
マイクロフレーム 4 IsoPacket.Element[3].Offset = 3072
マイクロフレーム 5 IsoPacket.Element[4].Offset = 4096
ビット 12.. 11 が 1 に設定されている場合 (マイクロフレームごとに 2 つのパケットを示します)、 IsoPacket には次のエントリが含まれます。
マイクロフレーム 1 IsoPacket.Element[0].Offset = 0
(開始アドレス)
マイクロフレーム 2 IsoPacket.Element[1].Offset = 2048
マイクロフレーム 3 IsoPacket.Element[2].Offset = 4096
マイクロフレーム 4 IsoPacket.Element[3].Offset = 6144
マイクロフレーム 5 IsoPacket.Element[4].Offset = 8192
メモ 複数のパケットの場合、オフセット値はマイクロフレーム内のすべてのパケットのサイズを示します。
IsoPacket[i]。Length メンバーはホスト コントローラーによって更新され、等時性 IN 転送のためにデバイスから受信された実際のバイト数を示します。 IsoPacket[i].等 時性 OUT 転送には長さは使用されません。
ドライバーは 、GET_ISO_URB_SIZE マクロを使用して、URB 全体を保持するために必要なサイズを決定できます。 長さが小さすぎてこのパケット用に確保された領域を埋めきらない場合、バス ドライバーは、取得したデータの末尾から次のパケットのオフセットまでのギャップを残します。 バス ドライバーは、バッファー領域を無駄にしないようにオフセットを調整しません。
TransferBuffer または TransferBufferMDL メンバーは、事実上連続するバッファーを指定する必要があります。
この構造体の一部であるが、ここでは不透明として説明されていない他のメンバーを扱います。 これらはシステム用に予約されています。
要件
要件 | 値 |
---|---|
Header | usb.h (Usb.h を含む) |