哪些驱动程序在linux内核中使用usb鼠标?

我从LDD3第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)为了让我的模块加载(hotplug),当这个鼠标插入时,我必须禁用内核中的这3个驱动程序,并用id_table中的供应商和设备ID与我的驱动程序构build整个内核。 对?

2)我也读了关于USB核心驱动程序和USB设备驱动程序。 那么这些HID驱动是核心驱动还是设备驱动?

3)USB鼠标的核心驱动程序和设备驱动程序是什么? 我在哪里可以find他们在内核源?

谢谢,Sunil。

Solutions Collecting From Web of "哪些驱动程序在linux内核中使用usb鼠标?"

我会试着一一回答你的问题:

1)为了让我的模块加载(hotplug),当这个鼠标插入时,我必须禁用内核中的这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 “移动”到一个安全的地方。现在重建依赖关系,使得条目将从相关文件中删除。

现在您需要创建您的驱动程序的条目。 只要安装你的驱动程序,你很好走!

所以,总结一下:

 $ sudo rmmod usbhid # Unload the usb mouse driver $ cd /lib/modules/$(uname -r)/ # Move to your current kernel $ vim modules.usbmap # Check for the "usbhid" string $ vim modules.dep # Check for "usbhid.ko:" string $ sudo mv kernel/drivers/hid/usbhid/usbhid.ko ~/Desktop # Take backup of your current usb mouse driver $ sudo depmod -a # Rebuild the dependency files 

现在再次检查字符串“usbhid”的依赖项文件。 它不应该在那里!

 $ cd /path/to/your/driver $ sudo make modules_install # Install your driver into /lib/modules/$(uname -r)/extra $ sudo depmod -a # Rebuild the dependency files 

在这一步之后,在依赖文件中搜索与你的模块相对应的字符串,它应该在那里! 从这一刻起,无论何时插入鼠标(或从启动本身),您的驱动程序将被加载,而不是原来的。

一旦你的驱动程序usbhid ,你可以将原始的usbhid文件复制回原来的目的地并重建相关文件( sudo depmod -a

现在我也看到您正在尝试使用供应商和设备ID来匹配您的设备,在这种情况下,驱动程序只能用于您的鼠标。 推荐的方法是使用class ID,这使得您的驱动程序适用于任何 USB鼠标。


2)我也读了关于USB核心驱动程序和USB设备驱动程序。 那么这些HID驱动是核心驱动还是设备驱动?

usbhid基本上是一个“设备驱动程序”。 驱动程序的分类可以简要介绍为:核心驱动程序,主机控制器驱动程序和设备驱动程序:

设备驱动程序:这是用来控制设备的软件。 例如usb鼠标,基于pci的以太网卡,usb pendrive,基于i2c的加速度计。

主机控制器驱动程序:这是用来控制总线控制器的软件。 例如USB主机控制器(EHCI,UHCI,OHCI等),PCI主机控制器,I2C主机等

核心驱动因素:实际上这些都是上面讨论的驱动因素。 例如USB核心,PCI核心等。核心驱动程序提供助手例程(API),使得设备和主控制器驱动程序可以利用它们(模块堆栈的概念)。 这些是将正确的设备绑定到其驱动程序的那些。 核心驱动程序提供了许多其他服务。

USB设备驱动程序的示例代码:

http://lxr.free-electrons.com/source/drivers/hid/usbhid/usbmouse.c

您可以在以下位置找到USB主控制器驱动程序:

http://lxr.free-electrons.com/source/drivers/usb/host/

USB核心驻留在这里: http : //lxr.free-electrons.com/source/drivers/usb/core/

我想这也回答你的第三个问题!

希望这有助于。

设备驱动程序是usbhid

为了防止它附着到设备上,可以在drivers/hid/usbhid/hid-quirks.c添加一个HID_QUIRK_IGNORE条目,或者使用usbhid模块的quirks参数。