作者:Sam (甄峰) [email protected]
Sam在读USB HIDdriver时,看到quirks这部分内容。因为之前在看USB部分代码时,常看到类似的内容,但对它的语义理解并不清楚,只是笼统地认为是一个需要修正的东西。现在稍微研究一下。
一: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参数添加了quirks,格式为:quirks=pid:vid:quirks
则将此项内容添加或替换在动态建立的dquirks_list中。换句话说,也就是当modules的提供商知道自己的设备会有什么异常时,可以这样使用。
注意:此处仅仅是将某种PID,VID的quirks添加进动态列表而已。
有动态黑名单,就有静态黑名单。静态黑名单在~/drivers/hid/usbhid/hid-quirks.c中--hid_blacklist。它描绘了已知所有的quirks.
三:如何使用HIDquirks:
在hid设备probe时,会调用usbhid_lookup_quirk(),它则分别调用usbhid_exists_dquirk(动态)——和usbhid_exists_squirk(静态)在静态黑名单和动态黑名单中寻找有没有对应的vid和pid设备。如果有,则将quirks纪录在hid->quirks中。