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?
Réponses:
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:
Vous pouvez voir que le préfixe binaire
1010_00nn
indique qu'il s'agit d'une collection et le suffixennnn_nn01
indique 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 COLLECTION
est spécifié0b1100_00nn
, avecnn
être ignoré. C'est de là que0xC0
vient le.Vous pouvez également commencer à voir comment les autres arguments sont construits. Par exemple,
LOGICAL MINIMUM
est0x25
ou0b0010_0101
. De cela, nous pouvons voir que nous avons une longueur de données de0bnnnn_nn01
, ou un octet, et le spécificateur pourLOGICAL MINIMUM
est0b0010_01nn
La structure du
USAGE PAGE
descripteur est la même. La commande pour sélectionner la page d'utilisation est0000_01nn
etnnnn_nn01
indique 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).
la source