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?
Respostas:
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:
Você pode ver que o prefixo binário
1010_00nn
indica que é uma coleção e o postfixnnnn_nn01
indica 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 como0b1100_00nn
, comnn
que está sendo ignorado. É daí que0xC0
vem.Você também pode começar a ver como os outros argumentos são construídos. Por exemplo,
LOGICAL MINIMUM
é0x25
ou0b0010_0101
. A partir disso, podemos ver que temos um comprimento de dados de0bnnnn_nn01
ou um byte, e o especificador paraLOGICAL MINIMUM
é0b0010_01nn
A estrutura do
USAGE PAGE
descritor é a mesma. O comando para selecionar a página de uso é0000_01nn
ennnn_nn01
indica 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).
fonte