Linux

usb 核心模組不會按需載入,但可以與 shell 中的 insmod 和 modprobe 一起正常工作

  • May 14, 2014

我有一個可以編譯和建構的 USB Linux 核心模組。執行insmod載入我的模組並向dmsegtail -f /var/log/debug展示它按預期工作。

depmod -a然後modprobe從終端執行載入模組並modprobe -r解除安裝,我看到 -tail -f /var/log/debug按預期輸出。

當我插入我的 USB 鍵盤時,雖然它沒有按預期觸發和按需載入。

我調查/etc/udev/rules.d過沒有成功。任何解決方法或指導都是最受歡迎的。我正在Ubuntu 12.04.4 LTS使用自定義 Linux 核心執行3.14.0

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/usb/input.h>
#include <linux/hid.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Aruna Hewapathirane");
MODULE_DESCRIPTION("A USB Keyboard Driver Kernel Module");

static struct usb_device_id usb_kbd_id_table[] = {
   { USB_INTERFACE_INFO(
       USB_INTERFACE_CLASS_HID,
       USB_INTERFACE_SUBCLASS_BOOT,
       USB_INTERFACE_PROTOCOL_KEYBOARD) },
   { } /* Terminating entry */
};

MODULE_DEVICE_TABLE(usb, usb_kbd_id_table);

static int __init kbd_init(void)
{
   printk(KERN_DEBUG "USB Keyboard Plugged In.. \n");
   return 0;
}

static void __exit kbd_exit(void)
{
   printk(KERN_DEBUG "USB Keyboard Removed.. \n");
   return ;
}

module_init(kbd_init);
module_exit(kbd_exit);

你缺少usb_registerprobe功能

這是更新的設備驅動程序usb_registerprobe功能

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/usb/input.h>
#include <linux/hid.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Aruna Hewapathirane");
MODULE_DESCRIPTION("A USB Keyboard Driver Kernel Module");

static struct usb_device_id usb_kbd_id_table[] = {
   { USB_INTERFACE_INFO(
       USB_INTERFACE_CLASS_HID,
       USB_INTERFACE_SUBCLASS_BOOT,
   USB_INTERFACE_PROTOCOL_KEYBOARD) },
   { } /* Terminating entry */
};

MODULE_DEVICE_TABLE(usb, usb_kbd_id_table);

static int kbd_probe(struct usb_interface *interface,
   const struct usb_device_id *id)
{
   pr_info("USB keyboard probe function called\n");
   return 0;
}

static void kbd_disconnect(struct usb_interface *interface)
{
   pr_info("USB keyboard disconnect function called\n");
}

static struct usb_driver kbd_driver = {
   .name  = "usbkbd",
   .probe = kbd_probe,
   .disconnect = kbd_disconnect,
   .id_table = usb_kbd_id_table,
};

static int __init kbd_init(void)
{
   int res = 0;
   res = usb_register(&kbd_driver);
   if (res)
       pr_err("usb_register failed with error %d", res);
   return res;
}

static void __exit kbd_exit(void)
{
   pr_debug("USB Keyboard Removed..\n");
   usb_deregister(&kbd_driver);
   return;
}

module_init(kbd_init);
module_exit(kbd_exit);

請參考之前的SO question以了解probe函式的使用。

引用自:https://unix.stackexchange.com/questions/120839