USB 锚点

什么是锚点?

USB 驱动程序需要支持一些回调,这些回调要求驱动程序停止对接口的所有 IO 操作。为此,驱动程序必须跟踪它已提交的 URB,以了解它们是否都已完成或调用 usb_kill_urb。锚点是一种数据结构,负责跟踪 URB 并提供处理多个 URB 的方法。

分配和初始化

没有 API 来分配锚点。它只是被声明为 struct usb_anchor。init_usb_anchor() 必须被调用以初始化该数据结构。

释放

一旦它不再有与之关联的 URB,就可以使用正常的内存管理操作来释放锚点。

URB 与锚点的关联和解除关联

通过显式调用 usb_anchor_urb() 来建立 URB 与锚点的关联。该关联一直保持到 URB 完成(成功完成)为止。因此,解除关联是自动的。提供了一个函数来强制完成(杀死)与锚点关联的所有 URB。此外,可以使用 usb_unanchor_urb() 来解除关联。

对大量 URB 的操作

usb_kill_anchored_urbs()

此函数会杀死与锚点关联的所有 URB。URB 会按照它们被提交的相反时间顺序被调用。这样,就不会重新排序任何数据。

usb_scuttle_anchored_urbs()

锚点的所有 URB 都会被批量取消锚定。

usb_wait_anchor_empty_timeout()

此函数会等待与锚点关联的所有 URB 完成或超时,以先发生者为准。它的返回值将告诉您是否达到超时。

usb_anchor_empty()

如果没有任何 URB 与锚点关联,则返回 true。锁定是调用者的责任。

usb_get_from_anchor()

返回锚点中最旧的锚定 URB。该 URB 将被取消锚定并以引用的形式返回。由于您可能会在一个锚点中混合发送到多个目的地的 URB,因此无法保证返回的是按时间顺序第一个提交的 URB。