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的驱动程序来构建整个内核。对?

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

3)如果使用USB鼠标,核心驱动程序和设备驱动程序是哪些?在内核源代码中可以找到它们吗?

谢谢,Sunil。

raghav3276:

我会尽力回答您的问题:

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

现在,再次检查依赖项文件中的字符串“ 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文件复制回其原始目标位置并重建依赖项文件(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 Core驻留在这里:http : //lxr.free-electrons.com/source/drivers/usb/core/

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

希望这会有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SATA:基本支持需要哪些linux内核驱动程序?

如何实现鼠标驱动程序Linux USB鼠标驱动程序?

内核中内置了哪些设备驱动程序?

主线Linux内核中的USB MTP小工具驱动程序发生了什么?

在Linux内核空间驱动程序中为USB运行供应商命令

如何为USB-HID设备使用Linux内核驱动程序绑定/取消绑定接口?

如何在Linux系统中插入USB鼠标时自动插入驱动程序?

Linux内核:从驱动程序中删除输入处理程序

Linux内核中的WS2812设备驱动程序

ARM Linux内核驱动程序中的关键时序

Linux内核-检查当前使用的驱动程序

Linux内核驱动程序模块:使用单个驱动程序处理多个设备文件

linux内核驱动程序调试日志

USB存储驱动程序如何在Linux中工作?

如何为 USB 网络的 81ry52 芯片启用 Linux 内核驱动程序

如何修复在Linux内核SPI驱动程序中始终无法通过验证的SPI驱动程序

Razer USB耳机Linux驱动程序

使用新的USB串行驱动程序编译自定义内核时出错

如何使用设备树在一个Linux内核驱动程序中映射两个设备的资源?

重新启动USB鼠标驱动程序?

如何从ubuntu 16.04内核客户端和内核模块中删除nvidia驱动程序,或使内核clent和模块使用相同的nvidia驱动程序?

Linux如何知道如何以及在新安装中安装哪些驱动程序

Linux内核tty驱动程序可以在代码中默认关闭echo吗?

如何获得静态内置在Linux内核中的活动驱动程序的列表?

如何在Linux内核的暂存树中编译所有驱动程序?

Linux内核初始化中未调用内置平台驱动程序__initcall

音频驱动程序应存在于Linux内核中,但无法识别设备

我可以使用虚拟机进行Linux内核驱动程序开发吗?

如何为我的处理器更新Debian Linux内核使用的驱动程序?