编写设备驱动程序

等时请求

等时请求用于速率恒定、与时间相关的流数据。出现错误时不会进行重试。等时请求具有以下特定于请求的字段:

isoc_frame_no

当必须从特定的帧编号启动总体传输时,请指定此字段。此字段的值必须大于当前帧编号。使用 usb_get_current_frame_number(9F) 可查找当前帧编号。请注意,当前帧编号为活动目标。对于低速和全速总线,将每 1 毫秒更新一次当前帧。对于高速总线,将每 0.125 毫秒更新一次当前帧。应设置 USB_ATTR_ISOC_START_FRAME 属性以便可以识别 isoc_frame_no 字段。

要忽略此帧编号字段并尽快启动,请设置 USB_ATTR_ISOC_XFER_ASAP 标志。

isoc_pkts_count

此字段是请求中的包数。此值受由 usb_get_max_pkts_per_isoc_request(9F) 函数返回的值和 isoc_pkt_descr 数组(参见下面的内容)的大小限制。该请求中可传输的字节数等于此 isoc_pkts_count 值与端点的 wMaxPacketSize 值的乘积。

isoc_pkts_length

此字段是请求的所有包的长度之和。此值由启动器设置。应将此值设置为零,以便自动使用 isoc_pkt_descr 列表中 isoc_pkts_length 的和,而不对此元素应用任何检查。

isoc_error_count

此字段是完成时出现错误的包数。此值由 USBA 2.0 框架设置。 

isoc_pkt_descr

此字段指向定义每个包传输数据量的包描述符的数组。对于传出请求,此值定义要处理的子请求的专用队列。对于传入请求,此值描述数据块的到达方式。客户机驱动程序将为传出请求分配这些描述符。框架将为传入请求分配和初始化这些描述符。此数组中的描述符包含框架初始化的字段,这些字段存储实际传输的字节数和传输的状态。有关更多详细信息,请参见 usb_isoc_request(9S) 手册页。

所有请求都必须接收已初始化的消息块。此消息块提供数据或存储数据。有关 mblk_t 消息块类型的说明,请参见 mblk(9S) 手册页。

USB_ATTR_ONE_XFER 标志是非法属性,因为系统将决定如何通过可用包数改变数据量。USB_ATTR_SHORT_XFER_OK 标志仅对主机绑定的数据有效。

无论是否设置 USB_FLAGS_SLEEP 标志,usb_pipe_isoc_xfer(9F) 函数都会使所有等时传输成为异步传输。所有等时输入请求都将启动轮询。

调用 usb_pipe_stop_isoc_polling(9F) 函数可取消定期轮询。停止轮询或关闭管道时,将通过异常回调返回原始请求结构。此返回的请求结构的完成原因将被设置为 USB_CR_STOPPED_POLLING

轮询会一直继续,直到发生以下某个事件: