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

Sun*_*ahu 12 linux usb mouse kernel linux-kernel

我从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
Run Code Online (Sandbox Code Playgroud)

还有lsmod节目,

Module                  Size  Used by
hid_generic            12541  0 
usbhid                 47259  0 
hid                   105241  2 hid_generic,usbhid
psmouse               102541  0 
Run Code Online (Sandbox Code Playgroud)

我的怀疑如下,

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

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

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

谢谢,苏尼尔.

rag*_*276 19

我会逐一回答你的问题:

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

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

所以,现在即使你usbhid从内核卸载(rmmod),重新插入鼠标时也会再次加载它.要避免这种情况发生,您需要修改这些文件,即从文件中删除条目.为此,请将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
Run Code Online (Sandbox Code Playgroud)

现在再次检查字符串"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
Run Code Online (Sandbox Code Playgroud)

完成此步骤后,在依赖项文件中搜索与您的模块对应的字符串,它应该在那里!从此刻开始,无论何时插入鼠标(或从启动本身),您的驱动程序都将被加载,而不是原始驱动程序.

完成播放驱动程序后,可以将原始usbhid文件复制回原始目标并重建依赖项文件(sudo depmod -a)

现在我也看到您正在尝试使用供应商和设备ID来匹配您的设备,在这种情况下,驱动程序仅适用于您的鼠标.推荐的方法是使用类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/

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

希望这有帮助.