Dove posso cercare i valori per creare un descrittore HID USB?


10

Sto cercando di istruirmi un po 'sulla creazione di un descrittore HID USB in C per un progetto USB PIC32 che voglio tentare.

Ho scaricato il documento Tabelle di utilizzo HID da http://www.usb.org/developers/hidpage/ e ho cercato di capire dove sono indicati i valori effettivi per diversi elementi nel descrittore HID.

Lasciatemi spiegare con un estratto del campione che sto guardando:

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)
  // ...

Dall'esempio sopra, è chiaro che l'array BYTE è costituito da coppie chiave / valore, se posso chiamarlo così. Ad esempio la seconda riga: 0x05,0x01 indica la chiave 0x05, che è la pagina di utilizzo , e 0x01 è il valore che indica Desktop generico

Sto cercando di capire dove sono indicati questi valori nel documento PDF Tabella utilizzo HID. Ad esempio, non riesco a trovare alcun riferimento

USAGE_PAGE == 0x05

e per esempio

COLLECTION == 0xA1

Ho provato a cercare il PDF per 0xA1, nessun risultato. L'unico modo in cui sono in grado di scoprire quali sono i valori è guardando i commenti dell'esempio o utilizzando lo strumento di descrizione USB dal link sopra.

Mi sto solo chiedendo, sono totalmente stupido per aver perso questa documentazione di riferimento chiave / valore?

Ci sono molti esempi online, come ad esempio il seguente link: http://www.frank-zhao.com/cache/hid_tutorial_1.php

Ma anche questo fa riferimento a un sacco di valori stringa come END_COLLECTION == 0xc0

Dove trovo il riferimento per questi valori? Cosa mi sto perdendo?


Sembra che dovrò usare lo Strumento descrittore USB per creare il descrittore HID. :)
josef.van.niekerk

Risposte:


20

La documentazione USB è piuttosto terribile. Soffre di eccessiva generizzazione, dove stanno cercando di rendere tutto così generico e generico che è difficile passare dai documenti a qualsiasi applicazione specifica.

Il formato del descrittore si trova nel documento chiamato " Definizione della classe di dispositivi per HID " nel collegamento a usb.org fornito.

La cosa fondamentale che ti manca è che i vari segmenti (come 0x05) non siano documentati con il prefisso 0x . In effetti, generalmente li descrivono in binari grezzi .

Ad esempio, per quanto riguarda lo 0xA1: inserisci qui la descrizione dell'immagine

Puoi vedere che il prefisso binario1010_00nn indica che è una raccolta e che il postfisso nnnn_nn01indica che è lungo 1 byte. Quindi il byte successivo viene quindi interpretato come il tipo di raccolta, in questo caso di tipo Applicazione. Questo quindi imposta il contesto in cui vengono interpretati gli ulteriori byte, fino a quando il parser del descrittore HID non vede un altro tag di raccolta o un indicatore di fine collezione.

Puoi vedere che END COLLECTIONè specificato come 0b1100_00nn, con nnessere ignorato. Questo è da dove 0xC0proviene.

Puoi anche iniziare a vedere come sono costruiti gli altri argomenti. Ad esempio, LOGICAL MINIMUMè 0x25o 0b0010_0101. Da ciò, possiamo vedere che abbiamo una lunghezza di dati di 0bnnnn_nn01, o un byte, e lo specificatore LOGICAL MINIMUMè0b0010_01nn

inserisci qui la descrizione dell'immagine

La struttura per il USAGE PAGEdescrittore è la stessa. Il comando per selezionare la pagina di utilizzo è 0000_01nne nnnn_nn01indica che è lungo 1 byte. Immagino che, poiché la documentazione afferma che le pagine di utilizzo sono a 32 bit, si presume che i bit superiori siano zero o dedotti da un'altra parte della documentazione. In realtà non so come siano specificati.

C'è una buona pagina delle varie costanti HID qui .

E una versione più recente delle fonti BSD qui (grazie, @crazysim!) (L'ultima HEAD , potrebbe non durare).


Proprio quello di cui avevo bisogno. Grazie mille per la risposta approfondita. Aiuta davvero molto! ;)
josef.van.niekerk

1
@ josef.van.niekerk - Nessun problema. È passato un po 'di tempo prima che mi immergessi negli standard USB e sono opachi come ricordavo.
Connor Wolf,

Mi scuso per il beccheggio ma il collegamento a USB.org non funziona più.
Rob van der Veer,

1
@RobvanderVeer dovrebbe essere risolto ora.
hoosierEE

1
Quella "buona pagina di varie costanti HID" dovrebbe essere cambiata in una versione successiva di quel file dai sorgenti di FreeBSD? ?
crazysim,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.