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

时间:2014-08-07 06:53:53

标签: linux linux-kernel usb kernel mouse

我从LDD3第14章读到有关hotplug驱动程序的信息。我需要编写一个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构建整个内核。正确?

2)我还阅读了有关USB核心驱动程序和USB设备驱动程序的信息。那么这些HID驱动程序是核心驱动程序还是设备驱动程序?

3)在USB鼠标的情况下,哪些是核心驱动程序和设备驱动程序?我在哪里可以在内核源代码中找到它们?

谢谢, 苏尼。

2 个答案:

答案 0 :(得分:18)

我会逐一回答你的问题:

1)当鼠标插入时,为了使我的模块加载(hotplug),我必须在内核中禁用这3个驱动程序,并使用我的驱动程序和id_table中的供应商和设备ID构建整个内核。对吗?

是的,但还有一些额外的事情你需要照顾。首先要了解特定模块(驱动程序)的加载方式。关键是MODULE_DEVICE_TABLE(usb, &my_id_table);每当特定模块被安装时#{1}}。 (使用make modules_install),根据MODULE_DEVICE_TABLE中传递的id表,在/lib/modules/<your_kernel>/modules.usbmap/lib/modules/<your_kernel>/modules.dep文件中创建一个条目(搜索字符串&#34; usbhid&# 34;在文件中)。每当检测到新的USB设备时,内核就会读取这些文件以找到匹配的参数。如果找到,则从保存信息的/lib/modules/<your_kernel>/modules.dep中找到的相应路径加载以下模块。关于驱动程序所在的路径及其依赖关系。

所以,现在即使你从内核卸载(rmmod)usbhid,当你重新插入鼠标时它也会被重新加载。要避免这种情况发生,您需要修改这些文件,即从文件中删除条目。为此,&#34;移动&#34; 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

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

$ 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文件复制回原始目标并重建依赖项文件(sudo depmod -a

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


2)我还阅读了有关USB核心驱动程序和USB设备驱动程序的信息。那么这些HID驱动程序是核心驱动程序还是设备驱动程序?

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

设备驱动程序: 这是用于控制设备的软件。例如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/

我认为这也回答了你的第三个问题!

希望这会有所帮助。

答案 1 :(得分:1)

设备驱动程序为usbhid

要防止它附加到您的设备,请向HID_QUIRK_IGNORE添加drivers/hid/usbhid/hid-quirks.c条目,或使用quirks模块的usbhid参数。