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_unlink_anchored_urbs()
¶
此函数会取消链接与锚点关联的所有 URB。URB 会按照它们被提交的相反时间顺序被处理。这类似于 usb_kill_anchored_urbs()
,但它不会休眠。因此,不保证在调用返回时 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。