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會被返回。