저는 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