Où puis-je rechercher des valeurs pour créer un descripteur USB HID?

10

J'essaie de me renseigner un peu sur la création d'un descripteur USB HID en C pour un projet USB PIC32 que je veux essayer.

J'ai téléchargé le document HID Usage Tables sur http://www.usb.org/developers/hidpage/ et j'essaie de comprendre où les valeurs réelles sont indiquées pour différents éléments dans le descripteur HID.

Je m'explique avec un extrait de l'échantillon que je regarde:

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)
  // ...

D'après l'exemple ci-dessus, il est clair que le tableau BYTE est constitué de paires clé / valeur, si je peux l'appeler ainsi. Par exemple, la 2ème ligne: 0x05,0x01 indique la clé 0x05, qui est la page d'utilisation , et 0x01 est la valeur indiquant Generic Desktop

J'essaie de comprendre où ces valeurs sont indiquées dans le document PDF HID Usage Table. Par exemple, je ne trouve aucune référence

USAGE_PAGE == 0x05

et par exemple

COLLECTION == 0xA1

J'ai essayé de chercher dans le PDF 0xA1, aucun résultat. La seule façon dont je peux découvrir quelles sont les valeurs, c'est en regardant les commentaires de l'exemple, ou en utilisant l' outil de description USB à partir du lien ci-dessus.

Je me demande simplement, suis-je totalement stupide d'avoir manqué cette documentation de référence clé / valeur?

Il existe de nombreux exemples en ligne, comme par exemple le lien suivant: http://www.frank-zhao.com/cache/hid_tutorial_1.php

Mais même cela fait référence à des charges de valeurs de chaîne comme END_COLLECTION == 0xc0

Où puis-je trouver la référence pour ces valeurs? Qu'est-ce que je rate?

josef.van.niekerk
la source
On dirait que je vais devoir utiliser l'outil de description USB pour créer le descripteur HID. :)
josef.van.niekerk

Réponses:

20

La documentation USB est assez terrible. Il souffre d'une généralisation excessive, où ils essaient de rendre tout si générique et général qu'il est difficile de passer des documents à une application spécifique.

Le format du descripteur se trouve dans le document intitulé « Définition de classe de périphérique pour HID » sur le lien vers usb.org que vous fournissez.

La chose critique qui vous manque est que les différents segments (tels que 0x05) ne sont pas documentés avec le préfixe 0x . En fait, ils les décrivent généralement en binaire brut .

Par exemple, en ce qui concerne le 0xA1: entrez la description de l'image ici

Vous pouvez voir que le préfixe binaire1010_00nn indique qu'il s'agit d'une collection et le suffixe nnnn_nn01indique qu'il fait 1 octet de long. L'octet suivant est alors interprété comme le type de collection, dans ce cas de type Application. Cela définit ensuite le contexte dans lequel les octets supplémentaires sont interprétés, jusqu'à ce que l'analyseur de descripteur HID ne voit une autre balise de collection ou un marqueur de fin de collection.

Vous pouvez voir END COLLECTIONest spécifié 0b1100_00nn, avec nnêtre ignoré. C'est de là que 0xC0vient le.

Vous pouvez également commencer à voir comment les autres arguments sont construits. Par exemple, LOGICAL MINIMUMest 0x25ou 0b0010_0101. De cela, nous pouvons voir que nous avons une longueur de données de 0bnnnn_nn01, ou un octet, et le spécificateur pour LOGICAL MINIMUMest0b0010_01nn

entrez la description de l'image ici

La structure du USAGE PAGEdescripteur est la même. La commande pour sélectionner la page d'utilisation est 0000_01nnet nnnn_nn01indique qu'elle est longue de 1 octet. Je suppose que, puisque la documentation indique que les pages d'utilisation sont de 32 bits, les bits supérieurs sont supposés être nuls ou déduits d'une autre partie de la documentation. En fait, je ne sais pas comment ils sont spécifiés.

Il y a une bonne page des différentes constantes HID ici .

Et une version plus récente des sources BSD ici (Merci, @crazysim!) (La dernière HEAD , peut ne pas durer).

Connor Wolf
la source
Juste ce dont j'avais besoin. Merci beaucoup pour la réponse approfondie. Ça aide vraiment beaucoup! ;)
josef.van.niekerk
1
@ josef.van.niekerk - Pas de problème. Cela fait un moment que je ne me suis pas plongé dans les normes USB, et elles sont aussi opaques que je m'en souvienne.
Connor Wolf
Je m'excuse pour le fossoyage, mais le lien vers USB.org ne fonctionne plus.
Rob van der Veer
1
@RobvanderVeer devrait être corrigé maintenant.
hoosierEE
1
Cette «bonne page de diverses constantes HID» devrait-elle être changée en une version ultérieure de ce fichier à partir des sources FreeBSD? ?
Crazysim