Onde procuro valores para criar um descritor USB HID?

10

Estou tentando me educar um pouco na criação de um descritor USB HID em C para um projeto USB PIC32 que quero tentar.

Fiz o download do documento HID Usage Tables em http://www.usb.org/developers/hidpage/ e tentei descobrir onde os valores reais são indicados para diferentes elementos no descritor HID.

Deixe-me explicar com um trecho da amostra que estou vendo:

ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={{
  0x05,0x01,        // USAGE_PAGE (Generic Desktop)
  0x09,0x05,        // USAGE (Game Pad)
  0xA1,0x01,        // COLLECTION (Application)
  0x15,0x00,        //   LOGICAL_MINIMUM(0)
  0x25,0x01,        //   LOGICAL_MAXIMUM(1)
  0x35,0x00,        //   PHYSICAL_MINIMUM(0)
  0x45,0x01,        //   PHYSICAL_MAXIMUM(1)
  // ...

A partir do exemplo acima, é claro que a matriz BYTE é constituída de pares chave / valor, se assim posso chamar. Por exemplo, a segunda linha: 0x05,0x01 indica a chave 0x05, que é a Página de Uso , e 0x01 é o valor que indica Área de Trabalho Genérica

Estou tentando descobrir onde esses valores são indicados no documento PDF da tabela de uso da HID. Por exemplo, não encontro nenhuma referência que

USAGE_PAGE == 0x05

e por exemplo

COLLECTION == 0xA1

Tentei pesquisar no PDF por 0xA1, sem resultado. A única maneira de descobrir quais são os valores é observando os comentários do exemplo ou usando a USB Descriptor Tool no link acima.

Só estou me perguntando, estou totalmente louco por perder essa documentação de referência de chave / valor?

Existem muitos exemplos online, como por exemplo o seguinte link: http://www.frank-zhao.com/cache/hid_tutorial_1.php

Mas mesmo isso faz referência a cargas de valores de sequência como END_COLLECTION == 0xc0

Onde encontro a referência para esses valores? o que estou perdendo?

josef.van.niekerk
fonte
Parece que vou precisar usar a ferramenta USB Descriptor para criar o descritor HID. :)
josef.van.niekerk

Respostas:

20

A documentação USB é bastante terrível. Ele sofre de excessiva generificação, onde eles estão tentando tornar tudo tão genérico e geral que é difícil passar dos documentos para qualquer aplicativo específico.

O formato do descritor está localizado no documento chamado " Device Class Definition for HID " no link para usb.org que você fornece.

O ponto crítico que você está perdendo é que os vários segmentos (como 0x05) não estão documentados com o prefixo 0x . De fato, eles geralmente os descrevem em binário bruto .

Por exemplo, em relação ao 0xA1: insira a descrição da imagem aqui

Você pode ver que o prefixo binário1010_00nn indica que é uma coleção e o postfix nnnn_nn01indica que ele tem 1 byte de comprimento. O byte subsequente é então interpretado como o tipo de coleção, neste caso do tipo Application. Isso define o contexto no qual os bytes adicionais são interpretados, até que o analisador de descritores HID veja outra marca de coleção ou um marcador de coleção final.

Você pode ver que END COLLECTIONé especificado como 0b1100_00nn, com nnque está sendo ignorado. É daí que 0xC0vem.

Você também pode começar a ver como os outros argumentos são construídos. Por exemplo, LOGICAL MINIMUMé 0x25ou 0b0010_0101. A partir disso, podemos ver que temos um comprimento de dados de 0bnnnn_nn01ou um byte, e o especificador para LOGICAL MINIMUMé0b0010_01nn

insira a descrição da imagem aqui

A estrutura do USAGE PAGEdescritor é a mesma. O comando para selecionar a página de uso é 0000_01nne nnnn_nn01indica que ele tem 1 byte de comprimento. Eu diria que, como a documentação afirma que as páginas de uso são 32 bits, os bits superiores são assumidos como zero ou inferidos de outra parte da documentação. Na verdade, eu não sei como eles são especificados.

Há uma boa página das várias constantes HID aqui .

E uma versão mais recente das fontes BSD aqui (Obrigado, @crazysim!) (A última HEAD , pode não durar).

Connor Wolf
fonte
Apenas o que eu precisava. Muito obrigado pela resposta em profundidade. Isso realmente ajuda muito! ;)
josef.van.niekerk 5/05
11
@ josef.van.niekerk - Não há problema. Já passou um tempo antes de eu me aprofundar nos padrões USB, e eles são tão opacos quanto eu me lembrava.
Connor Wolf
Peço desculpas pela covarde, mas o link para USB.org não funciona mais.
Rob van der Veer
11
@RobvanderVeer deve ser corrigido agora.
precisa saber é o seguinte
11
Essa "boa página de várias constantes HID" deve ser alterada para uma versão posterior desse arquivo a partir das fontes do FreeBSD? ?
crazysim