De alguna manera, necesitaba un concentrador durante mucho tiempo, preferiblemente con una gran cantidad de puertos y con una forma bastante conveniente, adecuada para incrustar en lugar de una unidad de disquete en la bahía de 3.5 ''. Un vistazo rápido al mercado de pulgas arrojó el modelo D-link DUB-H7, e incluso en la combinación de "2 por el precio de 1". La inspección externa no dio nada especial, el concentrador como un concentrador se hizo bien, la principal "impresora" USB AM-BM en la parte posterior y una fuente de alimentación de 3 A. Como siempre, lo primero que resolví fue alegrarme por un pequeño número de lugares vacíos en lugar de elementos, junto con una soldadura de alta calidad y calmados. Es cierto, por si acaso, fui a Internet para ver qué tipo de centro era y si había algún proyecto interesante con su participación. No hubo proyectos, las opiniones de los usuarios 50/50, en general, no dinámicas. El centro durante 5-7 años funcionó bastante bien y realizó su tarea, luego se trasladó sin problemas a la caja de basura electrónica y posiblemente habría desaparecido como resultado junto con adaptadores desconocidos, adaptadores, etc. Pero ocurrió un evento en mi vida que me hizo rebuscar en bolsas con basura vieja, encontrar este, como resultó, un enlace D único, y sacudir el polvo para extraerlo a la luz de Dios. Si estás interesado en saber por qué, entonces bienvenido a cortar.

Introducción o llanto sobre los codiciosos fabricantes de hubs usb
Con el advenimiento de enrutadores SoC pequeños y convenientes (como el tutorial sobre "acondicionamiento", un clon del popular mini enrutador chino Hame A15, que también es "A5-V11 sin marca" ) y la introducción generalizada de openwrt para administrar dispositivos host (en la gran mayoría) casos, estos son dispositivos conectados a través de USB), la tarea de controlar la potencia de todo tipo de módems, lectores de tarjetas, convertidores usb-rs232, etc. se convierte en una tarea muy urgente. La necesidad de controlar el puerto cuando se trabaja con GSM-mo es más común Emami (para reiniciar, por ejemplo). En principio, la gente ya ha tomado suficientes decisiones . Para estos fines, desde el uso de pines GPIO gratuitos en el enrutador, hasta relés listos para usar. Existen soluciones de terceros fabricantes. Este es, por ejemplo, un concentrador USB programable para 4 puertos de Acroname , que es rico en software y hardware, pero cuesta alrededor de $ 300.

Hay una opción más barata, un hub intercambiable inteligente con el bonito nombre Yupkit YKUSH por solo 35 €:
Los más económicos pueden usar un grupo de concentradores usb más baratos, un relé de 5V normalmente cerrado y cualquiera de los Arduino-k para desconectar la alimentación del puerto usb si es necesario. El costo de tal solución es <$ 10, excluyendo el tiempo dedicado a soldar y programar Arduino.
Parecería un callejón sin salida. O caro y hermoso, o simplemente simple y mocoso . Pero resultó que hay una tercera opción. Además, la solución es antigua, como la especificación USB 2.0 para los concentradores en los que se describe.
Extractos de las especificaciones relacionadas con la administración de energía USBLos concentradores autoalimentados pueden tener interruptores de alimentación que controlan la entrega de energía hacia los puertos orientados aguas abajo, pero no es necesario. Los concentradores alimentados por bus deben tener interruptores de alimentación. Un concentrador con interruptores de alimentación puede cambiar la alimentación a todos los puertos como grupo / pandilla, a cada puerto individualmente, o tener un número arbitrario de pandillas de uno o más puertos. Un concentrador indica si admite o no la conmutación de alimentación mediante la configuración del campo Modo de conmutación de alimentación lógica en wHubCharacteristics. Si un concentrador admite la conmutación de alimentación por puerto, la alimentación a un puerto se activa cuando se recibe una solicitud SetPortFeature (PORT_POWER) para el puerto. La alimentación del puerto se apaga cuando el puerto se encuentra en los estados Apagado o No configurado. Si un concentrador admite la conmutación de alimentación agrupada, la alimentación a todos los puertos de una pandilla se activa cuando cualquier puerto de una pandilla recibe una solicitud SetPortFeature (PORT_POWER). El poder de una pandilla no está apagado a menos que todos los puertos de una pandilla estén en estado Apagado o No configurado.
...
Aunque no se requiere un concentrador autoalimentado para implementar la conmutación de alimentación, el concentrador debe admitir el estado Apagado para todos los puertos. Además, el concentrador debe implementar la máscara PortPwrCtrlMask (todos los bits configurados en 1B) aunque el concentrador no tenga interruptores de alimentación que puedan controlarse mediante el software del sistema USB.
Traduciendo al ruso, resulta que el estándar USB ya define la capacidad de controlar la alimentación del puerto utilizando el llamado Conmutación de alimentación por puerto (PPPS) , pero encontrar un dispositivo que admita esta función no solo es difícil, sino muy difícil. Para implementar el PPPS funcional, se necesitan componentes adicionales (transistores de efecto de campo y cableado), que no se instalan en los concentradores para ahorrar dinero.
Reaccionando sensiblemente a las demandas del mercado, algunos fabricantes indican la función PPPS en las especificaciones de los hubs, pero en realidad esto no va más allá de la inscripción en la caja. Y, básicamente, es difícil encontrar fallas, porque muchos chips dentro de los concentradores admiten esta función, pero es imposible implementarla sin interruptores adicionales (transistores) (la mayoría de las veces los puertos USB están directamente conectados a la línea + 5V).
Incluso desmonté especialmente varios hubs USB pequeños que planeaba usar junto con el enrutador A5-V11. Dentro estaban: el chip GL850G y el muy querido por los chinos FE1.1s . Naturalmente, solo se encontraron en el interior los mismos controladores con un mínimo de detalles. Debido al tamaño en miniatura de la placa, es difícil colocar un transistor y partes que se hayan unido incluso con una instalación con bisagras. Tuve que calmarme. Aunque, dependiendo del chip, si en la hoja de datos hay una mención de detección de sobrecorriente y control de potencia individual o agrupado , entonces es posible llevar a cabo una operación inteligente de dicho dispositivo de acuerdo con el método descrito en el artículo . Un amigo usó una combinación de un transistor y un conjunto de resistencias para habilitar la función PPPS en su concentrador.
Esquema de alteración y apariencia del dispositivo. Además, al leer la documentación, se da cuenta del hecho de que no hay no y sí, hay una mención de que el modo de control de puerto puede implementarse agregando algunos AIC1526-0 o MIC2026 (interruptor de distribución de energía de doble canal) al circuito.
Los esquemas de las hojas de datos no permitirán mentir Parte de lo principal o ir al grano
Abrumado por pensamientos sombríos sobre la compra de concentradores chinos con una funcionalidad desconocida ("un cerdo en un empujón") y la imposibilidad de verificarlos preliminarmente, sin querer encontré un artículo sobre la configuración de openwrt para controlar la potencia de un concentrador USB, además, el mismo, abandonado y olvidado D-Link DUB-H7 en un estuche gris.

Después de estudiar el material, quedó claro que a bordo del concentrador, además del controlador Philips ISP1521BE bastante avanzado, hay un montón de esos mismos interruptores de distribución de energía de doble canal AIC1528-0 para una conmutación de potencia completa. Aunque a juzgar por la hoja de datos, un chip con un kit de cuerpo mínimo puede controlar la potencia de los puertos descendentes (y también hay muchas cosas que no se implementaron allí, por ejemplo, indicando la actividad del puerto ascendente utilizando la tecnología GoodLink, o un host USB 1.1 para admitir correctamente una mezcla de 2.0 y 1.1 en puertos aguas abajo, etc. etc.).
Por cierto, para aquellos que deciden repetir el camino que he recorrido, debo decir de inmediato que las versiones modernas del D-Link DUB-H7 (en un estuche negro brillante) ya no son tan útiles como las antiguas grises.
Según la información de wikidevi.com ( 1 , 2 , 3 , 4 ), hay varias revisiones de este concentrador, con un conjunto diferente de componentes a bordo y, en consecuencia, con una funcionalidad diferente (A1 / A5 - ISP1521BE de 7 puertos, B1-2xGL854G de 4 puertos, C1 - 2xGL850Z de 4 puertos).
También se llama la atención sobre el D-Link DUB-H7 porque, además de su buena funcionalidad, también es la opción más asequible (tanto en términos de precio como de prevalencia) en nuestra área. De los modelos que podrían mencionarse en el camino con "Conmutación de alimentación por puerto", también podemos observar, por ejemplo, lo siguiente:
- Linksys USB2HUB4 USB 2.0 hub.
- D-Link DFB-H7 Combo Hub
- Elecom U2H-G4S
- Sanwa Supply USB-HUB14GPH
- Targus Inc. PAUH212
- Hawking Technology UH214
No tuve la oportunidad de buscar los dispositivos mencionados, porque una vez tuve suerte con la versión de la revisión A5. La verdad es que ahora, si tuviera que comprar un hub de este tipo, trataría de encontrar la revisión B1 , porque además de controlar la potencia de los puertos, el chip en el que está construido (GL854G) tiene dentro algo como Multi Transaction Translator .
La importancia de tener un traductor de transacciones múltiples (MTT) en un concentrador USB
Una pequeña digresión para explicar qué es este Traductor de transacciones múltiples (MTT) y por qué es tan importante y necesario. Un transmisor de transacciones (TT) es un componente importante de cualquier concentrador de alta velocidad que proporciona comunicación entre los puertos ascendentes y descendentes de un concentrador, especialmente cuando estos puertos operan a diferentes velocidades de datos. De hecho, TT separa los dispositivos de baja y media velocidad de los de alta velocidad (puramente USB 2.0, por ejemplo) y es responsable de trabajar a velocidades de USB 1.1.
El transmisor de operación puede ser de dos tipos: individual (ing. Single Transaction Translator, STT) o múltiple (ing. Multiple Transaction Translator, MTT). En el caso de STT, se usa un transmisor para todos los puertos, y en el caso de MTT, cada puerto tiene su propio transmisor. Está claro que la primera opción es más barata y simple, de dónde proviene la principal desventaja de esta opción: si varios puertos USB 1.1 están conectados al concentrador, todos funcionarán a través de un solo cuello de botella. Creo que puedes imaginar lo que sucederá con la velocidad del intercambio.

En términos simples, los concentradores STT tienen un límite en la cantidad de dispositivos que se pueden usar simultáneamente. De lo contrario, está plagado de pérdida de paquetes debido a conflictos en la planificación de la transferencia de datos, la sobrecarga del concentrador (especialmente en el caso de dispositivos que intercambian datos activamente, como tarjetas de sonido), etc. Por lo tanto, es mejor elegir un concentrador para enfocarse inmediatamente en dispositivos con MTT y no buscar la causa de la inestabilidad en el trabajo. Si ya tiene un concentrador, y desafortunadamente resultó ser con STT, solo tiene que verificar cuidadosamente los estándares de los dispositivos conectados al concentrador y, si es posible, reducir la cantidad de USB 1.1 conectado a uno.
Desafortunadamente, la gran mayoría de los centros de bajo costo construidos en chips de presupuesto (fe1.1s, GL850G e ISP1521BE de mi centro A5) tienen STT a bordo, más caros y avanzados (GL852G, GL854G (revisión B1 del D-link DUB-H7 en discusión), GL3520, VL812, VL813, SMSC USB2514) están ejecutando MTT.
Puede verificar el tipo de transmisor de operación leyendo la hoja de datos en el chip (pero a menudo los chinos no pueden o no quieren decir la marca del chip), o conectando el concentrador a la computadora * nix y ejecutando el comando lsusb -v y encontrando una información de servicio relacionada con el concentrador en estudio (por nombre) La línea DeviceProtocol indicará TT simple o TT múltiple . Está claro que comprar solo es mejor con Multi :)
Descripción de las características del hub emitidas por el equipo de lsusbBus 001 Dispositivo 005: ID 2001: f103 D-Link Corp. Hub USB 2.0 DUB-H7 de 7 puertos
No se pudo abrir el dispositivo, falta información
Descriptor de dispositivo:
bLongitud 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 9 Hub
bDeviceSubClass 0 sin usar
bDeviceProtocol 1 Single TT
bMaxPacketSize0 64
idVendor 0x2001 D-Link Corp.
idProduct 0xf103 DUB-H7 Hub USB 2.0 de 7 puertos
bcdDevice 1.00
iManufacturer 0
iProduct 0
iSerial 0
bNumConfigurations 1
Descriptor de configuración:
bLongitud 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Autoalimentado
Despertador remoto
MaxPower 0mA
Descriptor de interfaz:
bLongitud 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 sin usar
bInterfaceProtocol 0 Hub de velocidad completa (o raíz)
iInterface 0
Descriptor de punto final:
bLongitud 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Tipo de transferencia de interrupción
Tipo de sincronización ninguno
Datos de tipo de uso
wMaxPacketSize 0x0001 1x 1 bytes
bIntervalo 12
Cuando ejecuta el comando lsusb -v -t , puede ver una estructura bastante jerárquica de los dispositivos usb conectados.

En lugar de lsusb, puede usar la utilidad hwinfo con el modificador --usb (es aconsejable preinstalarlo a través de sudo apt-get install hwinfo ). Luego, la salida de información sobre los dispositivos usb se verá un poco diferente:
Información emitida por hwinfolab @ lab-G: ~ $ hwinfo --usb
23: USB 00.0: Hub 10a00
[Creado en usb.122]
ID única: zFuK.sOcBcpBDhs4
ID principal: k4bc.9T1GDCLyFd9
ID de SysFS: /devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8:1.0
SysFS BusID: 1-8: 1.0
Clase de hardware: hub
Modelo: "concentrador USB 2.0 D-Link DUB-H7 de 7 puertos"
Conexión en caliente: USB
Vendedor: usb 0x2001 "D-Link"
Dispositivo: usb 0xf103 "concentrador USB 2.0 DUB-H7 de 7 puertos"
Revisión: "1.00"
Conductor: "hub"
Módulos de controlador: "usbcore"
Velocidad: 480 Mbps
Alias del módulo: "usb: v2001pF103d0100dc09dsc00dp01ic09isc00ip00in00"
Estado de configuración: cfg = nuevo, disponible = sí, necesidad = no, activo = desconocido
Adjunto a: # 21 (Hub)
En general, descubrimos brevemente las características de los dispositivos de baja velocidad y ahora es el momento de pasar a la parte de software.
Administrar la alimentación del puerto USB
Diré de inmediato que no pude encontrar una manera de implementar la funcionalidad PPPS en un entorno Windows (al menos por inactividad). El máximo es habilitar / deshabilitar el dispositivo usando la utilidad devcon . Me alegrará si uno de los lectores corrige y complementa. Mientras tanto, todos los procedimientos se llevan a cabo en el ejemplo de Ubuntu (en el caso de openwrt, el algoritmo es similar, aunque en el último tronco ya debería estar incluido en la "distribución").
Por lo tanto, la posibilidad de conmutación de alimentación por puerto (PPPS) o "conmutación de alimentación de puerto" se implementa en concentradores con soporte de hardware para esta función utilizando el programa hub-ctrl o su uhubctrl descendiente. Los consideraré a su vez.
Hub-ctrl
El programa fue escrito por el ingeniero japonés de lucha por la independencia Niibe Yutaka en 2006. Pero ahora funciona sin problemas. Para la instalación, necesitamos cualquier biblioteca * nix y libusb-dev . Para Ubuntu 16.04 LTS, el algoritmo es el siguiente:
Instalar agregar. paquetes: sudo apt-get update && sudo apt-get install libusb-dev git gcc
Fuente de descarga: git clone https://github.com/codazoda/hub-ctrl.c
Compilado con gcc: cd hub-ctrl.c && gcc -o hub-ctrl hub-ctrl.c -lusb
Si la dirección no está disponible, puede descargar manualmente las fuentes desde aquí o desde aquí y compilarlas con el comando descrito anteriormente.
El programa tiene una sintaxis de línea de comandos bastante simple que se ajusta a la siguiente descripción:
./ hub-ctrl [{-h HUBNUM | -b BUSNUM -d DEVNUM}] \ [-P PUERTO] [{-p [VALOR] | -l [VALOR]}]
donde HUBNUM: número de concentrador, número de bus BUSNUM, número de dispositivo DEVNUM, número de puerto PORT
Para descubrir estos parámetros, simplemente ejecute el comando lsusb :

Por cierto, el programa hub-ctrl puede actuar como una especie de "sonda" del hub usb por el hecho de que tiene la capacidad de administrar la potencia del puerto. Es suficiente ejecutarlo con el modificador -v. Obtenemos una lista de concentradores compatibles disponibles en el sistema (línea INFO) y el estado del puerto (en mi caso, todos los puertos están desactivados).
lab @ lab-G: ~ / hub $ sudo ./hub-ctrl -v
Hub # 0 a las 001: 006
INFORMACIÓN: conmutación de potencia individual.
ADVERTENCIA: los indicadores de puerto NO son compatibles.
Estado del puerto del concentrador:
Puerto 1: 0000.0000
Puerto 2: 0000.0000
Puerto 3: 0000.0000
Puerto 4: 0000.0000
Puerto 5: 0000.0000
Puerto 6: 0000.0000
Puerto 7: 0000.0000
Y así es como se verá la configuración cuando todos los puertos estén encendidos:
lab @ lab-G: ~ / hub $ sudo ./hub-ctrl -v
Hub # 0 a las 001: 006
INFORMACIÓN: conmutación de potencia individual.
ADVERTENCIA: los indicadores de puerto NO son compatibles.
Estado del puerto del concentrador:
Puerto 1: potencia 0000.0100
Puerto 2: potencia 0000.0100
Puerto 3: potencia 0000.0100
Puerto 4: potencia 0000.0100
Puerto 5: potencia 0000.0100
Puerto 6: potencia 0000.0100
Puerto 7: potencia 0000.0100
Para habilitar cualquiera de los puertos, necesita ejecutar el comando sudo ./hub-ctrl -h 0 -P 1 -p 1 , donde -h indica qué concentrador estamos usando (el 0 en mi caso), -P dice qué puerto (1- th puerto en mi caso), y -p indica el estado (0-off, 1-on).

Para obtener la configuración como en la imagen de arriba, fue necesario ejecutar los siguientes comandos secuencialmente (para puertos inicialmente deshabilitados):
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
En consecuencia, no es difícil escribir un script que haga que los LED parpadeen por diversión en la secuencia deseada. Ejemplos de tales cosas ya existen y funcionan con éxito:
Código Morse en un hub USB, guirnaldas de Navidad , etc. etc. Para mí, desde las capacidades de hub-ctrl, la función de conmutación cíclica no fue suficiente para realizar mis fantasías momentáneas de iluminación (para no perder el tiempo escribiendo un guión, etc.). Este defecto molesto se elimina en el sucesor - uhubctl.
UHUBCTL
El programa uhubctl es un análogo hub-ctrl optimizado y tiene algunas diferencias estéticas (y, por supuesto, admite más dispositivos).
Teóricamente, la utilidad se puede compilar para ejecutarse en un entorno Windows, pero ... Pero por ahora, interactúa con las utilidades a través del controlador winusb.sys, que no puede acceder al concentrador directamente. El programa también afirma ser compatible con USB 3.0 (los concentradores USB 3.0 que admiten conmutación de alimentación por puerto, por cierto, son mucho más que los concentradores USB 2.0 con una funcionalidad similar). Cuando se trabaja con un concentrador USB 3.0 conectado a un puerto ascendente USB 3.0, el programa lo define como dos concentradores virtuales independientes: USB 2.0 y USB 3.0, y los dispositivos USB se conectarán a uno de ellos dependiendo de sus capacidades y velocidad de conexión . En consecuencia, para administrar dichos dispositivos, el programa habilita / deshabilita el encendido de los centros virtuales de forma predeterminada (puede cambiar la utilidad al modo manual agregando el interruptor -e al comando de inicio).
Importante: el sistema de direccionamiento para puertos USB puede causar cierta confusión (es similar para hub-ctrl y uhubctl). Cuando funciona, utiliza el mismo método de direccionamiento similar al del kernel de Linux: bx.yz, donde b es el número de bus USB, y x, y, z son los números de puerto de la cadena de host, comenzando desde el concentrador USB raíz de este bus. Si hay más de un concentrador USB administrado, puede determinar las opciones correctas ejecutando uhubctl con la opción -l (ubicación). Observo que este direccionamiento es semi-estable: no cambiará si desconecta y vuelve a conectar los dispositivos USB al mismo puerto físico.
El algoritmo de compilación del programa es similar al algoritmo para hub-ctrl. , libusb-1.0 ( 1.0.12 ) sudo apt-get install libusb-1.0-0-dev , make .
uhubctl -a off -p 2
(-a off, -a 0) 2 (-p 2). off/on/cycle ( 0/1/2). cycle , ( -d) . Es decir .
,
, "" D-Link - . (PPPS) , USB. , , - GSM- ( ):

, D-link DUB-H7, , ( hub-ctrl).
, ..."… Dlink DUB H-7 , hub-ctrl -p 0 1.47V. " " , /dev/ttyUSBx . . ."
Las utilidades descritas en el artículo (lsusb, hwinfo, hub-ctrl) pueden ser una excelente ayuda al elegir el próximo concentrador USB, especialmente si no hay acceso para ver el dispositivo interno. En un habr, las ideas y expectativas de los usuarios de los centros usb ideales ya se describieron ( aquí y aquí ). Los algoritmos descritos para verificar los centros existentes, en mi opinión, complementarán y diluirán perfectamente los enfoques descritos por los autores. Y así, después de eso, el héroe de mi artículo (D-link DUB-H7 ver. A5) en mi opinión se ve muy bien desde el punto de vista de las soluciones de circuitos. Tal vez, me estoy inclinando ante el sim :)
PD En busca de una pregunta para los miembros de la comunidad Habr, quienes de repente por casualidad estaban mintiendo casi igual que mi D-link DUB-H7 en un estuche gris.
( - )? RP1...RP2 ( 0- c).
: - EEPROM 24C02, :
Importante! Todas las actualizaciones y notas provisionales a partir de las cuales los artículos habr se forman sin problemas ahora se pueden ver en mi canal de telegramas lab66 . Suscríbete para no esperar el próximo artículo, sino para estar inmediatamente informado sobre toda la investigación :)