usb.h) (_URB_ISOCH_TRANSFER 结构

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 毫秒帧为单位;对于高速设备,周期以微帧为单位测量。
主机控制器还确定可在帧或微帧) 内 (传输的数据量,具体取决于设备类型。 此信息在终结点描述符中 wMaxPacketSize 的第 12 位 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 包含以下条目:

Microframe 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 包含以下条目:

Microframe 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 成员必须指定几乎连续的缓冲区。

将属于此结构但此处未描述的其他成员视为不透明。 它们保留供系统使用。

要求

要求
Header usb.h (包括 Usb.h)

另请参阅

如何将数据传输到 USB 常时等量终结点

URB

USB 结构

USBD_ISO_PACKET_DESCRIPTOR

USBD_IsochUrbAllocate

_URB_HEADER