_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、または次のフラグの組み合わせを指定します。

意味
USBD_TRANSFER_DIRECTION_IN
デバイスからデータを要求するように設定されます。 デバイスにデータを転送するには、このフラグをクリアする必要があります。
USBD_SHORT_TRANSFER_OK
エンドポイントの最大パケット サイズより短いパケットをデバイスから受信したときに、ホスト コントローラーがエラーを返さないように設定します。 バス ドライバーは等時性パイプで短いパケットを受信してもエラーを返さないため、このフラグは等時性パイプには影響しません。
USBD_START_ISO_TRANSFER_ASAP
パイプを開いた後、または最後にリセットしてからパイプに転送が送信されていない場合は、次のフレームで転送を開始します。 それ以外の場合、転送は、パイプに対して現在キューに登録されているすべての要求に続く最初のフレームで開始されます。 転送が開始される実際のフレームは、ホスト コントローラー ドライバーによってバスの待機時間に合わせて調整されます。

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ミリ秒フレームの単位で測定されます。高速デバイスの場合、期間はマイクロフレームで測定されます。
ホスト コントローラーは、デバイスの種類に応じて (フレームまたはマイクロフレーム内で) 転送できるデータの量も決定します。 この情報は、エンドポイント記述子の wMaxPacketSize のビット 12.. 11 で使用できます。

フルスピード デバイスの場合、フレーム内で転送できるパケットは 1 つだけです。ビット 12.. 11 は予約され、ゼロに設定されます。

高速デバイスの場合、データは 1 つのパケットで転送することも、マイクロフレーム内で複数のパケットにまたがる場合もあります。 ビット 12.. 11n に設定されている場合は、マイクロフレームごとにバイトを転送 (n+1)*MaximumPacketSize できます。 ビット 12.. 11 をゼロに設定すると、マイクロフレーム内で転送できるパケットは 1 つだけであることを示します。 ビット 12.. 11 が 1 に設定されている場合、ホスト コントローラーはマイクロフレームで 2 つのパケットを転送できます。

_URB_ISOCH_TRANSFERIsoPacket メンバーは、転送バッファー レイアウトを記述するUSBD_ISO_PACKET_DESCRIPTORの配列です。 配列内の各要素は、1 つのマイクロフレームで転送されるデータに関連付けられます。 IsoPacketn 個の要素がある場合、ホスト コントローラーの転送では、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 を含む)

こちらもご覧ください

USB 等時性エンドポイントにデータを転送する方法

Urb

USB 構造体

USBD_ISO_PACKET_DESCRIPTOR

USBD_IsochUrbAllocate

_URB_HEADER