?
Sam在讀USB HIDdriver時,看到quirks這部分內容。因為之前在看USB部分代碼時,??吹筋愃频膬热荩珜λ恼Z義理解并不清楚,只是籠統(tǒng)地認為是一個需要修正的東西?,F(xiàn)在稍微研究一下。
?
一:quirks簡介:
quirks: 怪癖的意思,也就是說它某種特性與通常的USB設備不相同。
?
?
Sam之前是在USB部分看到quirks:
在~/drivers/usb/core/quirks.c中,有個usb_quirk_list列表,它其實就是一個黑名單,描述了某個設備有何種問題。例如:
?{ USB_DEVICE(0x03f0, 0x4002), .driver_info =USB_QUIRK_NO_AUTOSUSPEND },
表明:vid=0x03f0,pid=0x4002的設備(Hewlett-Packard PhotoSmart720 ),不能自動suspend.
這個列表是不斷擴展的,不斷添加有問題的設備上來。
則判斷一個設備是不是在這張黑名單上,然后如果是的,就判斷它具體是屬于哪種問題,
?
?
二:HIDquirks:
Sam在看USB HID driver時,在modulesinsmod時,會調用hid_init()。它又會調用usbhid_quirks_init()
如果在insmodmodules時,使用modules參數(shù)添加了quirks,格式為:quirks=pid:vid:quirks
則將此項內容添加或替換在動態(tài)建立的dquirks_list中。換句話說,也就是當modules的提供商知道自己的設備會有什么異常時,可以這樣使用。
注意:此處僅僅是將某種PID,VID的quirks添加進動態(tài)列表而已。
?
有動態(tài)黑名單,就有靜態(tài)黑名單。靜態(tài)黑名單在~/drivers/hid/usbhid/hid-quirks.c中--hid_blacklist。它描繪了已知所有的quirks.
?
?
三:如何使用HIDquirks:
在hid設備probe時,會調用usbhid_lookup_quirk(),它則分別調用usbhid_exists_dquirk(動態(tài))——和usbhid_exists_squirk(靜態(tài))在靜態(tài)黑名單和動態(tài)黑名單中尋找有沒有對應的vid和pid設備。如果有,則將quirks紀錄在hid->quirks中。