컴파일하고 빌드할 수 있는 USB Linux 커널 모듈이 있습니다. Run은 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);
답변1
당신은 누락 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);
이전 글을 참고해주세요그래서 질문은probe
기능에 사용됩니다 .