首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux内核中的usb鼠标使用了哪些驱动程序?

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

Stack Overflow用户
提问于 2014-08-07 14:53:53
回答 2查看 16K关注 1票数 13

我从LDD3第14章读到了热插拔驱动程序。我需要写一个当我插入硬件时加载的usb鼠标驱动程序。现在,在做一些实验时,我了解到有一个名为"hid-generic“的驱动程序,它在插件拔出时被调用。

代码语言:javascript
复制
[ 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的展示,

代码语言:javascript
复制
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鼠标的核心驱动程序和设备驱动程序是什么?在内核源代码中我可以在哪里找到它们?

谢谢,苏尼尔。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-07 20:20:33

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

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

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

因此,现在即使您从内核卸载(Rmmod) usbhid,当您重新插入鼠标时,它将再次加载。为了避免这种情况发生,您需要修改这些文件,即从文件中删除条目。为此,请将usbhid驱动程序从其原始路径(通常位于/lib/modules/<your_kernel>/kernel/drivers/hid/usbhid/usbhid.ko )“移动”到一个安全的地方。现在重新构建依赖关系,以便从依赖关系文件中删除这些条目。

现在,您需要创建驱动程序的条目。只需安装你的驱动程序,你就可以开始工作了!

所以,总结一下:

代码语言:javascript
复制
$ 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“。它不应该在那里!

代码语言:javascript
复制
$ 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来匹配你的设备,在这种情况下,驱动程序将只适用于你的鼠标。推荐的方式是使用类is,这使您的驱动程序适用于任何 usb鼠标。

USB2)我还阅读了核心驱动程序和设备驱动程序。因此,这些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/

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

希望这能帮上忙。

票数 20
EN

Stack Overflow用户

发布于 2014-08-07 16:20:33

设备驱动程序为usbhid

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25175960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档