如何在键盘热插拔上加载模块?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (91)

我正在尝试学习如何为Linux系统编写模块和驱动程序。我试图在USB键盘热插拔上运行一个简单的“Hello World”模块。即使通过命令初始化模块insmode、modprobe似乎工作,但插入键盘后模块不会被加载。

我做了什么:

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

这三个步骤后,我有我的模块添加modules.aliasmodules.dep文件。它仍然不起作用。

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

系统: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
提问于
用户回答回答于

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

如果我的理解正确,在Ubuntu 14.04中,当连接新设备时加载正确模块的udev规则如下

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

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

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

另一种可能的解决方法是usbhid在连接键盘之前卸载模块。

用户回答回答于

你使用虚拟机吗?如果是,请尝试实际安装。我在使用VirtualBox时遇到了同样的问题,在尝试使用debian的live-USB安装后解决了这个问题。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动