Tengo un poco de un problema con la generación de HID descriptor.
Quiero usar informes sencillos con ID1 para la entrada y ID2 para la salida con 64 bytes de datos.

Me di cuenta de que a pesar de rtfming y google todavía no tienen ni idea acerca de algunos de los campos en el descriptor HID.

Puede alguien por favor darme una pista o un manual donde puedo encontrar el significado de todos los campos descriptores? Todos los que pude encontrar fue ejemplos de HID ratón/joistick/teclado.

Por ejemplo – REPORT_SIZE – es el tamaño en bytes o bits? Y por qué no también es REPORT_COUNT?
Si he de 64 bytes en el informe, LOGICAL_MAXIMUM debe ser 255 255*64?

Debo escribir LOGICAL_MAX y MIN por cada informe o no?

O tal vez este (generan en lugar de adivinar) será suficiente?

char ReportDescriptor[39] = {
    0x05, 0x01,                    //USAGE_PAGE (Generic Desktop)
    0x09, 0x00,                    //USAGE (Undefined)
    0xa1, 0x01,                    //COLLECTION (Application)
    0x85, 0x01,                    //  REPORT_ID (1)
    0x09, 0x00,                    //  USAGE (Undefined)
    0x15, 0x00,                    //  LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //  LOGICAL_MAXIMUM (255)
    0x75, 0x40,                    //  REPORT_SIZE (64)
    0x96, 0x00, 0x02,              //  REPORT_COUNT (512)
    0x81, 0x82,                    //  INPUT (Data,Var,Abs,Vol)
    0x85, 0x02,                    //  REPORT_ID (2)
    0x09, 0x00,                    //  USAGE (Undefined)
    0x15, 0x00,                    //  LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //  LOGICAL_MAXIMUM (255)
    0x75, 0x40,                    //  REPORT_SIZE (64)
    0x96, 0x00, 0x02,              //  REPORT_COUNT (512)
    0x91, 0x82,                    //  OUTPUT (Data,Var,Abs,Vol)
    0xc0                           //END_COLLECTION
};
Yo sé que usted dijo que RTFM, pero pidió también un manual de todos modos – ¿ha comprobado el especificación de HID usb.org, específicamente la sección 6.2.2 en el Informe de los Descriptores?
Informe de tamaño en bytes. Informe count es el número de informes que se están apoyando. La sección 5.8 se describe la lógica mínimo y el máximo. Si quieres algo menos «spec»y, a continuación, buscar en Jan Axelson USB Completo, tiene una gran HID descripción.
en realidad, sí, la tengo. Y todo lo que puedo ver es la descripción de la algunos de los campos. USO DE LA COLECCIÓN, DE ENTRADA, DE SALIDA. Y un ejemplo de HID ratón. Eso es útil, pero apenas lo suficiente. Si el informe count es el número de informes – ¿por qué hay tres de ellos en uno de HID ratón descriptor? Gracias por el libro, voy a mirar en él!
Informe de tamaño en bits en lugar de bytes. Es correctamente indica en la respuesta.

OriginalEl autor Amomum | 2014-02-06

4 Comentarios

  1. 15
    1. Toda la documentación oficial que está disponible en usb.org. Para entender HID Informe de Descriptores que usted necesita para leer algunos de los documentos de la HID Información página. En particular, usted debe tratar de entender:

      • El Dispositivo de la «Definición de la Clase HID 1.11» documento que describe el Dispositivo de Interfaz Humana formato de informe
      • La «ESCONDIÓ el Uso de Tablas 1.12» documento que describe los valores de muchos de Uso de las Páginas y Usos dentro de esas páginas que pueden aparecer en un Informe de Descriptor de

      Habiendo dicho eso, la documentación es muy obtusa y va a requerir un esfuerzo considerable para digerir.

    2. REPORT_SIZE es el tamaño de un informe en bits y no en bytes. Creo que de REPORT_SIZE como el ancho de un campo (en bits) y el REPORT_COUNT como el número de campos (de ancho). Esto es claro en el Dispositivo de la «Definición de la Clase HID 1.11» el documento, la Sección 6.2.2.7 Global «Elementos» de la siguiente manera:

      Global Item Tag     One-byte Prefix    Description
      Report Size         0111 01 nn         Unsigned integer specifying the size of the report
                                             fields in bits. This allows the parser to build an
                                             item map for the report handler to use. For more
                                             information, see Section 8: Report Protocol.
      
    3. Como un guía, un razonable (me.e yo no lo he probado) Informe Descriptor que describe un 64 bytes en el buffer de entrada (a la anfitriona con un REPORT_ID de 0x01) y una de 64 bytes en el buffer de salida (desde el host con un REPORT_ID de 0x02) podría ser la siguiente:

        0x06, 0x00, 0xFF,            //(GLOBAL) USAGE_PAGE         0xFF00 Vendor-defined 
        0xA1, 0x01,                  //(MAIN)   COLLECTION         0x01 Application (Usage=0x0: Page=, Usage=, Type=) <-- Warning: USAGE type should be CA (Application)
        0x15, 0x00,                  //  (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0
        0x26, 0xFF, 0x00,            //  (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255) 
        0x75, 0x08,                  //  (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field 
        0x85, 0x01,                  //  (GLOBAL) REPORT_ID          0x01 (1) 
        0x95, 0x40,                  //  (GLOBAL) REPORT_COUNT       0x40 (64) Number of fields 
        0x09, 0x01,                  //  (LOCAL)  USAGE              0xFF000001  
        0x81, 0x02,                  //  (MAIN)   INPUT              0x00000002 (64 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
        0x85, 0x02,                  //  (GLOBAL) REPORT_ID          0x02 (2) 
        0x09, 0x01,                  //  (LOCAL)  USAGE              0xFF000001  
        0x91, 0x02,                  //  (MAIN)   OUTPUT             0x00000002 (64 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
        0xC0,                        //(MAIN)   END_COLLECTION     Application
      

      Que corresponde a los siguientes C-la estructura de la lengua definiciones:

      //--------------------------------------------------------------------------------
      //Vendor-defined inputReport 01 (Device --> Host)
      //--------------------------------------------------------------------------------
      
      typedef struct
      {
        uint8_t  reportId;                                 //Report ID = 0x01 (1)
        uint8_t  VEN_VendorDefined0001[64];                //FF00 0001  Value = 0 to 255
      } inputReport01_t;
      
      //--------------------------------------------------------------------------------
      //Vendor-defined outputReport 02 (Device <-- Host)
      //--------------------------------------------------------------------------------
      
      typedef struct
      {
        uint8_t  reportId;                                 //Report ID = 0x02 (2)
        uint8_t  VEN_VendorDefined0001[64];                //FF00 0001  Value = 0 to 255
      } outputReport02_t;
      
    4. Debe especificar LOGICAL_MINIMUM y LOGICAL_MAXIMUM para cada informe? No.

      Algunos elementos son GLOBALES (lo que significa que, como el informe descriptor se analiza de forma secuencial, de sus valores permanecen hasta que son explícitamente cambiado por otro elemento GLOBAL) y otras son LOCALES (lo que significa que sus valores se restablecen a los valores predeterminados cada vez que un elemento PRINCIPAL se encuentra). Ambos LOGICAL_MINIMUM y LOGICAL_MAXIMUM son elementos GLOBALES, por lo que sólo tendrá que volver a especificar sus valores si desea que el valor de cambio. En mi opinión, la especificación habría sido más claro si los nombres oficiales de los artículos fueron precedidos por GLOBAL_, LOCAL_ y MAIN_ pero por desgracia todos tenemos que vivir con la especificación actual.

    5. El ejemplo anterior fue decodificado el uso de una herramienta gratuita en SourceForge llamado hidrdd

    Bien, muchas gracias. Por desgracia, sólo copiando su descriptor de no trabajo, pero que todavía es útil.
    Pulgar arriba para hidrdd que te recomienda.

    OriginalEl autor aja

  2. 6

    Como @aja se indicó anteriormente, el oficial USB documentación es bastante obtuso. He creado esta plantilla (sobre todo con la ayuda de esta página) como un simple punto de partida para comunicarse con un encargo del tablero. HID código está destinado a reemplazar el Puerto COM Virtual de protocolo. La gran ventaja con HID es que el controlador no es necesario.

    uint8_t CUSTOM_HID_ReportDesc[REPORT_DESC_SIZE] =
    {
       0x06, 0x00, 0xFF,    //Global  Usage page = 0xFF00 (Vendor-defined pages are in the range 0xFF00 through 0xFFFF)
       0x09, 0x01,          //Local   Usage (vendor usage 1)
       0xA1, 0x01,          //Main    Collection (application) begin
       0x15, 0x00,          //Global  Logical minimum (0) applies to each byte
       0x26, 0xFF, 0x00,    //Global  Logical maximum (255)
       0x75, 0x08,          //Global  Report Size (8 bits)
    
       //14 bytes | Output message 1 (sent from host to device)
       0x85,  1,            //Global  Report ID (cannot be 0)
       0x98, 64,            //Global  Report Count (number of Report Size fields, in this case 64 bytes)
       0x19, 0x01,          //Local   Usage Minimum (each Report Count must be associated with a Usage)
       0x19, 0x40,          //Local   Usage Maximum
       0x91, 0x02,          //Main    Output (data, array, absolute)
    
       //24 bytes | Input message 1 (sent from device to host)
       0x85,  1,            //Global  Report ID (cannot be 0)
       0x98, 64,            //Global  Report Count (number of Report Size fields)
       0x19, 0x01,          //Local   Usage Minimum (each Report Count must be associated with a Usage)
       0x19, 0x40,          //Local   Usage Maximum
       0x81, 0x02,          //Main    Input (data, array, absolute)
    
       //34 bytes | Output message 2 (sent from host to device)
       0x85,  2,            //Global  Report ID (cannot be 0)
       0x98, 12,            //Global  Report Count (number of Report Size fields)
       0x19, 0x01,          //Local   Usage Minimum (each Report Count must be associated with a Usage)
       0x19, 0x40,          //Local   Usage Maximum
       0x91, 0x02,          //Main    Output (data, array, absolute)
    
       //44 bytes | Input message 2 (sent from device to host)
       0x85,  2,            //Global  Report ID (cannot be 0)
       0x98, 57,            //Global  Report Count (number of Report Size fields)
       0x19, 0x01,          //Local   Usage Minimum (each Report Count must be associated with a Usage)
       0x19, 0x40,          //Local   Usage Maximum
       0x81, 0x02,          //Main    Input (data, array, absolute)
    
       //54 bytes | End (add one byte)
       0xC0                 //Main    Collection (application) end
    }
    

    Un par de cosas a tener en cuenta:

    • Más de entrada y de salida de los pares puede ser fácilmente añadido: acaba de dar otro ID de Informe. Cada definición de mensaje consta de 10 bytes, por lo que es muy sencillo añadir.
    • Hacemos un seguimiento del número de bytes en el descriptor de modo que el tamaño de la matriz puede ser computada (#define REPORT_DESC_SIZE (55)).

    En Windows, yo uso Mike O’Brien HIDLibrary. ESCONDIÓ los informes se suelen antepone con el ID de Informe-en HIDLibrary, el uso de la HidReport.ReportID campo para establecer/obtener el valor. En el consejo lado, recordar que el primer byte del informe será el ID de Informe.

    OriginalEl autor D. Shinobi

  3. 2

    Tengo mi costumbre dispositivo hid detectado por Win7 con este (construido por adivinar y robo de los ejemplos):

    {
        0x05, 0x01,                    //USAGE_PAGE (Generic Desktop)
        0x09, 0x00,                    //USAGE (Undefined)
        0xa1, 0x01,                    //COLLECTION (Application)
        0x15, 0x00,                    //  LOGICAL_MINIMUM (0)
        0x26, 0xff, 0x00,              //  LOGICAL_MAXIMUM (255)
        0x85, 0x01,                    //  REPORT_ID (1)
        0x75, 0x08,                    //  REPORT_SIZE (8)
        0x95, 0x40,                    //  REPORT_COUNT (64)
        0x09, 0x00,                    //  USAGE (Undefined)
        0x81, 0x82,                    //  INPUT (Data,Var,Abs,Vol) - to the host
        0x85, 0x02,                    //  REPORT_ID (2)
        0x75, 0x08,                    //  REPORT_SIZE (8)
        0x95, 0x40,                    //  REPORT_COUNT (64)
        0x09, 0x00,                    //  USAGE (Undefined)
        0x91, 0x82,                    //  OUTPUT (Data,Var,Abs,Vol) - from the host
        0xc0                           //END_COLLECTION
    }; /* CustomHID_ReportDescriptor */
    

    No estoy seguro de si funcionará correctamente aunque. Van a ver.

    hice el ejemplo de trabajo?
    lo hizo.

    OriginalEl autor Amomum

  4. 0

    Aquí hay un enlace a la Hoja De Especificaciones (o «manual») para sus propósitos de lectura.

    A contestar algunas de sus preguntas, REPORT_SIZE se especifica en bits y REPORT_COUNT puede ser utilizado para especificar cómo muchos de los «Usos» que se reporta con las propiedades indicadas. Por ejemplo, puede establecer las propiedades de la X y Y usos y el tener la REPORT_COUNT especificado como 2 (uno X y uno Y) y, a continuación, especifique el INPUT para agregar los usos para el informe. Luego continuar en la descripción de los otros usos.

    También, no se olvide de los usos byte alineados. Desde REPORT_COUNT se especifica en bits, es fácil olvidar a tener usos byte alineados. Así que si uno es el uso de sólo 1 bit, entonces usted necesita para especificar que no va a ser de 7 bits en el byte que no se utiliza antes de pasar a la siguiente uso si se requiere más de 7 bits.

    OriginalEl autor Chef Pharaoh

Dejar respuesta

Please enter your comment!
Please enter your name here