Ha tutto a che fare con l'arbitrato. Qualsiasi sistema che richiede la connessione di più dispositivi ha bisogno di un modo per determinare chi dovrebbe parlare quando. Esistono diversi schemi come ci si aspetterebbe a seconda dell'applicazione.
Un esempio comune: nel networking abbiamo molti nodi che parlano tra loro. Questo viene fatto da ciascun nodo che ha un indirizzo (es. Indirizzo IP) e quando un nodo vuole parlare con un altro nodo, invia un pacchetto a quell'indirizzo. Quindi hai dispositivi come router che accettano pacchetti che arrivano su più porte e li inoltrano alla porta corretta. L'arbitrato viene eseguito utilizzando la memoria per archiviare i pacchetti fino a quando la porta di destinazione è libera.
Ora su USB. Questo è in realtà molto più semplice della rete perché non tutti i nodi sono uguali. Hai due tipi, un host e un endpoint. Esiste sempre un solo host, ma possono esserci molti endpoint. In questo caso l'arbitrato è molto più semplice perché solo la porta host può parlare a piacimento. Gli endpoint possono parlare solo quando richiesto dall'host e l'host parla sempre e solo con un endpoint alla volta.
Per i pacchetti host-> endpoint, gli hub USB passano semplicemente la richiesta dall'host a tutti gli endpoint. Poiché tutti gli endpoint hanno un indirizzo, solo quello a cui è stata indirizzata la richiesta farà qualcosa con esso (es. Risposta), tutti gli altri ignoreranno il pacchetto.
Per i pacchetti host endpoint->, l'host invia prima un pacchetto a un endpoint specifico tramite l'indirizzo per dire "ora puoi parlare", quindi quell'endpoint deve inviare immediatamente una risposta. Poiché solo un endpoint è autorizzato a parlare in qualsiasi momento, l'hub USB instraderà semplicemente il pacchetto da qualsiasi porta risponde a una richiesta dall'host.
In termini di come l'host determina quali dispositivi sono collegati e in che modo l'endpoint ottiene il proprio indirizzo, ciò viene ottenuto tramite l'enumerazione.
Tutte le porte host e hub hanno resistenze pull-down (15kOhm) sulle linee D + e D-. Questi mettono le linee dati di quella porta in uno stato noto quando non è collegato alcun dispositivo, uno stato in cui la porta non invierà alcun dato su linee D + / D-.
Quando un dispositivo è collegato, si fa conoscere collegando la linea dati D + (piena velocità) o D- (bassa velocità) a VCC utilizzando una resistenza da 1,5 kOhm. Ciò attiva un evento di enumerazione. La porta inizierà quindi il processo di configurazione del dispositivo e di assegnazione di un indirizzo. Se si collegassero due dispositivi contemporaneamente, verranno elencati uno alla volta .
Se non ci sono hub, l'host comunica semplicemente con il nuovo dispositivo e lo configura. Se ci sono hub nel sistema, è l'hub che segnala che il nuovo dispositivo è collegato . Se un hub segnala che è collegato un nuovo dispositivo, l'host indicherà all'hub di ripristinare il nuovo dispositivo e avviare le comunicazioni. Durante il ripristino, all'endpoint viene assegnato un indirizzo predefinito di 0 (*). L'host può quindi comunicare con l'endpoint utilizzando l'indirizzo predefinito e configurarlo con un indirizzo univoco diverso da zero che gli consentirà di sapere quando viene parlato.
(*) Poiché viene mai elencato un solo dispositivo alla volta, l'indirizzo 0 sarà sempre univoco per il dispositivo appena collegato.
Potresti quindi chiedere "bene come posso avere più dispositivi che parlano tutti contemporaneamente?". Supponi di avere un mouse, una tastiera e un'unità flash collegati allo stesso hub USB. Sappiamo tutti che puoi usare il mouse e la tastiera contemporaneamente copiando anche i file da / verso la tua unità flash, ma se solo un dispositivo può parlare alla volta, come può essere possibile?
Bene, tutto si riduce al fatto che le poche centinaia di millisecondi necessari al tuo cervello per notare che hai premuto un tasto e ti aspetti che lo schermo si aggiorni è un'eternità per il computer. Un'interfaccia USB 2.0 può funzionare fino a 480 Mbps (USB 3.1 può funzionare fino a 10 Gbps!), Il che significa che anche se l'host parla sempre e solo con un endpoint in un dato momento, scorre tra di loro così velocemente che puoi dire che lo sta facendo.
Host USB: "Ehi, mouse sulla porta 1, dimmi se ti sei spostato. Ok ora tastiera sulla porta 2 hai qualche tasto premuto per segnalare? Ora sei lì sulla porta 3, unità flash, memorizzare questi dati per me. Qualcun altro con cui devo parlare? No, ok allora, mouse sulla porta 1, dimmi se ti sei trasferito ... "
Umano: "Oh guarda, il computer ha notato che ho appena spostato il mouse, premuto un tasto sulla tastiera e copiato un'immagine sull'unità flash, tutto allo stesso tempo!"
Il dispositivo host tiene traccia di quali indirizzi endpoint vengono utilizzati e invierà pacchetti a ciascuno in sequenza o secondo necessità (ovvero quando il sistema operativo richiede l'accesso a un dispositivo specifico). Quindi, mentre non accade tutto simultaneamente, l'arbitrato è così veloce che i computer non riescono a capire la differenza.