Hubs, alimentação e compartilhamento de banda

Temos ainda a possibilidade de usar hubs USB para conectar vários dispositivos à mesma porta. Em teoria, cada porta USB permite a conexão de até 127 dispositivos, o que permite até mesmo ligar um hub USB no outro. O maior problema é que tanto a banda, quanto a energia fornecida pela porta são compartilhadas entre todos os periféricos ligados ao hub, de forma que dispositivos de mais alto consumo, como mouses ópticos e HDs externos (do tipo que usa a energia da porta USB, ao invés de uma fonte própria) podem não funcionar, dependendo de quais outros dispositivos estejam ligados ao hub.

A solução nesse caso é comprar um hub com fonte externa (também chamados de “powered hubs”). Eles possuem uma fonte própria de energia, que complementa a energia fornecida pela porta, permitindo o uso de mais periféricos simultâneos. Os powered hubs são relativamente raros, devido ao custo adicional da fonte, mas muitos hubs incluem a porta para alimentação externa, suportando o uso de um carregador de celular.

30e514a2

No USB, os 12 ou 480 megabits de banda não são compartilhados entre as portas. Cada par de portas (ligadas a um controlador dedicado na placa mãe) equivale a um barramento próprio, independente dos demais. O compartilhamento ocorre apenas quando as duas portas dentro do par são usadas simultaneamente, ou quando vários dispositivos são plugados na mesma porta, através de um hub.

Algumas combinações podem ser um pouco problemáticas, já que temos tanto dispositivos que transmitem grandes volumes de dados (um HD externo, por exemplo) quanto dispositivos que transmitem um volume pequeno, mas precisam de urgência, como o teclado e o mouse. Você não gostaria que o mouse ficasse com as respostas lentas ao salvar um grande arquivo no HD externo, por exemplo. Prevendo isso, o USB suporta três modos de operação distintos, chamados de interrupt (interrupção), bulk (grande volume) e isochronous (isocrônico).

O modo de interrupção é um modo de alta prioridade, destinado a teclados, mouses e outros dispositivos de entrada. O controlador reserva 10% da banda disponível para eles, mantendo sempre um canal descongestionado.

O modo isocrônico é destinado a dispositivos que precisam transmitir dados via streaming, como, por exemplo, caixas de som e headsets USB. Eles transmitem um volume relativamente pequeno de dados, mas também precisam de uma certa prioridade.

Finalmente, temos as transferências em modo bulk, onde temos grandes pacotes de dados, transmitidos com baixa prioridade (como no caso do HD externo). Como os canais para os outros dois modos são reservados primeiro, as grandes transferências podem ser feitas utilizando a banda disponível, sem atrapalhar os outros dispositivos.

Essa política de uso de banda é similar à utilizada em redes, onde os dados são transmitidos na forma de frames ou pacotes. Isso permite que dispositivos USB 1.1 sejam conectados em portas USB 2.0 sem reduzir a velocidade para outros dispositivos conectados na mesma porta. O controlador simplesmente disponibiliza 12 megabits para o dispositivo USB 1.1 e continua disponibilizando o restante da banda para os demais dispositivos.

Outra característica interessante do USB é a capacidade de enumerar e reconhecer novos dispositivos, coisa que não existia na época das portas seriais. Detectar mouses ou modems seriais era um pesadelo para qualquer programador, já que não existia uma simples de saber que tipo de dispositivo estava plugado na porta, ou mesmo se a porta estava sendo usada ou não.

A única forma era apelar para técnicas indiretas, enviando dados através da porta e tentando deduzir quem estava do outro lado a partir das respostas. É por isso que algumas distribuições Linux antigas pediam que você movimentasse seu mouse serial num certo ponto da instalação, para que ele pudesse ser detectado.

No USB as coisas funcionam de forma muito mais eficiente. O controlador percebe quando um dispositivo é conectado e envia um pacote de controle, que o dispositivo responde enviando uma série de informações, incluindo a classe, velocidade, fabricante, string de identificação e assim por diante.

Além de permitirem que o controlador reserve corretamente os recursos usados pelo dispositivo, essas informações são enviadas ao sistema operacional. Isso permite que o dispositivo seja ativado e o programa ou o aviso correspondente seja mostrado na tela. Aqui temos um exemplo de mensagens de kernel geradas por uma distribuição Linux ao plugar um joystick USB:

usb 1-3: new low speed USB device using ohci_hcd and address 3
usb 1-3: configuration #1 chosen from 1 choice
input: Logitech WingMan Precision USB as /class/input/input2
input: USB HID v1.10 Joystick [Logitech WingMan Precision USB] on usb-0000:00:02.0-3

As informações permitem também programar ações para quando determinados dispositivos são plugados. No caso do Linux, por exemplo, isso é feito através do udev, o daemon responsável por detectar mudanças no hardware e a conexão de novos dispositivos. É possível executar automaticamente um script de backup quando o HD externo é plugado, ou abrir um determinado jogo quando você pluga o joystick. O mais interessante é que as ações podem ser relacionadas com o código de identificação do dispositivo (que é único), de forma que o backup seja feito apenas ao plugar um HD específico, evitando que seus dados sejam copiados por engano quando um amigo plugar um pendrive, por exemplo. Falar sobre as regras do udev sai do escopo deste tópico, mas você pode aprender mais sobre elas no meu livro Linux Ferramentas Técnicas 2ª edição, ou através dos tutoriais disponíveis no site.

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X