O teclado USB (HID) não está respondendo no linux, mas no grub

4

Um teclado USB externo que gostaria de usar é reconhecido como um dispositivo USB HID, mas não é funcional quando o Linux é inicializado. Ele funciona quando conectado a uma área de trabalho do Windows e funciona no grub, mas não quando o sistema é inicializado.

O dispositivo está visível na porta USB (05a4: 8003):

$ lsusb
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 002: ID 046d:c078 Logitech, Inc. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 05a4:8003 Ortek Technology, Inc.

E dmesg não mostra erros quando o dispositivo é conectado:

[  466.932272] usb 1-1.2: new full-speed USB device number 4 using ehci_hcd
[  467.026740] usb 1-1.2: New USB device found, idVendor=05a4, idProduct=8003
[  467.026745] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  467.026756] usb 1-1.2: Product: USB Keypad     
[  467.026758] usb 1-1.2: Manufacturer: Keypad
[  467.027939] input: Keypad USB Keypad      as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/input/input13
[  467.028099] hid-generic 0003:05A4:8003.0004: input,hidraw1: USB HID v1.10 Keyboard [Keypad USB Keypad     ] on usb-0000:00:1a.0-1.2/input0
[  467.029600] input: Keypad USB Keypad      as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1/input/input14
[  467.029726] hid-generic 0003:05A4:8003.0005: input,hidraw2: USB HID v1.10 Mouse [Keypad USB Keypad     ] on usb-0000:00:1a.0-1.2/input1

Os dispositivos de entrada / evento são criados, mas não respondem. Gostaria de saber se é problemático que o dispositivo seja registrado duas vezes, como entrada do teclado e como entrada do mouse.

Estou testando em um sistema Ubuntu 13.04. O sistema de destino pretendido é um Raspberry Pi com Rasbian. Desde que o problema aparece em Rasbian da mesma maneira que eu estou pensando é relacionado ao Linux.

Como posso depurar isso mais? Alguma idéia do que poderia causar esse comportamento sem resposta?

    
por user3454656 24.03.2014 / 10:27

1 resposta

4

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.

    
por 25.03.2014 / 15:51