USB 커널 모듈은 요청 시 로드되지 않지만 셸의 insmod 및 modprobe와 잘 작동합니다.

USB 커널 모듈은 요청 시 로드되지 않지만 셸의 insmod 및 modprobe와 잘 작동합니다.

컴파일하고 빌드할 수 있는 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_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);

이전 글을 참고해주세요그래서 질문은probe기능에 사용됩니다 .

관련 정보