我读了LDD 3第14章关于热插拔驱动的内容,我需要写一个USB鼠标驱动,当我插入硬件时加载。现在,做了一些实验,我知道有一个名为“hid-generic”的驱动,当插拔时调用。
[ 6654.232046] usb 3-1: new low-speed USB device number 3 using uhci_hcd
[ 6654.462061] usb 3-1: New USB device found, idVendor=093a, idProduct=2510
[ 6654.462067] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 6654.462071] usb 3-1: Product: USB OPTICAL MOUSE
[ 6654.462074] usb 3-1: Manufacturer: PIXART
[ 6654.489316] input: PIXART USB OPTICAL MOUSE as /devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/input/input12
[ 6654.489445] hid-generic 0003:093A:2510.0004: input,hidraw0: USB HID v1.10 Mouse [PIXART USB OPTICAL MOUSE] on usb-0000:00:1d.1-1/input0
还有lsmod显示
Module Size Used by
hid_generic 12541 0
usbhid 47259 0
hid 105241 2 hid_generic,usbhid
psmouse 102541 0
我的疑虑如下
1)为了让我的模块在这个鼠标插入时加载(热插拔),我必须禁用内核中的这3个驱动程序,并使用id_table中的供应商和设备ID构建整个内核。对吗?
2)我还读到了USB核心驱动程序和USB设备驱动程序。那么这些HID驱动程序是核心驱动程序还是设备驱动程序?
3)USB鼠标的核心驱动程序和设备驱动程序是什么?在内核源代码中可以找到它们?
谢谢苏尼尔
2条答案
按热度按时间7vux5j2d1#
我会尽量一一回答你的问题:
1)为了让我的模块在这个鼠标插入时加载(热插拔),我必须禁用内核中的这3个驱动程序,并使用id_table中的供应商和设备ID构建整个内核。对吗?
是的,但是还有一些额外的事情你需要注意。首先要了解一个特定的模块当一个特定的模块被“安装”时,这个键是
MODULE_DEVICE_TABLE(usb, &my_id_table);
(使用make modules_install
),一个条目,根据传入MODULE_DEVICE_TABLE
的id表,在/lib/modules/<your_kernel>/modules.usbmap
和/lib/modules/<your_kernel>/modules.dep
文件中创建(在文件中搜索字符串“usbhid”).每当检测到新的usb设备时,内核都会读取这些文件来查找匹配的参数.如果找到了下面的模块从/lib/modules/<your_kernel>/modules.dep
中找到的相应路径加载,该路径保存关于驱动程序所在的路径及其依赖关系的信息。所以,现在即使你卸下(rmmod)
usbhid
,当您重新插入鼠标时,它将再次加载。为了避免这种情况发生,您需要修改这些文件,即从文件中删除条目。为此,将usbhid
驱动程序从其原始路径(一般位于/lib/modules/<your_kernel>/kernel/drivers/hid/usbhid/usbhid.ko
)“移动”到安全的地方。现在重新构建依赖项,以便从依赖项文件中删除这些条目。现在你需要创建你的驱动程序的条目。只要安装你的驱动程序,你就可以开始了!
总结一下:
现在再次检查依赖文件中的字符串“usbhid”,它不应该在那里!
在这一步之后,在依赖文件中搜索与您的模块相对应的字符串,它应该就在那里了!从这一刻起,每当您插入鼠标(或从 Boot 本身)您的驱动程序将被加载,而不是原来的。
一旦你完成了你的驱动程序,你可以将原始的
usbhid
文件复制回它的原始目的地,并重建依赖文件(sudo depmod -a
)。现在我也看到你正在尝试使用vendor和device id来匹配你的设备,在这种情况下,驱动程序将只为***你的***鼠标工作。推荐的方法是使用class id,这使得你的驱动程序为*任何usb鼠标工作。
2)我也读过USB核心驱动和USB设备驱动。那么这些HID驱动是核心驱动还是设备驱动?
usbhid
基本上是一个“设备驱动程序”。驱动程序的分类可以概括为:核心驱动程序、主机控制器驱动程序和设备驱动程序:***设备驱动程序:***这是用于控制设备的软件。例如usb鼠标,基于pci的以太网卡,usb pendrive,基于i2c的加速度计。
***主机控制器驱动程序:***这是为控制总线控制器而编写的软件。例如USB主机控制器(EHCI、UHCI、OHCI等)、PCI主机控制器、I2C主机等。
***核心驱动程序:***这些实际上粘合了上面讨论的驱动程序。例如USB核心,PCI核心等。核心驱动程序提供帮助程序(API),以便设备和主机控制器驱动程序可以使用它们(模块堆栈的概念!)。这些是将正确的设备绑定到其驱动程序的程序。核心驱动程序提供许多其他服务。
Example code for USB Device Driver
您可以找到USB主机控制器驱动程序here
USB核心驻留here
我想这也回答了你的第三个问题!
希望这对你有帮助。
vybvopom2#
设备驱动程序是
usbhid
。要防止它连接到您的设备,请将
HID_QUIRK_IGNORE
条目添加到drivers/hid/usbhid/hid-quirks.c
,或使用usbhid
模块的quirks
参数。