Tudo tem a ver com arbitragem. Qualquer sistema que exija a conexão de vários dispositivos precisa de alguma maneira de determinar quem deve falar quando. Existem esquemas diferentes, como seria de esperar, dependendo da aplicação.
Um exemplo comum - em redes, temos muitos nós conversando entre si. Isso é feito por cada nó com um endereço (por exemplo, endereço IP) e, quando um nó deseja conversar com outro nó, ele envia um pacote para esse endereço. Você tem dispositivos como roteadores que aceitam pacotes que entram em várias portas e os encaminham para a porta correta. A arbitragem é feita usando a memória para armazenar pacotes até que a porta de destino esteja livre.
Agora para USB. Na verdade, isso é muito mais simples que a rede, porque nem todos os nós são iguais. Você tem dois tipos, um host e um terminal. Existe apenas um host, mas pode haver muitos pontos de extremidade. Nesse caso, a arbitragem é muito mais fácil, porque somente a porta do host pode falar à vontade. Os pontos de extremidade só podem conversar quando solicitados pelo host , e o host só fala com um ponto de extremidade por vez.
Para pacotes host-> endpoint, os hubs USB simplesmente passam a solicitação do host para todos os endpoints. Como todos os pontos de extremidade têm um endereço, apenas aquele para o qual a solicitação foi endereçada fará alguma coisa com ele (por exemplo, responder), todos os outros irão ignorar o pacote.
Para pacotes de endpoint-> host, o host envia primeiro um pacote para um endpoint específico por endereço para dizer "você pode falar agora" e, em seguida, esse endpoint deve enviar imediatamente uma resposta. Como apenas um ponto de extremidade pode falar a qualquer momento, o hub USB simplesmente encaminha o pacote a partir de qualquer porta que responda a uma solicitação do host.
Em termos de como o host calcula quais dispositivos estão conectados e como o terminal obtém seu endereço, isso é alcançado através da enumeração.
Todas as portas do host e do hub têm resistores pull-down (15kOhm) nas linhas D + e D-. Eles colocam as linhas de dados dessa porta em um estado conhecido quando não há dispositivo conectado, um estado no qual a porta não envia nenhum dado sobre linhas D + / D-.
Quando um dispositivo é conectado, ele se torna conhecido conectando a linha de dados D + (velocidade máxima) ou D- (velocidade baixa) ao VCC usando um resistor de 1,5 kOhm. Isso dispara um evento de enumeração. A porta começará o processo de configuração do dispositivo e atribuição de um endereço. Se você conectar dois dispositivos simultaneamente, eles serão enumerados um de cada vez .
Se não houver hubs, o host simplesmente conversará com o novo dispositivo e o configurará. Se houver hubs no sistema, é o hub que informa que o novo dispositivo está conectado . Se um hub relatar que um novo dispositivo está conectado, o host instruirá o hub a redefinir o novo dispositivo e iniciar as comunicações. Durante a redefinição, o ponto final recebe um endereço padrão 0 (*). O host pode então conversar com o terminal usando o endereço padrão e configurá-lo com um endereço diferente de zero que permitirá saber quando está sendo conversado.
(*) Como apenas um dispositivo é enumerado por vez, o endereço 0 sempre será exclusivo do dispositivo recém-conectado.
Você pode então perguntar: "bem, como posso ter vários dispositivos todos falando ao mesmo tempo?". Digamos que você tenha um mouse, um teclado e uma unidade flash, todos conectados ao mesmo hub USB. Todos sabemos que você pode usar o mouse e o teclado ao mesmo tempo enquanto copia arquivos para / da sua unidade flash, mas se apenas um dispositivo pode falar por vez, como isso é possível?
Bem, tudo se resume ao fato de que as poucas centenas de milissegundos necessários para o seu cérebro perceber que você pressionou uma tecla e espera que a tela seja atualizada é uma eternidade para o computador. Uma interface USB 2.0 pode ser executada em até 480 Mbps (USB 3.1 pode ser executada em até 10 Gbps!), O que significa que, embora o host esteja apenas conversando com um ponto de extremidade a qualquer momento, alterna entre eles tão rápido que você pode diga que está fazendo isso.
Host USB: "Ei, mouse na porta 1, diga-me se você se mudou. Ok, agora teclado na porta 2 você tem alguma tecla pressionada para relatar? Agora você está na porta 3, unidade flash, armazene esses dados para mim. Mais alguém com quem eu precise conversar? Não, ok então, mouse na porta 1, me diga se você se mudou ... "
Humano: "Olha, o computador percebeu que eu apenas movi o mouse, pressionei uma tecla do teclado e copiei uma imagem para a unidade flash, tudo ao mesmo tempo!"
O dispositivo host monitora quais endereços de endpoint são usados e enviará pacotes para cada um sequencialmente ou conforme necessário (ou seja, quando o sistema operacional solicitar acesso a um dispositivo específico). Portanto, embora nem tudo esteja acontecendo simultaneamente, a arbitragem é tão rápida que os computadores que são humanos de animais não podem dizer a diferença.