USB ha diversi livelli, che sono descritti nelle specifiche USB 2.0 . Se hai familiarità con il modello di rete a strati OSI, puoi pensarlo in questo modo:
- Livello sessione = Capitolo 10 Hardware e software host USB (driver di dispositivo)
- Transport layer = Chapter 9 USB Device Framework
- Livello di rete = Capitolo 8 Protocol Layer (bitstream)
- Livello collegamento dati = capitolo 7 elettrico (circuito)
- Livello fisico = capitolo 6 meccanico (cavo e connettore)
Concettualmente l'USB si basa su flussi di dati, chiamati Endpoint , che possono essere IN (all'host) o OUT (dall'host). Ogni dispositivo ha Endpoint 0, che viene utilizzato per controllo e stato. Un dispositivo può avere endpoint aggiuntivi per i dati dell'applicazione. Ogni endpoint si comporta come un buffer FIFO.
I dati vengono trasferiti su un endpoint sia come Bulk (come TCP / IP, garantito che arrivano tutti i byte e nell'ordine corretto), sia Isochronous (come UDP / IP, garantito per essere aggiornato ma può eliminare i pacchetti). Esiste un tipo di trasferimento " Interrompi " fuorviante , che è in realtà appena sottoposto a polling dall'host.
USB 2.0 utilizza una coppia differenziale per datalink. Non entrerò nei dettagli poiché questo è coperto dal capitolo 7. Specifiche USB 2.0. Generalmente sul layout PCB trattiamo questo come una coppia differenziale di lunghezza abbinata e inseriamo i resistori di serie richiesti da qualunque USB PHY (Physical Interfaccia) in uso. La periferica USB utilizza un resistore di alto valore su una delle linee D + o D per segnalare all'host che si tratta di una periferica ad alta o bassa velocità.
Subito dopo che l'host USB ha scoperto che è presente un dispositivo, l'host richiede un gruppo di descrittori dal dispositivo. Questo è curato dietro le quinte dal chip FTDI. I descrittori sono descritti nel capitolo 9.5 . Questi includono dispositivo descrittore , Configurazione descrittore , interfaccia descrittori , Endpoint descrittori , String descrittori , forse anche HID Rapporto descrittori .
Il descrittore del dispositivo include i numeri USB VID (Identificazione del fornitore) e PID (Identificazione del prodotto). Il sistema operativo utilizza questa coppia di numeri, VID_PID, per determinare quale driver di dispositivo deve essere utilizzato per questo dispositivo. Nota che il numero VID viene rilasciato avendo l'appartenenza al forum degli implementatori USB, quindi questo è un problema se sei un singolo inventore.
Inoltre, esiste il driver di classe HID (Human Interface Device), che fornisce input piuttosto generico per tastiera / mouse / ecc., Nonché qualsiasi input / output generico. Un vantaggio di HID è che non richiede la fornitura di un driver di dispositivo personalizzato, ma la sua velocità effettiva è in qualche modo limitata rispetto a un driver di massa personalizzato. Esiste un altro documento di specifica sui descrittori HID; e un documento Tabella utilizzo HID che descrive in dettaglio tutti i numeri di codice che descrivono le varie funzioni disponibili su un determinato dispositivo con interfaccia umana.
Chip FTDI come il foglio dati FT220X fornisce il "motore di interfaccia seriale" USB (da non confondere con seriale SPI o seriale RS232). Questo si occupa della maggior parte delle cose di basso livello descritte nei capitoli 6, 7 e 8.
FTDI utilizza una EEPROM (offchip su FT2232H, on-chip su FT220X) per contenere un po 'delle informazioni contenute nei descrittori. È possibile personalizzare i valori VID / PID e fornire stringhe di descrizione personalizzate.