在键盘热插拔上加载模块

我正在学习如何编写Linux系统的模块和驱动程序。 与此问题类似,我试图在USB键盘热插拔上运行一个简单的“Hello World”模块(代码如下)。 即使通过命令insmodemodprobe初始化模块似乎工作( dmesg显示debugging消息),模块插入键盘时不加载。

我做了什么:

  1. 运行make来生成hellomodule.ko文件。
  2. hellomodule.ko文件复制到/ lib / modules /“my_kernel_version”/
  3. 运行depmod -a命令。

在这三个步骤之后,我将模块添加到modules.aliasmodules.dep文件中。 它仍然不起作用。

这是内核configuration错误还是完全不同的东西?

系统: Ubuntu 14.04 LTS ; 内核: 3.14.0

hellomodule.c:

 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/usb.h> #include <linux/usb/input.h> #include <linux/hid.h> MODULE_AUTHOR("author"); MODULE_DESCRIPTION("helloworld module\n"); MODULE_LICENSE("GPL"); static struct usb_device_id hello_id_table [] = { { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT, USB_INTERFACE_PROTOCOL_KEYBOARD) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, hello_id_table); static int hello_probe(struct usb_interface *interface, const struct usb_device_id *id) { pr_debug("HelloModule: USB keyboard probe function called\n"); return 0; } static void hello_disconnect(struct usb_interface *interface) { pr_debug("HelloModule: USB keyboard disconnect function called\n"); } static struct usb_driver hello_driver = { //.owner = THIS_MODULE, .name = "hello_driver", .probe = hello_probe, .disconnect = hello_disconnect, .id_table = hello_id_table }; static int __init hello_init(void) { int retval = 0; pr_debug("HelloModule: Hello World!\n"); retval = usb_register(&hello_driver); if (retval) pr_debug("HelloModule: usb_register failed. Error number %d", retval); return 0; } static void __exit hello_exit(void) { usb_deregister(&hello_driver); pr_debug("HelloModule: exit\n"); } module_init(hello_init); module_exit(hello_exit); 

Makefile文件:

 obj-m := hellomodule.o CFLAGS_hellomodule.o := -DDEBUG KDIR := /lib/modules/`uname -r`/build default: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean 

Solutions Collecting From Web of "在键盘热插拔上加载模块"

我有同样的问题。 在我的情况下,这是由于usbhid模块已经加载,因为我使用的是一个USB鼠标。

如果我理解正确,在Ubuntu 14.04中,当连接新设备时加载正确模块的udev规则如下(位于/lib/udev/rules.d/80-drivers.rules ):

 DRIVER!="?*", ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}" 

如您所见,只有在新设备没有驱动程序的情况下才能执行kmod load 。 但是,如果usbhid已经加载,那么刚刚连接的键盘已经有一个驱动程序。 因此,“hello world”模块未加载。

一个可能的解决方案是通过删除DRIVER!="?*"条件来修改/覆盖udev规则,从而将其转化为:

 ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}"`. 

另一个可能的解决方法是在连接键盘之前卸载usbhid模块。 当然,这将导致所有USB键盘,鼠标和其他HID类设备停止工作,直到您连接新的键盘。

你使用虚拟机吗? 如果是的话,尝试真正的安装,即使在现场的USB。 我有使用VirtualBox相同的问题,尝试在debian的现场USB安装后解决。

编辑后集线器的答案:它也可以是一个内核配置,请参阅http://wiki.sourcemage.org/FrequentlyAskedQuestions%282f%29coreelConfiguration.html#kmodload (问题“我如何有模块自动加载通过kmod?”)。

在menuconfig中,可以在Loadable modulee Support下启用“coreel module loader”选项。 但是我没有检查这个答案。