Como usar a interface de vinculação / desconexão do driver de kernel do Linux para dispositivos USB-HID?

26

Primeiro plano de fundo. Estou desenvolvendo um driver para os dispositivos do painel de jogos da Logitech. É um teclado com uma tela. O driver está funcionando bem, mas por padrão o dispositivo é manipulado pela HID. A fim de evitar que a HID assuma o dispositivo antes do meu driver, eu posso colocá-lo na lista negra no hid-core.c. Isso funciona, mas não é a melhor solução, já que estou trabalhando com várias pessoas e todos nós temos que continuar corrigindo nosso módulo HID, que está se tornando uma tarefa, especialmente porque envolve reconstruir initramfs e outros.

Eu fiz algumas pesquisas sobre esse problema e achei este post da lista de discussão , que eventualmente me levou a este artigo sobre o LWN . Isso descreve um mecanismo para vincular dispositivos a drivers específicos em tempo de execução. Isso parece exatamente o que eu preciso.

Então, eu tentei. Consegui desvincular o teclado da HID. Isso funcionou e, como esperado, eu não pude mais digitá-lo. Mas quando tentei vinculá-lo ao nosso driver eu recebo "erro: nenhum tal dispositivo" e a operação falha.

Então, minha pergunta é: Como eu uso as operações de bind / unbind do kernel para replicar o que acontece quando você coloca um dispositivo HID na lista negra no hid-core e fornece seu próprio driver? - isto é - para substituir a necessidade de corrigir o hid-core.c o tempo todo?

A origem do nosso driver está aqui: link

    
por ali1234 26.04.2011 / 00:03

1 resposta

25

Ok, a resposta estava me olhando na cara.

Primeiramente, seja usando nosso driver personalizado ou usando o genérico que normalmente assume o dispositivo, ele ainda é controlado pelo HID e não pelo USB.

Anteriormente, tentei desvinculá-lo da HID, o que não é o caminho a seguir. HID tem sub-drivers, o que assume dispositivos que não têm driver especializado é chamado genérico-usb. Isto é o que eu precisava desvincular, antes de me ligar ao hid-g19. Além disso, eu precisava usar o endereço HID que se parece com "0003: 046d: c229.0036" e não o endereço USB que parece "1-1.1: 1.1".

Então, antes de religar, eu veria isso no dmesg:

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Então eu faço:

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

E então eu vejo no dmesg:

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Então, como eu disse, me encarando na cara, porque as duas principais informações são as duas primeiras coisas na linha quando o dispositivo se liga ...

    
por 12.05.2011 / 03:21