Linux下 hid quirks的研究

来源:互联网 发布:seo网络推广公司 编辑:程序博客网 时间:2024/04/27 23:56
者:Sam (甄峰) sam_code@hotmail.com

 

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中。


原创粉丝点击