Note tecniche USB

In questo articolo della Rubrica Firmware Reload analizziamo alcune note tecniche di approfondimento sul protocollo USB.

Introduzione

Il protocollo di comunicazione USB, che gestisce lo scambio di informazioni tra un PC (Host) ed una periferica esterna (Device) è composto da diversi layer. Un'intera comunicazione (interrogazione, preparazione e trasferimento dei dati) viene chiamato ‘USB transfer’ (trasferimento USB). A parte una sola eccezione (il cosiddetto ‘Control-transfer’, ossia trasferimento di controllo) i dati viaggiano in una sola direzione. Un trasferimento è composto da una o più transazioni, le quali devono essere tutte eseguite in precisa sequenza. Ogni transazione è composta da un pacchetto gettone (header), un pacchetto opzionale di dati e da un pacchetto di stato (handshake). Questi pacchetti sono ulteriormente sottodivisi, a seconda del tipo di pacchetto, ed includono l’ID del pacchetto, l’indirizzo del destinatario e le informazioni per il controllo dell’errore (Figura 1).

Figura 1. Un trasferimento USB consiste in una inseparabile sequenza di transazioni che comprendono un Token, un campo dati ed un pacchetto di handshake.

Figura 1. Un trasferimento USB consiste in una inseparabile sequenza di transazioni che comprendono un Token, un campo dati ed un pacchetto di handshake

TIPI DI TRASFERIMENTO

L’Universal Serial Bus, come lo stesso nome suggerisce, è un’interfaccia generica progettata per gestire qualunque tipo di trasferimento di dati tra una periferica ed un PC. I metodi di trasferimento sono 4. Innanzitutto, il metodo Control-transfer è un caso speciale e deve essere supportato da qualunque dispositivo (vedi sotto). Tutti e 3 i restanti metodi gestiscono il flusso dei dati in funzione del tipo di dispositivo collegato al bus:

* Bulk-transfer: per il trasferimento di grosse quantità di dati, dove non sia richiesta la garanzia della velocità di trasferimento o la latenza (ad esempio un hard-disk esterno).

* Interrupt-transfer: per i dispositivi che richiedono la garanzia di una risposta rapida ed un trasferimento di piccole quantità di dati (ad esempio una tastiera USB).

* Isochronous-transfer: trasferimento a velocità fissa senza controllo (ad esempio streaming audio). Con questi tre metodi i dati viaggiano sempre in una direzione. Questi flussi di dati sono composti da transazioni più brevi, progettate per garantire un trasferimento sicuro ed efficiente tra il PC ed il dispositivo. Nelle transazioni ‘IN’ i dati viaggiano dal dispositivo esterno a PC, mentre le transazioni ‘OUT’ trasferiscono dati dal PC al dispositivo (con IN/OUT inteso sempre lato PC).

Le transazioni sono composte da tre pacchetti. Il pacchetto token specifica di quale tipo di transazione si tratta (In/Out), il pacchetto dati contiene i dati da inviare ed il pacchetto di handshake invia il feedback dal ricevitore. Quest’ultimo pacchetto può indicare sia l’avvenuta transazione (ACK) che la richiesta di ritrasmissione (NAK).

CONTROL-TRANSFER

Fino a qui tutto bene: che qualsiasi dispositivo USB sia in grado di funzionare automaticamente non appena connesso è una caratteristica delle porte USB. Il processo nel quale l’Host (PC) assegna un indirizzo ad un dispositivo, ne acquisisce le informazioni, carica il necessario driver software ed esegue la configurazione, viene chiamato ‘enumerazione’. In aggiunta, è probabile che il dispositivo non utilizzerà un singolo indirizzo ma avrà diversi punti terminali (‘endpoints’) per consentire il trasferimento bidirezionale delle informazioni (vedi riquadro). L’host dovrà quindi determinare il numero di endpoints e la loro lunghezza. L’intero processo di enumerazione viene eseguito utilizzando un trasferimento di tipo speciale, bidirezionale, chiamato control-transfer (nel quale l’endpoint 1 rappresenta l’IN e l’endpoint 0 rappresenta l’OUT del dispositivo).
Come il nome suggerisce, questo tipo di trasferimento permette all’host di controllare il dispositivo. Il control-transfer è strutturato allo stesso modo degli altri tipi di trasferimento, con la seguente sequenza di transazioni:

1. una transazione di setup
2. una, o più, transazioni di dati (opzionale)
3. una transazione di stato

Queste control-transfers comprendono sia la lettura che la scrittura. La lettura o la scrittura di dati, dal e per il dispositivo, viene determinata durante la transazione di setup.

TRANSAZIONI

Come per tutte le transazioni, la transazione di setup consiste in un pacchetto di token, in uno di dati e in uno di handshake. Il PC invia i pacchetti di token e dati e, se il dispositivo riceve i dati correttamente, risponde con un pacchetto di handshake ‘ACK’ (Figura 2).

Figura 2. Ogni trasferimento di tipo Control (in questo caso ‘write’) consiste in una transazione di tipo Setup seguita da una o più transazione di tipo data e Status.

Figura 2. Ogni trasferimento di tipo Control (in questo caso ‘write’) consiste in una transazione di tipo Setup seguita da una o più transazioni di tipo data e Status

Qualsiasi richiesta inizia con un pacchetto di Setup lungo 8-byte. Il primo byte bmRequestType determina la direzione della richiesta (Bit7=0 indica da host a dispositivo mentre Bit7=1 indica la direzione opposta) e se si tratta di una richiesta standard o specifica. I restanti 7 bytes: bRequest (1), wValue (2), wIndex (2) and wLength (2) completano il pacchetto dati di setup. Diamo innanzitutto un’occhiata al trasferimento di scrittura mostrato in Figura 2. Dopo l’avvenuta ricezione dei dati durante la transazione dei dati, il dispositivo invia un ACK di conferma. Se il dispositivo è occupato segnalerà al PC di attendere inviando un NAK oppure una cancellazione (STALL). Se viene rilevato un errore nel token o nei dati il pacchetto viene ignorato. Sebbene sia mostrata una sola transazione, possono aver luogo più transazioni, una dopo l’altra. La transazione di Stato completa il trasferimento ed il dispositivo segnala che è andato tutto bene.

A questo punto si invertono i ruoli. Il dispositivo invia i dati (stato) e l’host risponde con un pacchetto di handshake. Quando il trasferimento si completa con successo il dispositivo invia un pacchetto di lunghezza zero al PC e questo risponde con un ACK. Quando si verifica un errore ad un endpoint, il dispositivo invia uno STALL. Se il dispositivo è occupato, invia un NAK. Con il trasferimento di controllo di lettura (Figura 3) il dispositivo può reagire in 3 modi diversi al token in arrivo dal PC host. Il dispositivo può fornire dati o può inviare un NAK se è impegnato. Quando si verifica un errore ad un endpoint, il dispositivo invia uno STALL. Il token viene scartato in seguito a qualsiasi errore e non viene inviato. Durante la transazione di Stato il PC host risponde con un pacchetto di lunghezza zero per segnalare che i dati sono stati ricevuti correttamente. Il dispositivo, a sua volta, risponde con un pacchetto ACK di handshake.

Figura 3. Read Control-transfer

Figura 3. Read Control-transfer

I DESCRITTORI

Per potere scoprire quale tipo di dispositivo è stato collegato, durante la fase di enumerazione l’host invia una richiesta Standard al dispositivo chiedendo l’invio delle sue informazioni di descrizione. Queste informazioni sono organizzate gerarchicamente [1]. Ogni dispositivo deve fornire come minimo 4 descrittori:

* Device descriptor: ciascun dispositivo ha un unico descrittore.

* Configuration descriptors: un dispositivo può avere più di una configurazione; ad esempio, può essere possibile alimentare il circuito tramite il bus o da sorgente esterna. Potrà essere attiva una sola configurazione alla volta.

* Interface descriptors: in questo descrittore vengono raggruppati più endpoints in un singolo gruppo funzionale. Possono essere attive simultaneamente un numero di interfacce (ad esempio una interfaccia fax, una stampante e uno scanner in una stampante multifunzione).

* Endpoint descriptor: qui vengono descritti gli endpoint (eccetto l'endpoint zero). E' importante definire la direzione (Bit 7) nel campo EndpointAddress. I descrittori di stringa (String-Descriptors) sono opzionali e forniscono ulteriori informazioni leggibili. Le stringhe sono codificate in 16-bit Unicode. La stringa indice 0 fornisce la lista delle lingue supportate.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend