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

 

<-- Quarta parte

Sesta parte -->

 

Ultimo aggiornamento: 17 giugno 2011