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

7xllpg7q  于 2023-04-11  发布在  Linux
关注(0)|答案(2)|浏览(180)

我读了LDD 3第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)为了让我的模块在这个鼠标插入时加载(热插拔),我必须禁用内核中的这3个驱动程序,并使用id_table中的供应商和设备ID构建整个内核。对吗?
2)我还读到了USB核心驱动程序和USB设备驱动程序。那么这些HID驱动程序是核心驱动程序还是设备驱动程序?
3)USB鼠标的核心驱动程序和设备驱动程序是什么?在内核源代码中可以找到它们?
谢谢苏尼尔

7vux5j2d

7vux5j2d1#

我会尽量一一回答你的问题:

1)为了让我的模块在这个鼠标插入时加载(热插拔),我必须禁用内核中的这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

在这一步之后,在依赖文件中搜索与您的模块相对应的字符串,它应该就在那里了!从这一刻起,每当您插入鼠标(或从 Boot 本身)您的驱动程序将被加载,而不是原来的。
一旦你完成了你的驱动程序,你可以将原始的usbhid文件复制回它的原始目的地,并重建依赖文件(sudo depmod -a)。
现在我也看到你正在尝试使用vendor和device id来匹配你的设备,在这种情况下,驱动程序将只为***你的***鼠标工作。推荐的方法是使用class id,这使得你的驱动程序为*任何usb鼠标工作。

2)我也读过USB核心驱动和USB设备驱动。那么这些HID驱动是核心驱动还是设备驱动?

usbhid基本上是一个“设备驱动程序”。驱动程序的分类可以概括为:核心驱动程序、主机控制器驱动程序和设备驱动程序:

***设备驱动程序:***这是用于控制设备的软件。例如usb鼠标,基于pci的以太网卡,usb pendrive,基于i2c的加速度计。
***主机控制器驱动程序:***这是为控制总线控制器而编写的软件。例如USB主机控制器(EHCI、UHCI、OHCI等)、PCI主机控制器、I2C主机等。
***核心驱动程序:***这些实际上粘合了上面讨论的驱动程序。例如USB核心,PCI核心等。核心驱动程序提供帮助程序(API),以便设备和主机控制器驱动程序可以使用它们(模块堆栈的概念!)。这些是将正确的设备绑定到其驱动程序的程序。核心驱动程序提供许多其他服务。

Example code for USB Device Driver
您可以找到USB主机控制器驱动程序here
USB核心驻留here
我想这也回答了你的第三个问题!
希望这对你有帮助。

vybvopom

vybvopom2#

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

相关问题