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

9

Estoy tratando de aprender un poco sobre cómo crear un descriptor USB HID en C para un proyecto PIC32 USB que quiero intentar.

He descargado el documento HID Usage Tables de enlace y trato de averiguar dónde se indican los valores reales para diferentes elementos en el descriptor HID.

Permítame explicarlo 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 Escritorio genérico

Estoy tratando de averiguar dónde se indican estos valores en el documento PDF de HID Usage Table. Por ejemplo, no puedo encontrar ninguna referencia que

USAGE_PAGE == 0x05

y por ejemplo

COLLECTION == 0xA1

Intenté 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 usando la Herramienta de descriptor de USB del enlace de arriba.

Me estoy preguntando, ¿estoy totalmente enojado por no ver esta documentación de referencia clave / valor?

Hay muchos ejemplos en línea, como por ejemplo el siguiente enlace: enlace

Pero incluso esto hace referencia a cargas de valores de cadena como END_COLLECTION == 0xc0

¿Dónde encuentro la referencia para estos valores? ¿Qué me estoy perdiendo?

    

1 respuesta

16

La documentación del USB es bastante terrible. Sufre de una generación excesiva, donde intentan hacer que todo sea tan genérico y general que sea difícil pasar de los documentos a una aplicación específica.

El formato del descriptor se encuentra en el documento denominado " Definición de clase de dispositivo para HID " en el enlace a usb.org usted proporciona.

Lo que más te falta es que los diversos segmentos (como 0x05) no están documentados con el prefijo 0x . De hecho, generalmente los describen en binario en bruto .

Por ejemplo, con respecto al 0xA1:

Puedeverqueelprefijobinario1010_00nnindicaqueesunacolección,yelpostfijonnnn_nn01indicaquetiene1bytedelongitud.Luego,elbytesubsiguienteseinterpretacomoeltipodecolección,enestecasodeltipoAplicación.Estoluegoestableceelcontextoenelqueseinterpretanlosbytesadicionales,hastaqueelanalizadordedescriptoresHIDveaotraetiquetadecolecciónounmarcadordecolecciónfinal.

PuedeverqueENDCOLLECTIONseespecificacomo0b1100_00nn,connnignorado.Aquíesdedondevieneel0xC0.

Tambiénpuedescomenzaravercómoseconstruyenlosotrosargumentos.Porejemplo,LOGICALMINIMUMes0x25o0b0010_0101.Apartirdeeso,podemosverquetenemosunalongituddedatosde0bnnnn_nn01,ounbyte,yelespecificadorparaLOGICALMINIMUMes0b0010_01nn

La estructura para el descriptor USAGE PAGE es la misma. El comando para seleccionar la página de uso es 0000_01nn , y nnnn_nn01 indica que tiene 1 byte de longitud. Supongo que, dado que la documentación indica 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 están especificados.

Hay una buena página de las varias constantes HID aquí .

Y una versión más reciente de las fuentes de BSD !) (la última HEAD , puede que no dure).

    
respondido por el Connor Wolf

Lea otras preguntas en las etiquetas