Oscilloscopio USB: Progetto PitaScope
I descrittori
Le capacità di una periferica si definiscono in ordine gerarchico e sono memorizzate all'interno della stessa nei campi dei descrittori, delle strutture di dati.
I descrittori si possono rappresentare con una struttura ad albero simile alla seguente:
Come mostra la figura, una periferica può avere una o più configurazioni; all'interno delle configurazioni ci sono le interfaccie, le quali selezionano i comportamenti degli endpoint.
Un'interfaccia può avere più impostazioni alternative ("alternate settings") che servono a ridefinire il numero o il comportamento degli endpoint.
Le configurazioni, le interfaccie e le impostazioni alternative sono numerate a partire da zero.
Inoltre ogni configurazione definisce la quantità di corrente di alimentazione (per dispositivi bus-powered) richiesta per il funzionamento della periferica; se tale corrente è superiore a quella disponibile, ed erogabile dai 5 volt dell'USB, l'host non dovrebbe selezionare quella configurazione.
Ogni descrittore inizia con un campo bLength di un byte contenente la dimensione del descrittore stesso (intesa come numero di byte), seguito dal campo bDescriptorType, anch'esso da un byte, che identifica il tipo di descrittore.
I descrittori possono contenere riferimenti a descrittori di tipo stringa: questi sono opzionali ma i campi contenenti i riferimenti ad essi sono obbligatori, e nel caso non si usino descrittori-stringa tali campi devono essere riempiti con zeri.
All'inizio di questo progetto definisco una sola configurazione contenente una sola interfaccia; quest'ultima è collegata all'endpoint zero (di controllo) e all'endpoint 1 (per trasferimenti BULK in ingresso).
Non c'è mai un descrittore per l'endpoint zero.
Il descrittore del dispositivo
Questo descrittore è unico e contiene informazioni generali sul dispositivo; di seguito trovate la sua struttura:
offset | campo | dimensione [byte] | valore | descrizione | valore esadecimale di questo progetto |
0 | bLength | 1 | numero | dimensione di questo descrittore | 0x12 |
1 | bDescritporType | 1 | costante | Device descriptor type | 0x01 |
2 | bcdUSB | 2 | BCD | indica la versione USB di questo dispositivo | 0x0200, cioè dispositivo USB 2.0 |
4 | bDeviceClass | 1 | Classe | codice della classe di appartenenza del dispositivo | 0xFF, cioè non appartiene a nessuna classe definita dagli standard |
5 | bDeviceSubClass | 1 | SottoClasse | codice della sottoclasse di appartenenza del dispositivo | 0xFF |
6 | bDeviceProtocol | 1 | Protocollo | Codice del protocollo utilizzato | 0x00, cioè nessun protocollo vendor-specific |
7 | bMaxPacketSize0 | 1 | Numero | Lunghezza di pacchetto massima per l'endpoint zero | 0x08 |
8 | idVendor | 2 | ID | Vendor-ID | 0x04D8 |
10 | idProduct | 2 | ID | Product-ID | 0x04DA |
12 | bcdDevice | 2 | BCD | Versione del dispositivo in DCB | 0x0100 |
14 | iManufacturer | 1 | Indice | indice del descrittore-stringa produttore | 0x00 |
15 | iProduct | 1 | Indice | indice del descrittore-stringa prodotto | 0x00 |
16 | iSerialNumber | 1 | Indice | indice del descrittore-stringa numero seriale | 0x00 |
17 | bNumConfiguration | 1 | Numero | numero delle possibili configurazioni | 0x01 |
Il descrittore della configurazione
offset | campo | dimensione [byte] | valore | descrizione | valore esadecimale di questo progetto |
0 | bLength | 1 | numero | dimensione di questo descrittore | 0x09 |
1 | bDescriptorType | 1 | costante | Configuration descriptor type | 0x02 |
2 | wTotalLength | 2 | Numero | Lunghezza totale dei descrittori subordinati a questa configurazione (somma dimensioni configurazione, interfaccia e endpoint) | 0x0019 (sono 25 byte) |
4 | bNumInterfaces | 1 | numero | numero di interfaccie supportate da questa configurazione | 0x01 |
5 | bConfigurationValue | 1 | numero | indica il numero di questa configurazione | 0x01 |
6 | iConfiguration | 1 | indice | indice del descrittore-stringa che descrive questa configurazione | 0x00 |
7 | bmAttributes | 1 | bitmap | caratteristiche della configurazione | 0xA0, abilita il remote-wakeup |
8 | bMaxPower | 1 | milliAmpere | massima corrente richiesta dal dispositivo | 0x32, 100 mA max |
Il descrittore del'interfaccia
offset | campo | dimensione [byte] | valore | descrizione | valore esadecimale di questo progetto |
0 | bLength | 1 | numero | dimensione di questo descrittore | 0x09 |
1 | bDescritporType | 1 | costante | Interface descriptor type | 0x04 |
2 | bInterfaceNumber | 1 | numero | numero di questa interfaccia | 0x00, interfaccia di default |
3 | bAlternateSetting | 1 | numero | valore usato per selezionare questa alternate-setting | 0x00 |
4 | bNumEndpoints | 1 | numero | numero di endpoint usati da questa interfaccia (escluso l'endpoint zero) | 0x01 |
5 | bInterfaceClass | 1 | classe | codice della classe di appartenenza dell'interfaccia | 0xFF |
6 | bInterfaceSubClass | 1 | sottoclasse | codice della sottoclasse di appartenenza dell'interfaccia | 0xFF |
7 | bInterfaceProtocol | 1 | protocollo | Codice del protocollo utilizzato | 0xFF |
8 | iInterface | 1 | indice | descrittore-stringa per questa interfaccia | 0x00 |
Il descrittore del'endpoint1
offset | campo | dimensione [byte] | valore | descrizione | valore esadecimale di questo progetto |
0 | bLength | 1 | numero | dimensione di questo descrittore | 0x07 |
1 | bDescritporType | 1 | costante | Interface descriptor type | 0x05 |
2 | bEndpointAddress | 1 | numero | numero e direzionalità di questo endpoint | 0x81 |
3 | bmAttributes | 1 | numero | Tipo di trasferimento | 0x02 |
4 | wMaxPacketSize | 2 | numero | Lunghezza massima del pacchetto | 0x0008, 8 bytes |
6 | bInterval | 1 | classe | Numero di frame massimo dopo il quale è consentito un NAK dalla periferica | 0x00 |
Ultimo aggiornamento: 17 giugno 2011