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