저는 커널 4.1.0-rc8을 사용하는 Logitech G110 USB 키보드용 드라이버를 작성 중입니다.
dmesg
내 드라이버는 insmod를 사용하여 완벽하게 로드됩니다(디버그 메시지는 초기화를 통과했다는 사실 로 인쇄됩니다 module_init
).
modprobe
목록에 모듈을 표시하기만 하면 됩니다. (0개의 장치가 이를 사용하고 있습니다.)
그러나 키보드를 연결하면 커널이 제조업체와 유형을 인식하고 특정 드라이버를 로드하는 것 같습니다.
[ 3611.699275] usb 6-5: new high-speed USB device number 11 using ehci-pci
[ 3611.815794] usb 6-5: New USB device found, idVendor=05e3, idProduct=0607
[ 3611.815803] usb 6-5: New USB device strings: Mfr=0, Product=1, SerialNumber=0
[ 3611.815807] usb 6-5: Product: USB2.0 Hub
[ 3611.817753] hub 6-5:1.0: USB hub found
[ 3611.818776] hub 6-5:1.0: 4 ports detected
[ 3612.086996] usb 6-5.1: new low-speed USB device number 12 using ehci-pci
[ 3612.171428] usb 6-5.1: New USB device found, idVendor=046d, idProduct=c22b
[ 3612.171436] usb 6-5.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3612.171441] usb 6-5.1: Product: G110 G-keys
[ 3612.171445] usb 6-5.1: Manufacturer: LOGITECH
[ 3612.179099] input: LOGITECH G110 G-keys as /devices/pci0000:00/0000:00:13.2/usb6/6-5/6-5.1/6-5.1:1.0/0003:046D:C22B.0014/input/input32
[ 3612.230502] hid-generic 0003:046D:C22B.0014: input,hiddev0,hidraw0: USB HID v1.00 Keypad [LOGITECH G110 G-keys] on usb-0000:00:13.2-5.1/input0
[ 3612.230768] usbhid 6-5.1:1.1: couldn't find an input interrupt endpoint
[ 3612.294146] usb 6-5.3: new low-speed USB device number 13 using ehci-pci
[ 3612.377583] usb 6-5.3: New USB device found, idVendor=046d, idProduct=c22a
[ 3612.377591] usb 6-5.3: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 3612.377596] usb 6-5.3: Product: Gaming Keyboard G110
[ 3612.384673] input: Gaming Keyboard G110 as /devices/pci0000:00/0000:00:13.2/usb6/6-5/6-5.3/6-5.3:1.0/0003:046D:C22A.0015/input/input33
[ 3612.435649] hid-generic 0003:046D:C22A.0015: input,hidraw1: USB HID v1.10 Keyboard [Gaming Keyboard G110] on usb-0000:00:13.2-5.3/input0
[ 3612.443182] input: Gaming Keyboard G110 as /devices/pci0000:00/0000:00:13.2/usb6/6-5/6-5.3/6-5.3:1.1/0003:046D:C22A.0016/input/input34
[ 3612.494710] hid-generic 0003:046D:C22A.0016: input,hiddev0,hidraw2: USB HID v1.10 Device [Gaming Keyboard G110] on usb-0000:00:13.2-5.3/input1
인터페이스가 정상적으로 등록된 경우에도 다음과 같습니다.
[ 4024.380949] usbcore: registered new interface driver usbkeyboard
이 표의 구체적인 조항은 다음과 같습니다.
struct usb_device_id custom_usb_table[] = {
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID,
USB_INTERFACE_SUBCLASS_BOOT, USB_INTERFACE_PROTOCOL_KEYBOARD)},
{ }
};
MODULE_DEVICE_TABLE(usb, custom_usb_table);
운전사:
static struct usb_driver usb_keyboard_driver = {
.name = "usbkeyboard",
.probe = usb_probe,
.disconnect = usb_disconnect,
.id_table = custom_usb_table
};
기능 usb_probe
:
static int usb_probe(struct usb_interface *usb_iface,
const struct usb_device_id *usb_devid)
{
printk(KERN_DEBUG "CUSTOM-MODULE: USB device was plugged in!\n");
return 0;
}
그리고 module_init
트리거:
static int initialize(void)
{
int retVal = 0;
retVal = usb_register(&usb_keyboard_driver);
printk(KERN_DEBUG "CUSTOM-MODULE: initialize() called!\n");
if (retVal)
printk(KERN_DEBUG "CUSTOM-MODULE: Error %d registering driver!\n", retVal);
return 0;
}
(나는 printk가 이 디버그 정보를 인쇄하는 가장 추악한 방법이라는 것을 알고 있으며 더 나은 옵션이 많이 있지만 지금은 그게 요점이 아닙니다.)
내 질문은 다음과 같습니다
- 나는 위에서 커널이 내가 작성한 일반 키보드 인터페이스보다 특정 Logitech 드라이버를 "선호"한다고 가정합니다. 맞습니까?
- 다음 재부팅 때까지 Logitech 드라이버를 사용하지 않고 대신 일반 인터페이스 드라이버를 사용하도록 커널에 지시하는 방법이 있습니까?