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

26

Primeiro plano de fundo. Estou desenvolvendo um driver para dispositivos do painel de jogos da Logitech. É um teclado com uma tela nele. O driver está funcionando bem, mas por padrão o dispositivo é tratado pela HID. Para evitar que a HID assuma o controle do dispositivo antes do meu driver, posso colocá-lo na lista negra no hid-core.c. Isso funciona, mas não é a melhor solução, pois estou trabalhando com várias pessoas e todos temos que manter o patch do nosso módulo HID que está se tornando uma tarefa árdua, especialmente porque muitas vezes envolve a reconstrução de initramfs e tal.

Fiz algumas pesquisas sobre esse problema e encontrei este post na lista de discussão , que acabou me levando a este artigo no LWN . Isso descreve um mecanismo para vincular dispositivos a drivers específicos em tempo de execução. Parece exatamente o que eu preciso.

Então, eu tentei. Consegui desatar o teclado da HID. Isso funcionou e, como esperado, não era mais possível digitar. Mas quando tentei vinculá-lo ao nosso driver, recebo "erro: não existe esse dispositivo" e a operação falha.

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

A fonte do nosso driver está aqui: https://github.com/ali1234/lg4l

ali1234
fonte

Respostas:

27

Ok, acontece que a resposta estava me encarando.

Em primeiro lugar, seja usando nosso driver personalizado ou genérico que normalmente domina o dispositivo, ainda é tudo controlado pela HID, e não por USB.

Anteriormente, tentei desvinculá-lo do HID, que não é o caminho a seguir. A HID possui sub-drivers, aquele que assume o controle de dispositivos que não possuem driver especializado é chamado de usb-genérico. Era disso que eu precisava me desassociar antes de me associar 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 se parece com "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, porque as duas informações principais são as duas primeiras coisas na linha quando o dispositivo se liga ...

ali1234
fonte
Você precisou especificar em seu driver que esse fornecedor / produto é compatível com seu driver? Ou o "vínculo" simplesmente força o problema. Estou obtendo "nenhum dispositivo desse tipo" para um dispositivo que foi incluído na lista negra, mas quero forçá-lo a ser vinculado e imagino que a lista negra não é apenas um pensamento de "impedir ligação automática", mas um "impedir nomatter de ligação" que tipo de coisa.
dmansfield
A ligação o força, portanto, não é necessário reivindicar os IDs na origem do driver. É se você quiser carregar automaticamente, no entanto.
ali1234
Duas razões pelas quais eu estava tendo problemas: primeiro - o dispositivo está listado na lista hid_ignore_list do kernel e, portanto, não será "oculto" no limite do quê. Eu tive que adicionar "usbhid.quirks = 0x0b0e: 0x0412: 0x40000000" à linha de comando do kernel e reinicie. O sinalizador 0x40000000 é "não ignorar". Segundo, a última parte do ID "0003: 046D: C229.0036" é '0036'. O que isso representa? Não tenho certeza. A única maneira de encontrá-lo (ao que parece) é amarrá-lo já, depois desatá-lo e religá-lo.
dmansfield
Você encontrou uma maneira de religar automaticamente?
Vladius 11/11/19
Adicionado minhas próprias-religação automática solução: unix.stackexchange.com/a/475277/96686
Vladius