¿Dónde busco valores para construir un descriptor USB HID?

Estoy tratando de educarme un poco sobre la creación de un descriptor USB HID en C para un proyecto USB PIC32 que quiero intentar.

He descargado el documento de tablas de uso de HID de http://www.usb.org/developers/hidpage/ y tratando 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

Intenté buscar el PDF para 0xA1, sin resultado. La única forma en que puedo averiguar cuáles son los valores es mirando los comentarios del ejemplo o usando la herramienta de descripción USB del enlace anterior.

Me pregunto, ¿soy totalmente tonto por perderme 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?

Parece que voy a tener que usar la herramienta de descriptor USB para construir el descriptor HID. :)

Respuestas (1)

La documentación USB es bastante terrible. Adolece de una generalización excesiva, donde intentan hacer que todo sea tan genérico y general que es difícil pasar de los documentos a una 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 más importante que te estás perdiendo es que los diversos segmentos (como 0x05) no están documentados con el prefijo 0x . De hecho, generalmente los describen en binario sin procesar .

Por ejemplo, con respecto al 0xA1:ingrese la descripción de la imagen aquí

Puede ver que el prefijo binario1010_00nn indica que es una colección y el sufijo nnnn_nn01indica que tiene 1 byte de longitud. Luego, el byte subsiguiente se interpreta como el tipo de colección, en este caso de tipo Aplicación. Esto luego establece el contexto en el que se interpretan los bytes adicionales, hasta que el analizador del descriptor HID ve otra etiqueta de colección o un marcador de colección final.

Puede ver que END COLLECTIONse especifica como 0b1100_00nn, sin nnser ignorado. Aquí es de donde 0xC0viene.

También puede comenzar a ver cómo se construyen los otros argumentos. Por ejemplo, LOGICAL MINIMUMes 0x25, o 0b0010_0101. A partir de eso, podemos ver que tenemos una longitud de datos de 0bnnnn_nn01, o un byte, y el especificador para LOGICAL MINIMUMes0b0010_01nn

ingrese la descripción de la imagen aquí

La estructura del USAGE PAGEdescriptor es la misma. El comando para seleccionar la página de uso es 0000_01nne nnnn_nn01indica que tiene 1 byte de longitud. 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 infieren 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!) (Último HEAD , puede que no dure).

Justo lo que necesitaba. Muchas gracias por la respuesta en profundidad. ¡Realmente ayuda mucho! ;)
@josef.van.niekerk - No hay problema. Pasó un tiempo antes de profundizar en los estándares USB, y son tan opacos como recordaba.
Me disculpo por cavar tumbas, pero el enlace a USB.org ya no funciona.
@RobvanderVeer debería arreglarse ahora.
¿Debería cambiarse esa "buena página de varias constantes HID" a una versión posterior de ese archivo de las fuentes de FreeBSD? ?