Depuração de descritor de relatório HID: por que o dispositivo enumera, mas o host lê dados errados

Como diagnosticar erros de descritor de relatório HID que fazem um dispositivo USB enumerar com sucesso, mas se comportar de forma errada no host.

USB, HID, descritor de relatório, firmware, relatório HID, endpoint de interrupção, depuração USB

HID é atraente porque muitos dispositivos funcionam sem drivers customizados. Teclados, sensores, knobs, leitores de código de barras, painéis de controle e dispositivos HID vendor-specific se beneficiam de uma pilha padrão do host. Mas o HID também empurra a complexidade para o descritor de relatório. Um dispositivo pode enumerar corretamente e mesmo assim enviar dados que o host interpreta errado.

Essa é uma das armadilhas mais comuns de firmware USB: confundir sucesso de enumeração com corretude do HID.

O descritor de relatório define o contrato de dados

O descritor de relatório HID diz ao host como interpretar os bytes. Ele define usages, tamanhos de report, contagens, faixas lógicas, faixas físicas, collections e report IDs. Se o descritor diz uma coisa e o firmware envia outra, o host segue o descritor.

Problemas comuns:

  • o firmware envia 8 bytes, mas o descritor descreve 7
  • report ID está faltando ou sobrando
  • valores signed são descritos como unsigned
  • logical min/max não bate com a faixa real
  • usage page está errado
  • bits de padding são contados errado
  • múltiplos relatórios compartilham um layout confuso
  • input e output reports se misturam

O sintoma pode aparecer na aplicação como valores errados, botões que não respondem, relatórios ignorados ou leituras intermitentes.

Capture o descritor e os relatórios juntos

Depurar HID só pelo descritor de relatório é incompleto. Depurar só pelos bytes do payload também é incompleto. Você precisa dos dois.

Uma captura útil de HID mostra:

  • device descriptor
  • configuration e interface descriptors
  • HID descriptor
  • requisição e resposta do report descriptor
  • interrupt IN reports
  • interrupt OUT reports, se houver
  • control transfers para feature reports
  • report IDs e tamanhos de payload

Aí o engenheiro consegue comparar o layout declarado com os bytes reais. Se o descritor diz Report Count 3 e o payload de interrupt traz quatro valores, a captura precisa tornar isso visível.

O comportamento do host pode estar certo mesmo quando parece errado

Desenvolvedores de firmware às vezes acham que o host está perdendo dados. Na verdade, o host pode estar interpretando de acordo com o descritor que recebeu. Se o descritor declara padding ou um report ID diferente, os dados podem aparecer deslocados, truncados ou ignorados.

Por isso um bom relatório de suporte deve incluir os bytes brutos. A interpretação decodificada ajuda, mas os bytes brutos encerram a discussão. As perguntas viram:

  • o que o firmware enviou?
  • o que o firmware declarou?
  • o que o host pediu?
  • o que o host recebeu?

Essa é a fronteira certa para a depuração de HID.

Dispositivos HID compostos pedem cuidado extra

Dispositivos compostos podem expor HID junto com CDC, armazenamento ou interfaces vendor-specific. A parte de HID pode estar correta sozinha, mas ser afetada por erros de numeração de interface, atribuição de endpoint ou comprimento total do descritor.

Para depuração de HID composto, inspecione:

  • interface association, quando aplicável
  • número da interface
  • unicidade de endereço de endpoint
  • localização do HID descriptor
  • comprimento do report descriptor
  • roteamento de class-specific requests

Quando o host pede o report descriptor para a interface errada ou recebe o tamanho errado, o tráfego de relatórios posterior fica enganoso.

Onde o Bus Scope entra

O Bus Scope foi feito para equipes de firmware e dispositivos que precisam de uma depuração USB orientada a evidência. Para casos de descritor de relatório HID, ele deve deixar o engenheiro inspecionar a árvore do descritor, os bytes brutos, o tráfego de endpoint e a sessão .bscope salva juntos.

O resultado prático deve ser um relatório que diz:

  • o descritor de relatório HID foi pedido e devolvido
  • tamanho do relatório declarado pelo descritor
  • tamanho efetivo do payload de interrupt
  • comportamento de report ID
  • divergência ou coerência entre declaração e tráfego
  • próxima ação em descritor de firmware, empacotamento de relatório ou expectativas do parser de host

Isso é mais útil do que "dispositivo HID não funciona". Transforma um problema de entrada vago em uma divergência concreta de contrato USB.