共用方式為


_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 毫秒畫面為單位來測量;針對高速裝置,期間是以微框架來測量。
主機控制器也會根據裝置類型,決定可以傳輸的數據量(在畫面內或微框架內)。 此資訊可在位 12 中取得。11 端點描述元中的 wMaxPacketSize

針對全速裝置,在框架內只能傳輸一個封包;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 包含下列專案:

微框架 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 包含下列專案:

微框架 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