Linux
usb 核心模組不會按需載入,但可以與 shell 中的 insmod 和 modprobe 一起正常工作
我有一個可以編譯和建構的 USB Linux 核心模組。執行
insmod
載入我的模組並向dmseg
我tail -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_register
和probe
功能這是更新的設備驅動程序
usb_register
和probe
功能#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
函式的使用。