Comment transformer un hub USB «centenaire» en un smart managed et économiser 300 $

D'une manière ou d'une autre, j'avais besoin d'un concentrateur pendant longtemps, de préférence avec un grand nombre de ports et avec une forme assez pratique, adaptée à l'intégration au lieu d'un lecteur de disquette dans la baie de 3,5 pouces. Un coup d'œil sur le marché aux puces a jeté le modèle D-link DUB-H7, et même dans la combinaison de «2 pour le prix de 1». L'inspection externe n'a rien donné de spécial, le hub comme un hub a été fait solidement, la principale "imprimante" USB AM-BM à l'arrière et une alimentation 3A. Comme toujours, la première chose que j'ai triée, était content d'un petit nombre de places vides au lieu d'éléments, couplé à une soudure de haute qualité et calmé. C'est vrai, juste au cas où, je suis allé sur Internet pour voir de quel type de hub il s'agissait et s'il y avait des projets intéressants avec sa participation. Il n'y avait pas de projets, avis d'utilisateurs 50/50, en général, pas de dynamique. Le hub pendant 5-7 ans a assez bien fonctionné et a rempli sa tâche, puis s'est déplacé en douceur vers la poubelle électronique et aurait probablement disparu en conséquence avec des adaptateurs inconnus, des adaptateurs, etc. Mais un événement s'est produit dans ma vie qui m'a fait fouiller dans des sacs avec de vieilles ordures, trouver celui-ci, comme il s'est avéré, un lien D unique, et secouer la poussière pour l'extraire dans la lumière de Dieu. Si vous souhaitez savoir pourquoi, n'hésitez pas à couper.


cligner des yeux

Intro or Crying about the greedy fabricants of usb hubs


Avec l'avènement de petits routeurs SoC pratiques (comme le tutoriel sur le «conditionnement» d'un clone du mini-routeur chinois populaire Hame A15, qui est également «A5-V11 sans marque» ) et l'introduction généralisée d'Openwrt pour la gestion des périphériques hôtes (dans la grande majorité) cas, ce sont des appareils connectés via USB), la tâche de contrôler l'alimentation de toutes sortes de modems, lecteurs de cartes, convertisseurs usb-rs232, etc., etc. devient une tâche très urgente. Le besoin le plus courant de gestion des ports lorsque vous travaillez avec GSM Emami (redémarrer, par exemple). En principe, le peuple a déjà pris suffisamment de décisions . À ces fins, de l'utilisation de broches GPIO libres dans le routeur aux relais prêts à l'emploi. Il existe des solutions de fabricants tiers. Il s'agit, par exemple, d'un concentrateur USB programmable pour 4 ports d' Acroname , qui est riche en logiciels et en matériel, mais coûte environ 300 $.


image

Il existe une option moins chère, un concentrateur commutable intelligent avec le joli nom Yupkit YKUSH pour seulement 35 €:


image

Les plus économiques peuvent utiliser un tas de hub USB le moins cher, un relais 5V normalement fermé et n'importe quel Arduino-k pour déconnecter l'alimentation du port USB si nécessaire. Le coût d'une telle solution est <10 $, sans compter le temps passé à souder et à programmer Arduino.


Cela semblerait une impasse. Soit cher et beau, ou tout simplement simple et arrogant . Mais il s'est avéré qu'il existe une troisième option. De plus, la solution est ancienne, comme la spécification USB 2.0 pour les concentrateurs dans laquelle elle est décrite.


Extraits de spécifications concernant la gestion de l'alimentation USB

Les concentrateurs autoalimentés peuvent avoir des commutateurs d'alimentation qui contrôlent la fourniture de puissance en aval des ports, mais cela n'est pas nécessaire. Les concentrateurs alimentés par bus doivent avoir des interrupteurs d'alimentation. Un concentrateur avec des commutateurs d'alimentation peut commuter l'alimentation vers tous les ports en tant que groupe / gang, vers chaque port individuellement, ou avoir un nombre arbitraire de gangs d'un ou plusieurs ports. Un concentrateur indique s'il prend en charge ou non la commutation d'alimentation en définissant le champ Mode de commutation d'alimentation logique dans wHubCharacteristics. Si un concentrateur prend en charge la commutation d'alimentation par port, l'alimentation d'un port est alors activée lorsqu'une demande SetPortFeature (PORT_POWER) est reçue pour le port. L'alimentation du port est désactivée lorsque le port est dans les états Hors tension ou Non configuré. Si un concentrateur prend en charge la commutation d'alimentation groupée, l'alimentation de tous les ports d'un groupe est activée lorsqu'un port d'un groupe reçoit une demande SetPortFeature (PORT_POWER). L'alimentation d'un gang n'est pas coupée sauf si tous les ports d'un gang sont dans les états Hors tension ou Non configuré.
...
Bien qu'un concentrateur autoalimenté ne soit pas requis pour implémenter la commutation d'alimentation, le concentrateur doit prendre en charge l'état hors tension pour tous les ports. En outre, le concentrateur doit implémenter le PortPwrCtrlMask (tous les bits définis sur 1B) même si le concentrateur n'a pas de commutateurs d'alimentation pouvant être contrôlés par le logiciel système USB.


Traduisant en russe, il s'avère que la norme USB définit déjà la capacité de contrôler l'alimentation du port à l'aide de ce qu'on appelle Commutation d'alimentation par port (PPPS) , mais rencontrer un appareil qui prend en charge cette fonctionnalité est non seulement difficile, mais très difficile. Pour mettre en œuvre la fonctionnalité PPPS, des composants supplémentaires sont nécessaires (transistors à effet de champ et câblage), qui ne sont pas installés dans les concentrateurs afin d'économiser de l'argent.


Réagissant avec sensibilité aux demandes du marché, certains fabricants indiquent la fonction PPPS dans les spécifications des hubs, mais en réalité cela ne va pas au-delà de l'inscription sur la boîte. Et fondamentalement, il est difficile de trouver la faute, car de nombreuses puces à l'intérieur des concentrateurs prennent en charge cette fonction, mais il est impossible de l'implémenter sans commutateurs supplémentaires (transistors) (le plus souvent, les ports USB sont directement connectés à la ligne + 5V).


J'ai même spécialement démonté plusieurs petits concentrateurs USB que je prévoyais d'utiliser avec le routeur A5-V11. À l'intérieur se trouvaient: la puce GL850G et la très appréciée des FE1.1 chinois. Naturellement, seuls les contrôleurs eux-mêmes avec un minimum de détails ont été trouvés à l'intérieur. En raison de la taille miniature de la carte, il est difficile de placer un transistor et des pièces qui l'ont rejoint même avec une installation articulée. J'ai dû me calmer. Bien que, selon la puce, si dans la fiche technique il est fait mention de détection de surintensité et de contrôle de puissance individuel ou groupé , il est possible d'effectuer un fonctionnement intelligent d'un tel appareil selon la méthode décrite dans l' article . Un ami a utilisé une combinaison d'un transistor et d'un tas de résistances pour activer la fonction PPPS dans son concentrateur.


Schéma de modification et apparence de l'appareil
image
image

De plus, en lisant la documentation, vous vous rendez compte du fait qu'il n'y a pas, non, et il est mentionné que le mode de contrôle de port peut être implémenté en ajoutant du AIC1526-0 ou MIC2026 (commutateur de distribution d'alimentation à deux canaux) au circuit.


Les schémas des fiches techniques ne laisseront pas mentir


Faire partie du principal ou aller droit au but


Accablé par des pensées sombres sur l'achat de concentrateurs chinois avec des fonctionnalités inconnues ("un cochon dans un coup") et l'impossibilité de les vérifier au préalable, je suis tombé par inadvertance sur un article sur la configuration d'Openwrt pour contrôler la puissance d'un concentrateur USB, d'ailleurs, le même, abandonné et oublié D-Link DUB-H7 dans un boîtier gris.



Après avoir étudié le matériel, il est devenu clair qu'à bord du concentrateur, en plus du contrôleur Philips ISP1521BE assez avancé, il y a tout un tas de ces mêmes commutateurs de distribution d'alimentation à deux canaux AIC1528-0 pour une commutation à pleine puissance. Bien qu'à en juger par la fiche technique, une puce avec un kit de corps minimum peut elle-même contrôler la puissance des ports en aval (et il y a aussi beaucoup de choses qui n'y ont pas été implémentées, par exemple, indiquant une activité du port en amont utilisant la technologie GoodLink, ou un hôte USB 1.1 pour supporter correctement un mélange de 2.0 et 1.1 sur ports en aval, etc., etc.).


Soit dit en passant, pour ceux qui décident de répéter le chemin que j'ai parcouru, je dois dire tout de suite que les versions modernes du D-Link DUB-H7 (dans un boîtier noir brillant) ne sont plus aussi utiles que les anciennes grises.



Selon les informations de wikidevi.com ( 1 , 2 , 3 , 4 ), il existe plusieurs révisions de ce concentrateur, avec un ensemble différent de composants à bord, et en conséquence avec des fonctionnalités différentes (A1 / A5 - ISP1521BE 7 ports, B1-2xGL854G 4 ports, C1 - 2xGL850Z 4 ports).


L'attention portée au D-Link DUB-H7 est également attirée car, en plus de ses bonnes fonctionnalités, c'est également l'option la plus abordable (tant en termes de prix que de prévalence) dans notre région. Parmi les modèles qui pourraient être mentionnés en cours de route avec la «commutation d'alimentation par port», nous pouvons en outre noter, par exemple, les éléments suivants:


  • Concentrateur Linksys USB2HUB4 USB 2.0.
  • Hub combiné DFB-H7 D-Link
  • Elecom U2H-G4S
  • Sanwa Supply USB-HUB14GPH
  • Targus Inc. PAUH212
  • Hawking Technology UH214

Je n'ai pas eu la chance de rechercher les appareils mentionnés, car j'ai eu une fois de la chance avec la version de la révision A5. La vérité est maintenant que si je devais acheter un tel hub, j'essaierais de trouver la révision B1 , car en plus de contrôler la puissance des ports, la puce sur laquelle il est construit (GL854G) a à l'intérieur une chose telle que Multi Transaction Translator .



L'importance d'avoir un traducteur multi-transactions (MTT) dans un concentrateur USB


Une petite digression afin d'expliquer ce qu'est ce Traducteur Multi Transaction (MTT) et pourquoi il est si important et nécessaire. Un émetteur de transaction (TT) est un composant important de tout concentrateur haute vitesse qui assure la communication entre les ports amont et aval d'un concentrateur, en particulier lorsque ces ports fonctionnent à des débits de données différents. En fait, TT sépare les appareils à basse et moyenne vitesse des appareils à haute vitesse (purement USB 2.0, par exemple) et est chargé de travailler à des vitesses USB 1.1.


L'émetteur d'opération peut être de deux types - simple (eng. Traducteur de transaction unique, STT) ou multiple (eng. Traducteur de transaction multiple, MTT). Dans le cas de STT, un émetteur est utilisé pour tous les ports, et dans le cas de MTT, chaque port a son propre émetteur. Il est clair que la première option est moins chère et plus simple, d'où vient le principal inconvénient de cette option - si plusieurs ports USB 1.1 sont connectés au concentrateur, ils fonctionneront tous via un seul goulot d'étranglement. Je pense que vous pouvez imaginer ce qui se passera avec la vitesse des échanges.



En termes simples, les concentrateurs STT ont une limite sur le nombre d'appareils pouvant être utilisés simultanément. Sinon, elle est lourde de pertes de paquets en raison de conflits dans la planification du transfert de données, surchargeant le concentrateur (en particulier dans le cas des appareils qui échangent activement des données, comme les cartes son), etc. Par conséquent, il est préférable de choisir un concentrateur pour se concentrer immédiatement sur les appareils avec MTT et ne pas rechercher la cause de l'instabilité dans le travail. Si vous avez déjà un concentrateur, et malheureusement il s'est avéré être avec STT, il vous suffit de vérifier soigneusement les normes des appareils connectés au concentrateur et, si possible, de réduire le nombre d'USB 1.1 connectés à un.


Malheureusement, la grande majorité des hubs à bas prix construits sur des puces économiques (fe1.1s, GL850G et ISP1521BE de mon hub A5) ont des STT à bord, plus chers et plus avancés (GL852G, GL854G (révision B1 du DU-Link DUB-H7 en cours de discussion), B1 GL3520, VL812, VL813, SMSC USB2514) exécutent MTT.


Vous pouvez vérifier le type de transmetteur de fonctionnement soit en lisant la fiche technique sur la puce (mais souvent les Chinois ne peuvent pas ou ne veulent pas dire la marque de la puce), ou en connectant le concentrateur à l'ordinateur * nix et en exécutant la commande lsusb -v et en trouvant une information de service relative au concentrateur à l'étude (par nom). La ligne DeviceProtocol indiquera Single TT ou Multi TT . Il est clair que l'achat n'est possible qu'avec Multi :)


Description des caractéristiques du hub émises par l'équipe lsusb

Bus 001 Périphérique 005: ID 2001: f103 D-Link Corp. Concentrateur USB 2.0 DUB-H7 à 7 ports
Impossible d'ouvrir l'appareil, certaines informations seront manquantes
Descripteur de périphérique:
bLongueur 18
bDescriptorType 1
bcdUSB 2.00
Hub bDeviceClass 9
bDeviceSubClass 0 inutilisé
bDeviceProtocol 1 Single TT
bMaxPacketSize0 64
idVendor 0x2001 D-Link Corp.
idProduct 0xf103 DUB-H7 Hub USB 2.0 à 7 ports
bcdDevice 1.00
iManufacturer 0
iProduct 0
iSerial 0
bNumConfigurations 1
Descripteur de configuration:
bLongueur 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Auto-alimenté
Réveil à distance
MaxPower 0mA
Descripteur d'interface:
bLongueur 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Inutilisé
bInterfaceProtocol 0 Concentrateur pleine vitesse (ou racine)
iInterface 0
Descripteur de point final:
bLongueur 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Interruption du type de transfert
Type de synchronisation aucun
Données de type d'utilisation
wMaxPacketSize 0x0001 1x 1 octets
bIntervalle 12


Lorsque vous exécutez la commande lsusb -v -t , vous pouvez voir une structure assez hiérarchique des périphériques USB connectés.



Au lieu de lsusb, vous pouvez utiliser l'utilitaire hwinfo avec le commutateur --usb (il est conseillé de le préinstaller via sudo apt-get install hwinfo ). Ensuite, la sortie des informations sur les périphériques USB sera un peu différente:


Informations émises par hwinfo

lab @ lab-G: ~ $ hwinfo --usb
23: Hub USB 00.0: 10a00
[Créé à usb.122]
ID unique: zFuK.sOcBcpBDhs4
ID parent: k4bc.9T1GDCLyFd9
ID SysFS: /devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8:1.0
ID de bus SysFS: 1-8: 1.0
Classe de matériel: hub
Modèle: "Hub USB 2.0 D-Link DUB-H7 à 7 ports"
Hotplug: USB
Fournisseur: usb 0x2001 "D-Link"
Périphérique: usb 0xf103 "concentrateur USB 2.0 DUB-H7 à 7 ports"
Révision: "1,00"
Pilote: "hub"
Modules de pilotes: "usbcore"
Vitesse: 480 Mbps
Alias ​​du module: "usb: v2001pF103d0100dc09dsc00dp01ic09isc00ip00in00"
État de la configuration: cfg = new, avail = yes, need = no, active = unknown
Attaché à: # 21 (Hub)


En général, nous avons brièvement compris les caractéristiques des appareils à basse vitesse et il est maintenant temps de passer à la partie logicielle.


Gérer l'alimentation du port USB


Je dirai tout de suite que je n'ai pas pu trouver un moyen d'implémenter la fonctionnalité PPPS dans un environnement Windows (au moins par intérêt). Le maximum est d'activer / désactiver le périphérique à l'aide de l'utilitaire devcon . Je serai heureux si l'un des lecteurs corrige et complète. En attendant, toutes les procédures sont effectuées sur l'exemple d'Ubuntu (dans le cas de openwrt - l'algorithme est similaire, bien que dans le dernier tronc il devrait déjà être inclus dans la "distribution").


Ainsi, la possibilité de commutation d'alimentation par port (PPPS) ou de «commutation d'alimentation de port» est implémentée sur les concentrateurs avec prise en charge matérielle de cette fonction à l'aide du programme hub-ctrl ou de son descendant uhubctrl . Je les considérerai tour à tour.


Hub-ctrl


Le programme a été écrit par l'ingénieur de combat pour l'indépendance japonaise Niibe Yutaka en 2006. Mais cela fonctionne sans problème maintenant. Pour l'installation, nous avons besoin de n'importe quelle bibliothèque * nix et libusb-dev . Pour Ubuntu 16.04 LTS, l'algorithme est le suivant:


  Installez ajouter.  packages: sudo apt-get update && sudo apt-get install libusb-dev git gcc
 Source de téléchargement: git clone https://github.com/codazoda/hub-ctrl.c
 Compilé avec gcc: cd hub-ctrl.c && gcc -o hub-ctrl hub-ctrl.c -lusb 

Si l'adresse n'est pas disponible, vous pouvez télécharger manuellement les sources d'ici ou d'ici et compiler avec la commande décrite ci-dessus.


Le programme a une syntaxe de ligne de commande assez simple qui correspond à la description suivante:


./ hub-ctrl [{-h HUBNUM | -b BUSNUM -d DEVNUM}] \ [-P PORT] [{-p [VALEUR] | -l [VALUE]}]
où HUBNUM - numéro de concentrateur, numéro de bus BUSNUM, numéro de périphérique DEVNUM, numéro de port PORT


Afin de découvrir ces paramètres, exécutez juste la commande lsusb :



Soit dit en passant, le programme hub-ctrl peut agir comme une sorte de «sonde» du concentrateur USB pour le fait qu'il a la capacité de gérer l'alimentation du port. Il suffit de l'exécuter avec le commutateur -v. Nous obtenons une liste des concentrateurs pris en charge disponibles dans le système (ligne INFO) et l'état du port (dans mon cas, tous les ports sont désactivés).


lab @ lab-G: ~ / hub $ sudo ./hub-ctrl -v
Hub # 0 à 001: 006
INFO: commutation de puissance individuelle.
AVERTISSEMENT: les indicateurs de port ne sont PAS pris en charge.
État du port du concentrateur:
Port 1: 0000.0000
Port 2: 0000.0000
Port 3: 0000.0000
Port 4: 0000.0000
Port 5: 0000.0000
Port 6: 0000.0000
Port 7: 0000.0000

Et voici à quoi ressemblera la configuration lorsque tous les ports seront activés:


lab @ lab-G: ~ / hub $ sudo ./hub-ctrl -v
Hub # 0 à 001: 006
INFO: commutation de puissance individuelle.
AVERTISSEMENT: les indicateurs de port ne sont PAS pris en charge.
État du port du concentrateur:
Port 1: alimentation 0000.0100
Port 2: alimentation 0000.0100
Port 3: alimentation 0000.0100
Port 4: alimentation 0000.0100
Port 5: alimentation 0000.0100
Port 6: alimentation 0000.0100
Port 7: alimentation 0000.0100

Pour activer l'un des ports, vous devez exécuter la commande sudo ./hub-ctrl -h 0 -P 1 -p 1 , où -h indique le concentrateur que nous utilisons (le 0 dans mon cas), -P indique le port (1- e port dans mon cas), et -p indique l'état (0-off, 1-on).



Pour obtenir la configuration comme dans l'image ci-dessus, il était nécessaire d'exécuter les commandes suivantes séquentiellement (pour les ports initialement désactivés):


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 conséquence, il n'est pas difficile d'écrire un script qui fera clignoter les LED pour le plaisir dans la séquence souhaitée. Des exemples de telles choses existent déjà et fonctionnent avec succès:
Code Morse sur un hub USB, guirlandes de Noël , etc. etc. Pour moi, à partir des capacités de hub-ctrl, la fonction de commutation cyclique n'était pas suffisante pour réaliser mes fantasmes d'éclairage momentanés (afin de ne pas perdre de temps à écrire un script, etc.). Ce défaut gênant est éliminé dans le successeur - uhubctl.


UHUBCTL


Le programme uhubctl est un analogue hub-ctrl optimisé et présente quelques différences cosmétiques (et bien sûr, il prend en charge plus d'appareils).


Avec uhubctl work:

Théoriquement, l'utilitaire peut être compilé pour s'exécuter dans un environnement Windows, mais ... Mais pour l'instant, il interagit avec les utilitaires via le pilote winusb.sys, qui ne peut pas accéder directement au concentrateur. Le programme revendique également la prise en charge de l'USB 3.0 (les concentrateurs USB 3.0 prenant en charge la commutation d'alimentation par port, soit dit en passant, sont bien plus que les concentrateurs USB 2.0 avec des fonctionnalités similaires). Lorsque vous travaillez avec un concentrateur USB 3.0 connecté à un port en amont USB 3.0, le programme le définit comme deux concentrateurs virtuels indépendants: USB 2.0 et USB 3.0, et les périphériques USB eux-mêmes seront connectés à l'un d'entre eux en fonction de leurs capacités et de la vitesse de connexion . Par conséquent, pour gérer ces périphériques, le programme active / désactive l'alimentation des concentrateurs virtuels par défaut (vous pouvez basculer l'utilitaire en mode manuel en ajoutant le commutateur -e à la commande de démarrage).


Important: le système d'adressage pour les ports USB peut provoquer une certaine confusion (il est similaire pour hub-ctrl et uhubctl). Lorsqu'il fonctionne, il utilise la même méthode d'adressage similaire à celle du noyau Linux: bx.yz, où b est le numéro de bus USB et x, y, z sont les numéros de port de la chaîne hôte, à partir du concentrateur USB racine pour ce bus. S'il existe plusieurs concentrateurs USB gérés, vous pouvez déterminer les options appropriées en exécutant uhubctl avec l'option -l (emplacement). Je note que cet adressage est semi-stable - il ne changera pas si vous déconnectez et reconnectez les périphériques USB au même port physique.


L'algorithme de compilation du programme est similaire à l'algorithme pour 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) . C'est-à-dire .


,


, "" D-Link - . (PPPS) , USB. , , - GSM- ( ):


image

, D-link DUB-H7, , ( hub-ctrl).


, ...

"… Dlink DUB H-7 , hub-ctrl -p 0 1.47V. " " , /dev/ttyUSBx . . ."


(lsusb, hwinfo, hub-ctrl) USB-, , . usb- ( ). , , . , , (D-link DUB-H7 ver. A5) . , , :)



PS -, D-link DUB-H7 .



( - )? RP1...RP2 ( 0- c).


: - EEPROM 24C02, :



! Toutes les mises à jour et notes provisoires à partir desquelles les habr-articles sont correctement formés peuvent maintenant être vues dans mon laboratoire de télégramme66. Abonnez-vous pour ne pas vous attendre au prochain article, mais pour être immédiatement au courant de toutes les recherches :)


Source: https://habr.com/ru/post/fr430220/


All Articles