Driver personalizado para teclado GNU / Linux 4.1.0-rc8 (Fedora)

1

Estou escrevendo um driver para um teclado USB Logitech G110 para o Kernel 4.1.0-rc8.

Meu driver é perfeitamente carregado com insmod (a mensagem de depuração é impressa em dmesg que foi inicializada através de module_init ).

modprobe mostra o módulo na lista bem (com 0 dispositivos usando)

No entanto, quando eu conecto o teclado, parece que o kernel reconhece o fabricante e o tipo, e ele carrega esse driver específico:

[ 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

Mesmo que a interface esteja bem registrada:

[ 4024.380949] usbcore: registered new interface driver usbkeyboard

A tabela é especificada da seguinte forma:

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);

O motorista:

static struct usb_driver usb_keyboard_driver = {
        .name = "usbkeyboard",
        .probe = usb_probe,
        .disconnect = usb_disconnect,
        .id_table = custom_usb_table
};

a função 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;
}

e module_init disparam:

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;
}

(Eu sei que printk é de longe a maneira mais feia de imprimir esta informação de depuração, e que existem MUITAS opções que são muito melhores, mas esse não é o ponto agora).

Minhas perguntas são:

  1. Eu assumo acima que o kernel "prefere" o driver específico da Logitech através da interface geral de teclado que eu escrevi. Isso está correto?
  2. Existe uma maneira de dizer ao kernel para não usar o driver da Logitech até a próxima reinicialização, mas usar a interface geral?
por Midas 01.07.2015 / 20:20

0 respostas