编写设备驱动程序

同步传输、异步传输和回调

传输分为同步传输和异步传输。同步传输在完成之前将会一直阻塞。异步传输完成时,将向客户机驱动程序发送回调。在 flags 参数中设置了 USB_FLAGS_SLEEP 标志时调用的传输函数大多数是同步的。

连续传输(如轮询)和等时传输不能是同步的。为了进行连续传输而对传输函数进行的调用(设置了 USB_FLAGS_SLEEP 标志)将会阻塞,目的只是等待资源,然后开始传输。

同步传输是要设置的最简单的传输,因为同步传输不要求任何回调函数。同步传输函数将返回传输开始状态,即使同步传输函数在完成传输前一直阻塞也是如此。完成时,可以在请求的完成原因字段和回调标志字段中查找有关传输状态的其他信息。下面将讨论完成原因字段和回调标志字段。

如果未在 flags 参数中指定 USB_FLAGS_SLEEP 标志,则该传输操作是异步的。此规则的例外是等时传输。异步传输操作将设置并启动传输,然后在传输完成前返回。异步传输操作将返回传输开始状态。客户机驱动程序通过回调处理程序接收传输完成状态。

回调处理程序是在异步传输完成时调用的函数。不要设置不进行回调的异步传输。两种类型的回调处理程序是正常完成处理程序和异常处理程序。您可以指定一个在这两种情况下要调用的处理程序。

完成处理程序和异常处理程序将传输请求作为参数接收。异常处理程序在请求中使用完成原因和回调状态来了解所发生的情况。完成原因 (usb_cr_t) 指示原始事务是如何完成的。例如,完成原因 USB_CR_TIMEOUT 指示传输超时。又如,如果 USB 设备在使用时被移除,则客户机驱动程序可能接收 USB_CR_DEV_NOT_RESP 作为其未完成请求的完成原因。回调状态 (usb_cb_flags_t) 指示 USBA 框架为修正这种情况所执行的操作。例如,回调状态 USB_CB_STALL_CLEARED 指示 USBA 框架清除了运行延迟条件。有关完成原因的更多信息,请参见 usb_completion_reason(9S) 手册页。有关回调状态标志的更多信息,请参见 usb_callback_flags(9S) 手册页。

运行请求的回调上下文和管道策略会对在回调中可以执行的操作实施一些限制。