A razão pela qual este dispositivo USB HID funciona no Windows é porque pode haver drivers específicos escritos para ele, o motivo pelo qual ele funciona para o GRUB é que o dispositivo opera no chamado modo de inicialização . Os dispositivos USB HID suportam dois modos de operação, o modo de inicialização e o modo HID. O primeiro torna possível usar o dispositivo no BIOS sem que o BIOS implemente uma pilha HID completa. O último fornece mais flexibilidade, de modo que recursos estendidos podem ser adicionados (como botões extras). O suporte para o modo de inicialização é indicado pela presença do sinalizador Subclasse da interface de inicialização no descritor de interface (consulte lsusb -v -d 05a4:8003
):
Interface Descriptor:
...
bInterfaceSubClass 1 Boot Interface Subclass
Um rápido grep através das fontes do kernel Linux (3.14-rc8) não mostrou um driver especial para este dispositivo USB HID. Portanto, o kernel retorna ao driver HID genérico ( hid-generic
). Parece, no entanto, que há uma incompatibilidade com este dispositivo e o driver usado pelo Linux.
Para ver se o dispositivo gera alguma atividade (invisível), instale o programa evtest
e execute sudo evtest
. Quando for solicitado um dispositivo, digite o número correspondente ao seu teclado. Se as coisas funcionarem, você deverá ver eventos ao pressionar as teclas.
Se você não vir nenhuma chave e quiser depurá-la ainda mais, instale wireshark
para capturar a interface USB (usando usbmon). Como você pode ver na saída lsusb
, o dispositivo de entrada está conectado ao barramento 1, portanto, você deve especificar usbmon1
como interface. O comando para capturar o tráfego USB é:
sudo dumpcap -i usbmon1 -w - > usb.pcapng
(Esse método permite que você escreva usb.pcapng
como um usuário comum, a alternativa está tornando /dev/usbmon1
legível para o usuário comum ou alterando a propriedade após a criação do arquivo.)
Analisando uma captura USB HID
Como usuário não privilegiado, agora você pode começar a analisar o tráfego USB capturado. Você precisará conhecer os conceitos básicos de USB e HID para ter uma ideia disso. Os dispositivos HID mais simples geralmente têm dois pontos finais, um endpoint de controle bidirecional (EP0, este sempre existe) e um ponto final de interrupção para transferir dados do dispositivo para o host USB ("o computador").
Eu fiz um exemplo de captura anotada e fiz o upload para link . Eu sugiro que você leia os comentários do pacote para ter uma idéia melhor de como funciona. Quando você abre este pacote offline no Wireshark, eu recomendo adicionar um pouco de cor (View - > Coloring Rules):
-
frame.comment
- mais fácil ver quais quadros receberam um comando -
usb and frame.len == 64
(ou sua negação,usb and not frame.len == 64
) - perceba mais rápido quais pacotes receberam uma carga útil.
Também é recomendado adicionar algumas colunas extras (clique com o botão direito do mouse em uma coluna, Preferências de coluna):
-
usb.urb_type
- veja se um pacote é submetido (URB_SUBMIT
) ou recebido do dispositivo (URB_COMPLETE
). -
usb.transfer_type
- veja se você está olhando dados de controle (sobre EP0) ou outros dados (como interrupção de dados para dispositivos USB HID). -
usb.endpoint_number.direction
- veja a direção da transferência de dados (IN é do dispositivo para o host ("PC"), OUT é do host ("PC") para o dispositivo).
Eu arrastei essas colunas ao lado da coluna Len (gth) e redimensionei de forma que a coluna Info ainda esteja visível à direita dessas três colunas USB.
Com essa configuração, você pode iniciar a análise. Pressionar qualquer tecla deve gerar uma interrupção com dados em conformidade com o formato do descritor HID. Se não, então provavelmente há alguns comandos específicos do fornecedor (isto é, um driver especial) ou há um bug na pilha USB (HID) do Linux.