De alguma forma, eu precisava de um hub por um longo tempo, de preferência com um grande número de portas e com um formato bastante conveniente, adequado para incorporação em vez de uma unidade de disquete no compartimento de 3,5 ''. Uma rápida olhada no mercado de pulgas lançou o modelo D-link DUB-H7, e mesmo na combinação de "2 pelo preço de 1". A inspeção externa não deu nada de especial, o hub como um hub foi feito de maneira sólida, a principal "impressora" USB AM-BM na parte traseira e uma fonte de alimentação 3 A. Como sempre, a primeira coisa que resolvi foi o prazer de um pequeno número de lugares vazios em vez de elementos, juntamente com solda de alta qualidade e acalmados. É verdade que, por via das dúvidas, fui à Internet para ver que tipo de hub era e se havia algum projeto interessante com sua participação. Não houve projetos, análises de usuários 50/50, em geral, nenhuma dinâmica. O hub por 5-7 anos funcionou razoavelmente bem e executou sua tarefa, depois foi movido suavemente para a lixeira eletrônica e, possivelmente, teria desaparecido como resultado, juntamente com adaptadores, adaptadores etc. desconhecidos. Mas aconteceu um evento na minha vida que me fez remexer em sacos com lixo velho, encontrar esse, como se viu, um D-link único e sacudir a poeira para extraí-lo para a luz de Deus. Se você estiver interessado em ouvir o porquê, então seja bem-vindo ao corte.

Introdução ou choro sobre os fabricantes gananciosos de hubs usb
Com o advento de roteadores SoC pequenos e convenientes (como o Guia para modificar o clone do popular mini-roteador chinês Hame A15, que também é “A5-V11 sem marca” ), e a introdução generalizada de openwrt para gerenciar dispositivos host (na grande maioria) casos, são dispositivos conectados via USB), a tarefa de controlar a fonte de alimentação de todos os tipos de modems, leitores de cartões, conversores usb-rs232 etc. torna-se uma tarefa muito urgente.A necessidade de controlar a porta ao trabalhar com o GSM-mo é mais comum emami (para reiniciar, por exemplo). Em princípio, o povo já tomou decisões suficientes. Para esses fins, desde o uso de pinos GPIO gratuitos no roteador até relés prontos. Existem soluções de fabricantes de terceiros. Este é, por exemplo, um hub USB programável para 4 portas do Acroname , rico em software e hardware, mas custa cerca de US $ 300.
Existe uma opção mais barata, um hub inteligente selecionável com o belo nome Yupkit YKUSH por apenas 35 €:
Os mais econômicos podem usar um monte de hub usb mais barato, relé de 5V normalmente fechado, e qualquer um do Arduino-k para desconectar a energia da porta usb, se necessário. O custo dessa solução é <$ 10, excluindo o tempo gasto na soldagem e programação do Arduino.
Parece um beco sem saída. Caro e bonito, ou simplesmente liso e arrogante . Mas aconteceu que existe uma terceira opção. Além disso, a solução é antiga, como a especificação USB 2.0 para hubs nos quais é descrita.
Trechos das especificações relacionadas ao gerenciamento de energia USBOs hubs de alimentação automática podem ter interruptores de energia que controlam a entrega de energia a jusante nas portas, mas isso não é necessário. Os hubs alimentados por barramento precisam ter interruptores de energia. Um hub com comutadores de energia pode alternar energia para todas as portas como um grupo / grupo, para cada porta individualmente ou ter um número arbitrário de grupos de uma ou mais portas. Um hub indica se ele suporta ou não a comutação de energia pela configuração do campo Logical Power Switching Mode em wHubCharacteristics. Se um hub suportar comutação de energia por porta, a energia de uma porta será ligada quando uma solicitação SetPortFeature (PORT_POWER) for recebida para a porta. A energia da porta é desligada quando a porta está nos estados Desligado ou Não configurado. Se um hub suportar comutação de energia em grupo, a energia de todas as portas em um grupo será ativada quando qualquer porta em um grupo receber uma solicitação SetPortFeature (PORT_POWER). A energia para um grupo não é desligada, a menos que todas as portas de um grupo estejam nos estados Desligado ou Não configurado.
...
Embora um hub com alimentação própria não seja necessário para implementar a comutação de energia, o hub deve suportar o estado Desligado para todas as portas. Além disso, o hub deve implementar o PortPwrCtrlMask (todos os bits configurados para 1B), mesmo que o hub não possua interruptores de energia que possam ser controlados pelo USB System Software.
Traduzindo para o russo, verifica-se que o padrão USB já define a capacidade de controlar a energia da porta usando o chamado Comutação de energia por porta (PPPS) , mas atender a um dispositivo compatível com esse recurso não é apenas difícil, mas muito difícil. Para implementar o PPPS-funcional, são necessários componentes adicionais (transistores de efeito de campo e fiação), que não são instalados nos hubs para economizar dinheiro.
Reagindo sensivelmente às demandas do mercado, alguns fabricantes indicam a função PPPS nas especificações dos hubs, mas, na realidade, isso não vai além da inscrição na caixa. E, basicamente, é difícil encontrar falhas, porque muitos chips dentro dos hubs suportam essa função, mas é impossível implementá-la sem comutadores adicionais (transistores) (na maioria das vezes as portas USB estão diretamente conectadas à linha + 5V).
Até desmontei vários pequenos hubs USB que planejava usar junto com o roteador A5-V11. Dentro estavam: o chip GL850G e o amado pelos FE1.1s chineses. Naturalmente, apenas os próprios controladores com um mínimo de detalhes foram encontrados no interior. Devido ao tamanho miniatura da placa, é difícil colocar um transistor e as peças que se uniram a ela, mesmo com uma instalação articulada. Eu tive que me acalmar. Embora, dependendo do chip, se na folha de dados houver uma menção à detecção de sobrecorrente e controle de potência individual ou agrupado , é possível realizar uma operação inteligente de um dispositivo desse tipo, de acordo com o método descrito no artigo . Um amigo usou uma combinação de transistor e vários resistores para ativar a função PPPS em seu hub.
Esquema de alteração e aparência do dispositivo Além disso, lendo a documentação, você se surpreende com o fato de que não há, não, e há uma menção de que o modo de controle de porta pode ser implementado adicionando-se ao circuito algumas AIC1526-0 ou MIC2026 (comutador de distribuição de energia de canal duplo).
Esquemas de folhas de dados não deixarão de mentir Parte do principal ou chegar ao ponto
Oprimido por pensamentos sombrios sobre a compra de hubs chineses com funcionalidades desconhecidas ("um porco na hora") e a impossibilidade de verificá-los preliminarmente, encontrei inadvertidamente um artigo sobre como configurar o openwrt para controlar o poder de um hub USB; além disso, o mesmo, abandonado e esquecido D-Link DUB-H7 em uma caixa cinza.
Depois de estudar o material, ficou claro que a bordo do hub, além do controlador Philips ISP1521BE bastante avançado, há um monte desses mesmos comutadores de distribuição de energia de canal duplo AIC1528-0 para comutação de potência total. Embora a julgar pela folha de dados, um chip com um kit mínimo de corpo possa controlar a potência das portas downstream (e também há muitas coisas que não foram implementadas lá, por exemplo, indicando a atividade da porta upstream usando a tecnologia GoodLink ou um host USB 1.1 para suportar corretamente uma mistura de 2.0 e 1.1 em portas a jusante, etc. etc.).
A propósito, para quem decide repetir meu caminho, direi imediatamente que as versões modernas do D-Link DUB-H7 (em um estojo preto brilhante) não são mais tão úteis quanto as antigas em cinza.
De acordo com as informações do wikidevi.com ( 1 , 2 , 3 , 4 ), há várias revisões deste hub, com um conjunto diferente de componentes a bordo e de acordo com diferentes funcionalidades (A1 / A5 - ISP1521BE 7 portas, B1-2xGL854G 4 portas, C1 - 2xGL850Z de 4 portas).
Também é dada atenção ao D-Link DUB-H7 porque, além de sua boa funcionalidade, é também a opção mais acessível (em termos de preço e prevalência) em nossa área. Dos modelos que podem ser mencionados ao longo do caminho com "comutação de energia por porta", também podemos observar, por exemplo, o seguinte:
- Linksys USB2HUB4 Hub USB 2.0.
- Hub D-Link DFB-H7 Combo
- Elecom U2H-G4S
- Sanwa Supply USB-HUB14GPH
- Targus Inc. PAUH212
- Hawking Technology UH214
Não tive a chance de procurar os dispositivos mencionados, porque tive sorte com a versão de revisão A5. A verdade é que agora, se eu tivesse que comprar um hub desse tipo, tentaria encontrar a revisão B1 , porque, além de controlar a potência das portas, o chip no qual ele é construído (GL854G) tem algo como o Multi Transaction Translator .
A importância de ter o MTT (Multi Transaction Translator) em um hub USB
Uma pequena digressão para explicar o que é esse Multi Transaction Translator (MTT) e por que é tão importante e necessário. Um transmissor de transações (TT) é um componente importante de qualquer hub de alta velocidade que fornece comunicação entre as portas upstream e downstream de um hub, especialmente quando essas portas operam com taxas de dados diferentes. De fato, o TT separa os dispositivos de baixa e média velocidade dos de alta velocidade (puramente USB 2.0, por exemplo) e é responsável por trabalhar nas velocidades USB 1.1.
O transmissor de operação pode ser de dois tipos - único (tradutor de transação única, STT) ou múltiplo (tradutor de transação múltipla, MTT). No caso do STT, um transmissor é usado para todas as portas e, no caso do MTT, cada porta possui seu próprio transmissor. É claro que a primeira opção é mais barata e mais simples, de onde vem a principal desvantagem dessa opção - se várias portas USB 1.1 estiverem conectadas ao hub, todas elas funcionarão com um único gargalo. Eu acho que você pode imaginar o que acontecerá com a velocidade da troca.

Em termos simples, os hubs STT têm um limite no número de dispositivos que podem ser usados simultaneamente. Caso contrário, ele estará repleto de perda de pacotes devido a conflitos no planejamento da transferência de dados, sobrecarregando o hub (especialmente no caso de dispositivos que trocam dados ativamente, como placas de som), etc. Portanto, é melhor escolher um hub para focar imediatamente nos dispositivos com MTT e não procurar a causa da instabilidade no trabalho. Se você já possui um hub, e infelizmente o mesmo aconteceu com o STT, basta verificar cuidadosamente os padrões dos dispositivos conectados ao hub e, se possível, reduzir o número de USB 1.1 conectado a um.
Infelizmente, a grande maioria dos hubs de baixo custo construídos com chips de orçamento (fe1.1s, GL850G e ISP1521BE do meu hub A5) possui STTs a bordo, mais caros e avançados (GL852G, GL854G (revisão B1 do D-link DUB-H7 em discussão), GL3520, VL812, VL813, SMSC USB2514) estão executando o MTT.
Você pode verificar o tipo de transmissor de operação lendo a folha de dados no chip (mas geralmente os chineses não podem ou não querem dizer a marca do chip) ou conectando o hub ao computador * nix e executando o comando lsusb -v e localizando informações de um serviço relacionado ao hub em estudo (por nome). A linha DeviceProtocol indicará TT simples ou Multi TT . É claro que comprar é melhor apenas com o Multi :)
Descrição das características do hub emitidas pela equipe lsusbDispositivo 005 do barramento 001: ID 2001: f103 D-Link Corp. Hub DUB-H7 USB 2.0 de 7 portas
Não foi possível abrir o dispositivo, algumas informações estarão ausentes
Descritor de dispositivo:
bComprimento 18
bDescriptorType 1
bcdUSB 2.00
Hub bDeviceClass 9
bDeviceSubClass 0 Não utilizado
bDeviceProtocol 1 Single TT
bMaxPacketSize0 64
idVendor 0x2001 D-Link Corp.
idProduct 0xf103 Hub DUB-H7 USB 2.0 de 7 portas
bcdDevice 1.00
iManufacturer 0
iProduct 0
iSerial 0
bNumConfigurations 1
Descritor de configuração:
bComprimento 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Auto-alimentado
Ativação remota
MaxPower 0mA
Descritor de Interface:
bComprimento 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
Hub bInterfaceClass 9
bInterfaceSubClass 0 Não utilizado
bInterfaceProtocol 0 Hub de velocidade total (ou raiz)
iInterface 0
Descritor de ponto final:
bComprimento 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Interrupção do tipo de transferência
Tipo de sincronização nenhum
Dados do tipo de uso
wMaxPacketSize 0x0001 1x 1 bytes
bInterval 12
Quando você executa o comando lsusb -v -t , pode ver uma estrutura hierárquica bastante dos dispositivos usb conectados.

Em vez de lsusb, você pode usar o utilitário hwinfo com a opção --usb (é aconselhável pré -instalá- lo através do sudo apt-get install hwinfo ). Em seguida, a saída de informações sobre dispositivos USB será um pouco diferente:
Informações emitidas por hwinfolab @ lab-G: ~ $ hwinfo --usb
Hub 23: USB 00.0: 10a00
[Criado em usb.122]
ID exclusivo: zFuK.sOcBcpBDhs4
ID do pai: k4bc.9T1GDCLyFd9
ID do SysFS: /devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8:1.0
SysFS BusID: 1-8: 1.0
Classe de hardware: hub
Modelo: "Hub USB 2.0 D-Link DUB-H7 de 7 portas"
Hotplug: USB
Fornecedor: usb 0x2001 "D-Link"
Dispositivo: usb 0xf103 "DUB-H7 7 portas USB 2.0 hub"
Revisão: "1.00"
Driver: "hub"
Módulos de driver: "usbcore"
Velocidade: 480 Mbps
Alias do módulo: "usb: v2001pF103d0100dc09dsc00dp01ic09isc00ip00in00"
Status da configuração: cfg = new, avail = yes, need = no, active = unknown
Anexado a: # 21 (Hub)
Em geral, descobrimos brevemente os recursos dos dispositivos de baixa velocidade e agora é hora de passar para a parte do software.
Gerenciar a energia da porta USB
Direi imediatamente que não consegui encontrar uma maneira de implementar a funcionalidade PPPS em um ambiente Windows (pelo menos por interesse inativo). O máximo é ativar / desativar o dispositivo usando o utilitário devcon . Ficarei feliz se um dos leitores corrigir e suplementar. Enquanto isso, todos os procedimentos são executados no exemplo do Ubuntu (no caso do openwrt - o algoritmo é semelhante, embora no último tronco já deva ser incluído na "distribuição").
Portanto, a possibilidade de comutação de energia por porta (PPPS) ou "comutação de energia de porta" é implementada em hubs com suporte de hardware para essa função usando o programa hub-ctrl ou seu uhubctrl descendente. Vou considerá-los por sua vez.
Hub-ctrl
O programa foi escrito pelo engenheiro de combate da independência japonesa Niibe Yutaka em 2006. Mas funciona sem problemas agora. Para instalação, precisamos de qualquer biblioteca * nix e libusb-dev . Para o Ubuntu 16.04 LTS, o algoritmo é o seguinte:
Instale add. pacotes: sudo apt-get update && sudo apt-get install libusb-dev git gcc
Fonte do download: git clone https://github.com/codazoda/hub-ctrl.c
Compilado com o gcc: cd hub-ctrl.c && gcc -o hub-ctrl hub-ctrl.c -lusb
Se o endereço não estiver disponível, você poderá baixar manualmente as fontes daqui ou daqui e compilar com o comando descrito acima.
O programa possui uma sintaxe de linha de comando bastante simples que se encaixa na seguinte descrição:
./ hub-ctrl [{-h HUBNUM | -b BUSNUM -d DEVNUM}] \ [-P PORT] [{-p [VALUE] | -l [VALUE]}]
em que HUBNUM - número do hub, número do barramento BUSNUM, número do dispositivo DEVNUM, número da porta PORT
Para descobrir esses parâmetros, basta executar o comando lsusb :

A propósito, o programa hub-ctrl pode atuar como uma espécie de "sonda" do hub usb pelo fato de ter a capacidade de gerenciar a energia da porta. É suficiente executá-lo com a opção -v. Temos uma lista de hubs suportados disponíveis no sistema (linha INFO) e o status da porta (no meu caso, todas as portas estão desativadas).
lab @ lab-G: ~ / hub $ sudo ./hub-ctrl -v
Eixo # 0 às 00: 006
INFO: comutação de energia individual.
AVISO: Os indicadores de porta NÃO são suportados.
Status da porta do hub:
Porta 1: 0000.0000
Porta 2: 0000.0000
Porta 3: 0000.0000
Porta 4: 0000.0000
Porta 5: 0000.0000
Porta 6: 0000.0000
Porta 7: 0000.0000
E é assim que a configuração ficará quando todas as portas estiverem ativadas:
lab @ lab-G: ~ / hub $ sudo ./hub-ctrl -v
Eixo # 0 às 00: 006
INFO: comutação de energia individual.
AVISO: Os indicadores de porta NÃO são suportados.
Status da porta do hub:
Porta 1: energia 0000.0100
Porta 2: energia 0000.0100
Porta 3: energia 0000.0100
Porta 4: energia 0000.0100
Porta 5: energia 0000.0100
Porta 6: energia 0000.0100
Porta 7: energia 0000.0100
Para habilitar qualquer uma das portas, é necessário executar o comando sudo ./hub-ctrl -h 0 -P 1 -p 1 , em que -h indica qual hub estamos usando (o 0º no meu caso), -P diz qual porta (1- porta no meu caso) e -p indica o status (0 desativado, 1 ativado).

Para obter a configuração como na figura acima, foi necessário executar os seguintes comandos sequencialmente (para portas inicialmente desativadas):
sudo ./hub-ctrl -h 0 -P 2 -p 1
sudo ./hub-ctrl -h 0 -P 4 -p 1
sudo ./hub-ctrl -h 0 -P 6 -p 1
Portanto, não é difícil escrever um script que faça com que os LEDs pisquem por diversão na sequência desejada. Exemplos de tais coisas já existem e funcionam com sucesso:
Código Morse em um hub USB, guirlandas de Natal , etc. etc. Para mim, pelos recursos do hub-ctrl, a função de comutação cíclica não foi suficiente para realizar minhas fantasias momentâneas de iluminação (para não perder tempo escrevendo um script etc.). Essa falha irritante é eliminada no sucessor - uhubctl.
UHUBCTL
O programa uhubctl é um analógico hub-ctrl otimizado e possui algumas diferenças estéticas (e, é claro, suporta mais dispositivos).
Teoricamente, o utilitário pode ser compilado para ser executado em um ambiente Windows, mas ... Mas, por enquanto, ele interage com os utilitários por meio do driver winusb.sys, que não pode acessar o hub diretamente. O programa também reivindica suporte para USB 3.0 (hubs USB 3.0 que suportam comutação de energia por porta, a propósito, são muito mais que hubs USB 2.0 com funcionalidade semelhante). Ao trabalhar com um hub USB 3.0 conectado a uma porta upstream USB 3.0, o programa o define como dois hubs virtuais independentes: USB 2.0 e USB 3.0, e os próprios dispositivos USB serão conectados a um deles, dependendo de seus recursos e velocidade de conexão . Assim, para gerenciar esses dispositivos, o programa habilita / desabilita a energia de hubs virtuais por padrão (você pode alternar o utilitário para o modo manual adicionando a opção -e ao comando start).
Importante: o sistema de endereçamento para portas USB pode causar alguma confusão (é semelhante para hub-ctrl e uhubctl). Ao trabalhar, ele usa o mesmo método de endereçamento semelhante ao do kernel do Linux: bx.yz, em que b é o número do barramento USB e x, y, z são os números de porta da cadeia de hosts, começando no hub USB raiz desse barramento. Se houver mais de um hub USB gerenciado, você poderá determinar as opções corretas executando uhubctl com a opção -l (local). Observo que esse endereçamento é semi-estável - não será alterado se você desconectar e reconectar dispositivos USB novamente à mesma porta física.
O algoritmo de compilação do programa é semelhante ao algoritmo para hub-ctrl. A única exceção é que você precisa instalar a biblioteca libusb-1.0 (versão 1.0.12 ou posterior) com o comando usual sudo apt-get install libusb-1.0-0-dev e compilar o binário com o comando make .
A sintaxe para iniciar o programa é a seguinte.
uhubctl -a off -p 2
Este comando desliga a energia (-a off ou -a 0) na porta 2 (-p 2). Comandos off / on / cycle suportados (ou 0/1/2). O interruptor de ciclo desliga a energia, aguarda um pouco (determinado pelo interruptor -d) e liga-o novamente. I.e. Agora, o hub pode substituir facilmente o microcontrolador por piscar.
O que se segue de tudo isso, ou Conclusões
E daí resulta que o "segredo" no antigo hub da D-Link está lá. O uso da tecnologia descrita (PPPS) é justificado se você precisar controlar remotamente uma matriz de dispositivos conectados ao barramento USB. Além disso, esse método já é usado para desativar discos rígidos , webcams e modems GSM (como na figura):

Embora, como nos modems e no D-link DUB-H7 que mencionei, há pessoas que questionam a operacionalidade de um pacote desse tipo (ao trabalhar com o programa hub-ctrl).
A razão é que ..."... experimentos usando o Dlink DUB H-7 mostraram que o hub-ctrl -p 0 reduz a tensão apenas para 1,47V. No entanto, após inserir o modem em uma" porta desativada ", o LED não pisca, mas os arquivos / dev / ttyUSBx para isso . . ."
(lsusb, hwinfo, hub-ctrl) USB-, , . usb- ( ). , , . , , (D-link DUB-H7 ver. A5) . , , :)
PS -, D-link DUB-H7 .

( - )? RP1...RP2 ( 0- c).
: - EEPROM 24C02, :
Importante! Todas as atualizações e notas provisórias a partir das quais os artigos de habr são formados sem problemas podem agora ser vistas no meu laboratório de canais de telegrama66. Assine para não esperar o próximo artigo, mas para saber imediatamente sobre toda a pesquisa :)