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

10

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?

josef.van.niekerk
fuente
Parece que voy a tener que usar la herramienta Descriptor USB para construir el descriptor HID. :)
josef.van.niekerk

Respuestas:

20

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: ingrese la descripción de la imagen aquí

Puede ver que el prefijo binario1010_00nn indica que se trata de una colección, y el postfix nnnn_nn01indica 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 COLLECTIONse especifica como 0b1100_00nn, con nnser ignorado. De aquí 0xC0viene el.

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 para el USAGE PAGEdescriptor es la misma. El comando para seleccionar la página de uso es 0000_01nne nnnn_nn01indica 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).

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