Estoy tratando de educarme un poco en la creación de un descriptor HID USB en C para un proyecto USB PIC32 que quiero intentar.
Descargué el documento de Tablas de uso de HID de http://www.usb.org/developers/hidpage/ y traté de averiguar dónde se indican los valores reales para diferentes elementos en el descriptor de HID.
Permítanme explicar con un extracto de la muestra que estoy viendo:
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)
// ...
Del ejemplo anterior, está claro que la matriz BYTE está constituida por pares clave / valor, si puedo llamarlo así. Por ejemplo, la segunda línea: 0x05,0x01 indica la clave 0x05, que es la página de uso , y 0x01 es el valor que indica el escritorio genérico
Estoy tratando de averiguar dónde se indican estos valores en el documento PDF de la tabla de uso de HID. Por ejemplo, no puedo encontrar ninguna referencia que
USAGE_PAGE == 0x05
y por ejemplo
COLLECTION == 0xA1
Traté de buscar en el PDF 0xA1, sin resultado. La única forma en que puedo averiguar cuáles son los valores es mirando los comentarios del ejemplo o utilizando la herramienta Descriptor USB desde el enlace de arriba.
Me pregunto, ¿estoy completamente tonto por perder esta documentación de referencia de clave / valor?
Hay muchos ejemplos en línea, como por ejemplo el siguiente enlace: http://www.frank-zhao.com/cache/hid_tutorial_1.php
Pero incluso esto hace referencia a un montón de valores de cadena como END_COLLECTION == 0xc0
¿Dónde encuentro la referencia para estos valores? ¿Qué me estoy perdiendo?
Respuestas:
La documentación del USB es bastante terrible. Sufre de una genéricaización excesiva, donde intentan hacer que todo sea tan genérico y general que sea difícil pasar de los documentos a cualquier aplicación específica.
El formato del descriptor se encuentra en el documento llamado " Definición de clase de dispositivo para HID " en el enlace a usb.org que usted proporciona.
Lo fundamental que falta es que los diversos segmentos (como 0x05) no están documentados con el prefijo 0x . De hecho, generalmente los describen en binario sin formato .
Por ejemplo, con respecto al 0xA1:
Puede ver que el prefijo binario
1010_00nn
indica que se trata de una colección, y el postfixnnnn_nn01
indica que tiene una longitud de 1 byte. Luego, el byte posterior se interpreta como el tipo de colección, en este caso del tipo Aplicación. Esto establece el contexto en el que se interpretan los bytes adicionales, hasta que el analizador del descriptor HID vea otra etiqueta de colección o un marcador de colección final.Puede ver que
END COLLECTION
se especifica como0b1100_00nn
, connn
ser ignorado. De aquí0xC0
viene el.También puede comenzar a ver cómo se construyen los otros argumentos. Por ejemplo,
LOGICAL MINIMUM
es0x25
, o0b0010_0101
. A partir de eso, podemos ver que tenemos una longitud de datos de0bnnnn_nn01
, o un byte, y el especificador paraLOGICAL MINIMUM
es0b0010_01nn
La estructura para el
USAGE PAGE
descriptor es la misma. El comando para seleccionar la página de uso es0000_01nn
ennnn_nn01
indica que tiene una longitud de 1 byte. Supongo que, dado que la documentación establece que las páginas de uso son de 32 bits, se supone que los bits superiores son cero o se deducen de otra parte de la documentación. En realidad no sé cómo se especifican.Hay una buena página de las diversas constantes HID aquí .
Y una versión más reciente de las fuentes de BSD aquí (¡Gracias, @crazysim!) (La última HEAD , puede no durar).
fuente