_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
指定以下标志的零、一个或组合:
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 毫秒帧为单位测量;对于高速设备,周期以微帧为单位测量。
对于全速设备,在帧内只能传输一个数据包;bits 12..保留 11 个 并将其设置为零。
对于高速设备,可以在单个数据包中传输数据,也可以在微帧内跨多个数据包。
如果位 12.。11 设置为 n,可以传输每个微帧 (n+1)*MaximumPacketSize
字节。 位 12.。11 设置为零表示在微帧中只能传输一个数据包。 如果位 12.。11 设置为 1,主机控制器可以在微帧中传输两个数据包。
_URB_ISOCH_TRANSFER 的 IsoPacket 成员是描述传输缓冲区布局的 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 所需的大小。 如果长度太小,无法填补为此数据包预留的空间,则总线驱动程序会将检索到的数据末尾的空白留到下一个数据包的偏移量。 总线驱动程序不会调整偏移量,以避免浪费缓冲区空间。
TransferBuffer 或 TransferBufferMDL 成员必须指定几乎连续的缓冲区。
将属于此结构的其他成员视为不透明。 它们保留供系统使用。
要求
要求 | 价值 |
---|---|
标头 | usb.h (包括 Usb.h) |