_URB_ISOCH_TRANSFER結構 (usb.h)

USB 用戶端驅動程式會使用 _URB_ISOCH_TRANSFER 結構,將數據傳送至或擷取非時序傳輸管道中的數據。

語法

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 的介面設定時,URB_FUNCTION_SELECT_INTERFACE,主機控制器驅動程式會傳回此句柄。

TransferFlags

指定零、一或下列旗標的組合:

意義
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]

包含 USBD_ISO_PACKET_DESCRIPTOR 結構的可變長度數位,描述要傳輸在USB總線上的隨機傳輸封包。 如需此成員的詳細資訊,請參閱一節。

備註

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 成員會指定構成一個封包的數據量,以位元組為單位。 若為連續傳輸,封包大小是固定的,而且可以是0-1024之間的值。 封包大小等於或小於端點描述元的 wMaxPacketSize 值。
  • Interval 成員衍生自端點描述元的 bInterval 值。 這個值是用來計算輪詢期間,指出數據在公交車上傳送的頻率。 對於完整速度裝置,期間是以 1 毫秒畫面格的單位來測量;對於高速裝置,期間是以微框架測量。
主機控制器也會根據裝置類型,決定可以在框架內傳輸 (或微框架) 的數據量。 此資訊可在端點描述項中的 wMaxPacketSize12..11 中取得。

針對全速裝置,在框架內只能傳輸一個封包;bits 12.. 11 會保留並設定為零。

對於高速裝置,數據可以在單一封包中傳輸,或可能會跨越微框架內的多個封包。 如果位 12..11 設定為 n,您可以傳輸 (n+1)*MaximumPacketSize 每個微框架的位元元組。 位 12..11 設定為零,表示在微框架中只能傳送一個封包。 如果位 12..11 設為 1,主機控制器可以在微框架中傳輸兩個封包。

_URB_ISOCH_TRANSFERIsoPacket 成員是描述傳輸緩衝區配置的USBD_ISO_PACKET_DESCRIPTOR數位。 陣列中的每個元素都會與在一個微框架中傳輸的數據相互關聯。 如果 IsoPacketn 個元素,則主控制器會針對高速裝置使用 n 個畫面 () 或微框架 (,) 傳輸數據。 IsoPacket[i]。位移成員用來追蹤要傳送或接收的數據量。 這是透過設定要求整個傳輸緩衝區開頭的位元組位移來完成。

例如,有五個微框架可用來傳輸 1024 位元組大小的封包。

如果位 12..11 設定為零, (表示每個微框架傳輸單一封包 ) ,IsoPacket 會包含下列專案:

Microframe 1 IsoPacket.Element[0].Offset = 0 (起始位址)

Microframe 2 IsoPacket.Element[1].Offset = 1024

Microframe 3 IsoPacket.Element[2].Offset = 2048

Microframe 4 IsoPacket.Element[3].Offset = 3072

Microframe 5 IsoPacket.Element[4].Offset = 4096

如果位 12..11 設定為 1 (表示每個微框架兩個封包 ) ,IsoPacket 會包含下列專案:

Microframe 1 IsoPacket.Element[0].Offset = 0 (起始位址)

Microframe 2 IsoPacket.Element[1].Offset = 2048

Microframe 3 IsoPacket.Element[2].Offset = 4096

Microframe 4 IsoPacket.Element[3].Offset = 6144

Microframe 5 IsoPacket.Element[4].Offset = 8192

注意 針對多個封包,位移值會指出微框架內所有封包的大小。

IsoPacket[i]。主機控制器會更新長度成員,以指出從裝置接收的實際位元元組數目,以進行連續IN傳輸。 IsoPacket[i]。長度 不會用於連續的 OUT 傳輸。

驅動程式可以使用 GET_ISO_URB_SIZE 宏來判斷保存整個 URB 所需的大小。 如果長度太小而無法填滿為這個封包所設定的空間,則總線驅動程式會從擷取的數據結尾保留間距到下一個封包的位移。 總線驅動程式不會調整位移,以避免浪費緩衝區空間。

TransferBufferTransferBufferMDL 成員必須指定幾乎連續的緩衝區。

將屬於此結構的其他成員視為不透明,但此處未描述。 它們會保留供系統使用。

規格需求

需求
標頭 usb.h (包含 Usb.h)

另請參閱

如何將數據傳輸至 USB 時序端點

URB

USB 結構

USBD_ISO_PACKET_DESCRIPTOR

USBD_IsochUrbAllocate

_URB_HEADER