Protocollo USB

Elementi di un sistema USB

HOST: dispositivo master (PC), l’unico autorizzato ad avviare una comunicazione sul bus

HUB: come nelle reti di computer, l’hub fornisce un punto di connessione a più periferiche partendo da una sola porta USB.

DEVICE: ogni dispositivo nel sistema USB che non è un host è necessariamente una periferica (hub inclusi). Esistono periferiche autoalimentate, o alimentate dal bus e periferiche full-speed (12Mbps) o low-speed (1.5Mbps)


Comunicazione USB

L’host (unico dispositivo in grado di iniziare una comunicazione) interroga ciclicamente le periferiche seconda una certa schedulazione, inviando un pacchetto dati contenente i parametri:

Ogni dispositivo che riceve il pacchetto dati USB (token packet):

L'entità che invia il pacchetto dati può rispondere con dati significativi oppure specificare che non ha nessun dato da trasmettere.

Il ricevitore da parte sua risponde con un pacchetto dati di handshake per notificare al trasmittente l'avvenuta ricezione e quindi il successo della transazione.



Flusso di comunicazione USB

La comunicazione logica tra client software (host) e funzione della periferica è effettuata tramite pipes. Un pipe è un’associazione tra uno specifico endpoint sulla periferica e l’appropriato software sull’host Un endpoint è la sorgente o la destinazione dei dati trasmessi sul cavo USB. Un’interfaccia è composta da endpoints raggruppati. Il client software trasmette dati tra il buffer dell’host e l’endpoint nella periferica, gestendo la specifica interfaccia.

La comunicazione sul bus può essere in due direzioni:


Strati di comunicazione USB - Physical Layer

Lo strato fisico è l’interfaccia fisica ovvero il cavo USB. Il suo compito è di trasmettere e ricevere “0” ed “1” in modo corretto. La trasmissione di uno “0” avviene portando il potenziale del terminale D+ del cavo USB a livello basso e quello del terminale D- a livello alto, e viceversa per trasmettere un “1”. I bit sono inviati partendo dal LSB. I dati vengono codificati e decodificati usando il metodo NRZI (Non Return to Zero Inverted – rappresenta i cambiamenti di stato logico con “1” e la permanenza di uno stato logico con “0”).


Esistono alcuni tipi di segnali sul bus, individuati come casi speciali:

Physical Layer - Serial Interface Engine (SIE)

La SIE è il modulo fisico presente nell’host e nei devices responsabile della serializzazione e deserializzazione (conversione dello stream di dati seriale in uno parallelo) delle trasmissioni USB.
Codifica i dati in uscita secondo la logica NRZI e decodifica i dati in ingresso.
Genera il codice di controllo CRC (Cyclic Redundancy Check) per gli stream in uscita e verifica il CRC degli stream in ingresso.

Rivela il PID (packet’s id – è un campo nel pacchetto USB che individua il tipo di dato) così come i segnali SOP, EOP, RESET e RESUME sul bus.


Physical Layer - Host Controller (HC)

L’HC è l’elemento hardware più importante del sistema USB, colui che inizia tutte le transazioni, controlla gli accessi ed è il motore principale di controllo del flusso. Le sue funzioni fondamentali sono:

Protocol Engine Layer

È lo strato intermedio nel modello di comunicazione. Si occupa della traduzione dei dati tra applicazioni (software dell’host e funzioni della periferica) e il protocollo USB. Assume denominazione diversa a seconda che sia riferito all’host USB (USB System Software) o alla periferica USB (USB Logical Driver)


Protocol Engine Layer - USB System SW

Il sistema software USB è responsabile dell’allocazione della larghezza di banda, della gestione dell’energia fornita al bus oltre all’abilitazione delle periferiche per l’accesso al bus. Si compone di:


Protocol Engine Layer - USB Logical Device

È composto da un insieme di endpoints indipendenti: Ad ogni endpoint è dato un indirizzo unico (endpoint number) in fase di progetto e anche l’USB logical device è unicamente indirizzato alla fine dell’enumeration process. La combinazione di questi indirizzi e della direzione dei dati (da o per l’endpoint), caratterizza completamente l’endpoint.

Tutte le periferiche USB devono supportare la comunicazione con il default pipe, il quale gioca un ruolo importante nel processo di enumerazione ed è l’unico canale di comunicazione al device nel momento del collegamento. Il default pipe è associato all’endpoint zero, che è l’unico in grado di performare comunicazione bidirezionale.


Application Layer

Lo strato applicazioni è costituito dal client software per quanto riguarda l’host e dalle funzioni dal lato device. Il client software gestisce le interfacce trasferendo dati dal suo buffer agli endpoint associati alle interfacce stesse. Il client software lavora con una specifica funzione di una periferica, indipendentemente dalle altre funzioni della periferica nel sistema.


Il protocollo USB

Le transizioni USB avvengono tramite pacchetti. Ogni transizione è composta da tre fasi:

USB usa un polling protocol: ogni volta che l’host vuole ricevere dati da una periferica le invia un token;

- se la periferica ha dati da inviare li invia e l’host risponde con un pacchetto di handshake.
- se la periferica non ha dati da inviare, l’host emette un token verso la periferica successiva.
- se l’host vuole inviare dati ad una periferica, le invia prima un token appropriato e il successivo pacchetto di dati. La periferica risponde con un pacchetto di handshake.


Ci sono quattro tipi fondamentali di trasferimento USB:



Il protocollo USB - Formato dei campi del pacchetto

Differenti campi dei pacchetti sono:

IMM8


Il protocollo USB - Formato dei campi del pacchetto – PID1

Il PID si divide in tre gruppi principali:


Il protocollo USB -Formato dei campi del pacchetto - Address Field

Il campo di indirizzo è diviso in due campi:


Il protocollo USB - Formato dei campi del pacchetto -Frame Number Field

E' composto da 11 bit che indicano il numero del frame corrente. Il campo è contenuto solo nei token SOF che indicano l’inizio del frame Data field: contiene il dato trasmetto nella transizione. Può contenere un massimo di 1023 bytes.

CRC field: è usato per proteggere tutti i campi e i dati di un pacchetto (tranne il campo PID). È composto da 5 bit in un token packet e da 16 bit in un data packet.


Formato dei pacchetti

I vari formati dei pacchetti sono:






Formato delle transazioni - Control transfer

Il controllo dei trasferimenti si compone di due o tre fasi: setup, data (opzionale) e status, ognuna delle quali è composta da token, data, handshake.

Comandi di setup:



All’inizio di un operazione di setup, l’host emette un SETUP token, seguito da un pacchetto di comando setup. La periferica risponde con un pacchetto ACK. Successivamente, il flusso dei dati viene emesso nella direzione indicata nel stage precedente. Possono essere eseguite più transazioni (IN o OUT, ma tutte nella stessa direzione), ognuna delle quali inizia con un IN/OUT token emesso dall’host e termina con l’emissione dell’eventuale handshake. Lo status stage riporta i risultati dei precedenti stage all’host.


Esempio di control Transfer





Formato delle transazioni - Bulk Transfer

La transazione si compone di tre fasi:

I trasferimenti di massa sono altamenti affidabili grazie ai meccanismi di handshake e timeout Se ci sono problemi nel sistema USB, l’host li individua e previene il blocco del sistema.


Esempio di trasferimento di tipo Bulk in OUT




Formato delle transazioni - Interrupt Transfer

È un metodo di trasferimento simile al bulk transfer.

L’host che vuole conoscere lo stato di un interrupt, invia un IN token all’appropriato endpoint.
Se ci sono interrupt in attesa, la funzione invia dettagli a riguardo. L’host risponde con un segnale di

ACK se il trasferimento ha avuto esito positivo. Se non ci sono interrupt in attesa, la funzione restituisce un NAK packet. Nel caso di errore nella funzione sarà inviato uno STALL packet. L’host invia un OUT token nel caso in cui vuole trasmettere dati alla periferica, seguito dal pacchetto di dati. Se il trasferimento è corretto l’host riceve un ACK o NAK o STALL packet. Se ci sono errori, non viene inviato handshake.


Esempio di trasferimento di tipo Interrupt




Formato delle transizioni - Isochronous Transfer

I trasferimenti isocroni sono composti da una o più fasi di transizione. L’host emette un IN token prima di ricevere dati dalla periferica, o un OUT token prima di inviare dati. Avviene l’emissione o la ricezione dei dati in base a quanto specificato precedentemente. Non esiste fase di handshake in questo tipo di trasferimento.


Esempio di trasferimento di tipo Isocrono




I contenuti di questa pagina sono in parte una traduzione del seguente sito: http://www2.rad.com/networks/2000/usb/maintxt.htm#USB_Communication_Layers