USB Anchors¶
什么是anchor?¶
USB驱动程序需要支持一些回调函数,这些回调函数要求驱动程序停止与接口的所有IO。为此,驱动程序必须跟踪已提交的URB,以了解它们是否已全部完成,或者调用usb_kill_urb来处理它们。anchor是一种数据结构,负责跟踪URB并提供处理多个URB的方法。
分配和初始化¶
没有API来分配anchor。它只是声明为struct usb_anchor。init_usb_anchor()
必须被调用来初始化数据结构。
释放¶
一旦它没有更多与它关联的URB,anchor可以通过正常的内存管理操作释放。
URB与anchor的关联和解除关联¶
URB与anchor的关联是通过显式调用usb_anchor_urb()
来实现的。该关联一直保持到URB完成(成功完成)。因此,解除关联是自动的。提供了一个函数来强制完成(杀死)与anchor关联的所有URB。此外,可以通过usb_unanchor_urb()
来解除关联
对大量URB的操作¶
usb_kill_anchored_urbs()
¶
此函数杀死与anchor关联的所有URB。URB以它们被提交的相反时间顺序被调用。这样就不会重新排序数据。
usb_unlink_anchored_urbs()
¶
此函数取消链接与anchor关联的所有URB。URB以它们被提交的相反时间顺序被处理。这与usb_kill_anchored_urbs()
类似,但它不会休眠。因此,不能保证在调用返回时URB已被取消链接。它们可能会在稍后取消链接,但将在有限的时间内取消链接。
usb_scuttle_anchored_urbs()
¶
一个anchor的所有URB都被批量解除锚定。
usb_wait_anchor_empty_timeout()
¶
此函数等待与anchor关联的所有URB完成或超时,以先发生者为准。其返回值将告诉您是否已达到超时。
usb_anchor_empty()
¶
如果anchor没有关联的URB,则返回true。锁定是调用者的责任。
usb_get_from_anchor()
¶
返回anchor中最旧的锚定URB。该URB被解除锚定并返回一个引用。由于您可能会在一个anchor中混合URB到多个目的地,因此您无法保证按时间顺序第一个提交的URB会被返回。