연결된 USB 장치에 사용자 정의 드라이버 모듈을 어떻게 로드합니까?

연결된 USB 장치에 사용자 정의 드라이버 모듈을 어떻게 로드합니까?

저는 LED 배지를 위한 작고 간단한 드라이버 모듈을 작성하고 있습니다. 이 작업을 수행하기 위해 몇 가지 튜토리얼과 참고 자료를 따랐습니다. 이 모든 것은 장치가 연결될 때 모듈이 자동으로 로드된다는 것을 의미하는 것 같습니다. 그러나 해당 장치를 실행하면 usb-devices드라이버가 있습니다 Driver=usbfs.

후속 조치를 수행하는 다른 터미널이 있는데 dmesg디버그 메시지가 전혀 표시되지 않습니다. 연결하고 연결을 끊으려고 하면 다음과 같은 메시지가 나타납니다.

[36078.726962] usb 1-2: USB disconnect, device number 24
[36080.925619] usb 1-2: new full-speed USB device number 25 using xhci_hcd
[36081.067062] usb 1-2: New USB device found, idVendor=0483, idProduct=5750
[36081.067067] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[36081.067071] usb 1-2: Product: CHW20160112 HID
[36081.067075] usb 1-2: Manufacturer: Chuanghongweitech1
[36081.068695] input: Chuanghongweitech1 CHW20160112 HID as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/0003:0483:5750.0018/input/input40
[36081.069072] hid-generic 0003:0483:5750.0018: input,hidraw2: USB HID v1.10 Device [Chuanghongweitech1 CHW20160112 HID] on usb-0000:00:14.0-2/input0

이 출력을 사용하여 (언로드를 위해) 로그에 내보내면 sudo insmod ledbadge_drv.ko내 모듈이 언로드/로드됩니다.rmmod

[36216.554620] ledbadge:, Unloading module. Handler: ledbadge_exit
[36216.554620] ledbadge:, Attempting to deregister USB device.
[36216.554621] usbcore: deregistering interface driver ledbadge
[36216.554647] ledbadge:, Leaving module!
[36217.632615] ledbadge:, Loading module. Handler: ledbadge_init
[36217.632616] ledbadge:, Attempting to register USB device.
[36217.632636] usbcore: registered new interface driver ledbadge

이 모듈의 코드는 다음과 같습니다.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/usb.h> 



#define LEDBADGE_VENDOR_ID  0x0483
#define LEDBADGE_PRODUCT_ID 0x5750
#define LEDBADGE_MOD_NAME   "ledbadge"
#define LEDBADGE_DRV_NAME   "ledbadge"


/************* usb operations *************/

/* 
    ledbadge_probe

        called when plugging the USB device */


static int ledbadge_probe(struct usb_interface *interface, const struct usb_device_id *id)
{   
    printk(KERN_NOTICE "Led Badge driver (%04X: %04X) plugged \n", id->idVendor, id->idProduct);
    return 0;
}


/* 
    ledbadge_disconnect

        called when unplugging the USB device */

static void ledbadge_disconnect(struct usb_interface *interface) 
{
    printk(KERN_NOTICE "%s:, ledbage USB device removed", LEDBADGE_DRV_NAME);
}




/************* usb driver *************/

// information required to recognize the device

static struct usb_device_id ledbadge_table [] = {
    {USB_DEVICE(LEDBADGE_VENDOR_ID, LEDBADGE_PRODUCT_ID)},
    { }, // terminating entry
};
MODULE_DEVICE_TABLE(usb, ledbadge_table);


static struct usb_driver ledbadge_driver = {
    .name = LEDBADGE_DRV_NAME,
    .id_table = ledbadge_table,
    .probe = ledbadge_probe,
    .disconnect = ledbadge_disconnect,
};








/************** module definition **************/

/* ledbadge_init

        caled on module loading */

static int __init ledbadge_init(void) 
{
    int ret = -1; 

    printk(KERN_NOTICE "%s:, Loading module. Handler: %s",
             LEDBADGE_MOD_NAME, __FUNCTION__); 

    printk(KERN_NOTICE "%s:, Attempting to register USB device.", LEDBADGE_MOD_NAME); 

    // attempt to register usb device
    ret = usb_register(&ledbadge_driver);

    // log dmesg of status
    if(ret == 0) printk(KERN_NOTICE "%s:, Device registered!", LEDBADGE_MOD_NAME);
    else         printk(KERN_ERR    "%s:, Device registration failed > %d", LEDBADGE_MOD_NAME, ret);

    return ret; 
}

/* ledbadge_exit

        caled on module unloading */

static void __exit ledbadge_exit(void) 
{
    printk(KERN_NOTICE "%s:, Unloading module. Handler: %s",
             LEDBADGE_MOD_NAME, __FUNCTION__); 

    printk(KERN_NOTICE "%s:, Attempting to deregister USB device.", LEDBADGE_MOD_NAME); 

    // attempt to deregister usb device
    usb_deregister(&ledbadge_driver);

    // log dmesg of status
    printk(KERN_NOTICE "%s:, Leaving module!", LEDBADGE_MOD_NAME);
}

module_init(ledbadge_init);
module_exit(ledbadge_exit); 

MODULE_LICENSE("GPL"); 

답변1

/lib/modules/<your kernel version>모듈을 디렉토리 트리에 넣고 depmod나중에 실행합니까?

그렇다면 /lib/modules/<your kernel version>/modules.alias파일에 다음과 같은 줄이 있어야 합니다.

alias usb:v0483p5750d*dc*dsc*dp*ic*isc*ip*in* ledbadge

커널이 새 USB 장치를 발견하면 공급업체, 제품 ID 및 기타 여러 속성을 읽고 위에 표시된 대로 이러한 속성을 시스템 생성 모듈 별칭의 구성 요소로 사용합니다. 그런 다음 커널은 modprobe해당 별칭을 사용하여 명령을 실행합니다(실제 메커니즘은 Linux 2.6 이상의 역사에 걸쳐 다양했습니다). 일치하는 별칭 정의가 발견 되면 modprobe해당 별칭 정의에 나열된 모듈이 로드됩니다.

저는 경기가 진행되는 방식이 가장 구체적인 경기 승리라고 생각합니다. 현재 이 hid-generic모듈은 모듈보다 성능이 더 좋을 수 있으므로( depmod모듈을 설치한 후 실행한다고 가정), ledbadge 장치는 USB HID 클래스 장치일 수 있습니다. 따라서 USB HID 장치 별칭을 선언해야 할 수도 있습니다. 이 같은:

static const struct hid_device_id ledbadge_hid_table[] = {
        {HID_USB_DEVICE(LEDBADGE_VENDOR_ID,LEDBADGE_PRODUCT_ID)},
        { } // terminating entry
};

MODULE_DEVICE_TABLE(hid, ledbadge_hid_table);

파일의 결과 줄은 modules.alias다음과 같아야 합니다.

alias hid:b0003g*v00000483p00005750 ledbadge

관련 정보