_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_FUNCTION_SELECT_CONFIGURATION 的 URB 选择设备配置时,或者当客户端驱动程序更改具有类型为 URB_FUNCTION_SELECT_INTERFACE 的 URB 的接口的设置时,主机控制器驱动程序将返回此句柄。

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 提供。终结点描述符中 wMaxPacketSize 的 11

对于全速设备,在帧内只能传输一个数据包;bits 12..保留 11 个 并将其设置为零。

对于高速设备,可以在单个数据包中传输数据,也可以在微帧内跨多个数据包。 如果位 12.。11 设置为 n,可以传输每个微帧 (n+1)*MaximumPacketSize 字节。 位 12.。11 设置为零表示在微帧中只能传输一个数据包。 如果位 12.。11 设置为 1,主机控制器可以在微帧中传输两个数据包。

_URB_ISOCH_TRANSFERIsoPacket 成员是描述传输缓冲区布局的 USBD_ISO_PACKET_DESCRIPTOR 数组。 数组中的每个元素都与一个微帧中传输的数据相关联。 如果 IsoPacket 具有 n 元素,则主机控制器传输使用 n 帧(对于全速设备)或微帧(对于高速设备)传输数据。 IsoPacket[i]。偏移量 成员用于跟踪要发送或接收的数据量。 为此,请设置请求的整个传输缓冲区的开头的字节偏移量。

例如,有五个微帧可用于传输 1024 字节大小的数据包。

如果位 12.。11 设置为零(指示每个微帧传输的单个数据包),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(指示每个微帧两个数据包),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]。主机控制器更新长度 成员,以指示从设备接收的实际字节数,以便进行连续 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