Au départ, je voulais juste parler du hub USB 3.0 des Raspberry Pi, parce qu’il n’est pas trop cher et qu’il fonctionne bien. Mais je suis tombé dans des pages et des pages qui parlent de hub USB et des trucs à prendre en compte.
Commençons par les bases : un hub USB est un appareil qui permet de transformer une prise USB en plusieurs prises USB. Ce n’est pas magique, on va le voir, et il y a de nombreux points à prendre en compte.
Le premier point, important, va venir des performances, avec un truc parfois mal compris. Un hub USB est évidemment un goulet d’étranglement. Si vous mettez deux SSD externes sur un hub USB, ils vont se partager la bande passante. Ce n’est pas binaire, heureusement : si vous n’utilisez qu’un SSD à la fois, il va disposer de toute la bande passante. Mais si vous en utilisez deux en même temps, c’est partagé. C’est aussi le cas si vous avez un hub USB qui intègre de l’Ethernet, par exemple : l’Ethernet et un SSD externe se partageront les 5 Gb/s, ce qui peut ralentir les deux.
Le second point, important, est qu’un hub USB 3.0 est en réalité un hub USB 2.0 et un hub USB 3.0. Dans une prise USB 3.0 (ou une prise USB-C), il y a en effet des broches pour l’USB 2.0 et des broches pour l’USB 3.0 et les deux normes sont totalement séparées. Ça amène un point souvent mal compris : si vous branchez deux périphériques USB 2.0 (par exemples de webcams, des vieux disques durs externes, etc.) sur un hub USB 3.0, ils ne vont pas se partager les 5 Gb/s de l’USB 3.0 et avoir chacun la bande passante maximale, mais ils vont se partager les 480 Mb/s de l’USB 2.0. Il y a une solution bizarre dont je parlerais un jour, mais c’est important.
Le troisième point basique à prendre en compte va venir du nombre de périphériques et de la façon dont on peut chaîner les hubs. Si vous avez besoin de beaucoup de ports USB, il peut être tentant de chaîner les hubs ou d’aller vers des hubs avec beaucoup de prises. Mais dans la pratique, il y a une limite : en USB, le nombre de périphériques ne peut pas dépasser 127 et le nombre de hubs ne peut pas dépasser 5 en cascade. Du coup, c’est parfois un peu compliqué, avec notamment un piège : les rallonges USB actives, qui permettent d’avoir de longs câbles, intègrent généralement un hub USB. Dans la pratique, il faut réfléchir à la façon de brancher les hubs, avec notamment un fonctionnement en étoile.
Plutôt que de mettre le premier hub, de brancher le second sur le premier, le troisième sur le second, etc., il vaut mieux brancher le second sur le premier mais aussi le troisième sur le premier, etc. Le problème n’est pas le nombre de hubs, mais bien la profondeur de la chaîne. Un point à prendre en compte ici est important : certains hubs USB avec 7 ports (pas tous) contiennent en fait deux hubs. Les puces des hubs ne gèrent souvent que 4 prises et donc il y a un chaînage interne.
Dernier point important, l’alimentation. Une bonne partie des hubs USB du marché arrive avec une alimentation qui n’est pas adaptée, quand il y a une alimentation externe. Ce n’est pas nécessairement un problème car vous n’allez probablement pas brancher sept SSD externes sur un hub USB avec 7 ports, mais c’est à prendre en compte. Une prise USB 2.0 peut nécessiter jusqu’à 500 mA, une prise USB 3.0 jusqu’à 900 ma. Donc sur un hub USB 3.0 avec 4 ports, une alimentation de 3,6 A est nécessaire pour fournir de l’énergie à tous les ports. Je n’ai pas trouvé de documentation sur le sujet, mais empiriquement je peux juste dire que le hub n’additionne pas l’énergie fournie par l’ordinateur avec celle de sa prise externe.
Les problèmes des hubs
Maintenant, pourquoi est-ce que j’ai acheté le hub Raspberry Pi ? Parce que les hubs USB que j’ai eu, c’est nul. J’ai utilisé un modèle Amazon pas cher, mais la finition est vraiment mauvaise, et j’avais de temps en temps de déconnexions. Idem avec un vieux hub USB LaCie : de temps en temps, je perdais mon DAC USB au démarrage. J’ai aussi eu des modèles (e test, en cadeau, etc.) avec des prises dans le mauvaise sens ou des modèles USB 1.1 (un goodies pour le boulot). Le hub USB Raspberry Pi est MTT (je vais revenir sur ce point), semble stable – je n’ai pas encore eu des soucis – et s’alimente en USB-C.
Dans la majorité des cas, les hubs USB arrivent avec des alimentations 5 V bas de gamme, pas assez puissantes et avec une prise barrel. L’avantage de la prise USB-C du modèle Raspberry Pi, c’est qu’on peut mettre une alimentation correcte et que c’est plus faible que des prises barrel mal ajustées (c’était le cas sur mon modèle Amazon). Le défaut, c’est qu’on est limité en puissance, mais c’est à cause de l’USB-C. La norme, sans négociation, ne permet que 3 A en 5 V, et même si on mettait une négociation en USB-C, les alimentation capables de fournir 5 A en 5 V se comptent sur les doigts d’une main (en gros, l’alimentation officielle du Raspberry Pi 5). Mais 3 A, c’est trop peu pour avoir quatre périphériques USB 3.0 qui demandent le maximum de la norme. Ce n’est un souci que si vous comptez mettre quatre SSD USB 3.0, ceci dit. Dans mon cas, c’est pour des câbles USB 2.0 (onduleur, DAC, etc.).
Pour le reste, pour 14 €, la finition est correcte et il fonctionne bien. Et en plus, il est MTT, donc.
STT, MTT et PPS
MTT ? Ce sigle signifie Multiple Transaction Translator et c’est un truc qui a de l’importance mais qui n’est pratiquement jamais mis en avant. C’est en fait lié à la prise en charge des périphériques USB 1.1, qui sont assez nombreux dans les faits. Pour différentes raisons, une souris, un clavier, un DAC, etc., ne fonctionnent pas en mode High Speed (480 Mb/s) mais en Full Speed (12 Mb/s). Pour passer d’un mode à un autre, il y a dans le hub un Transaction Translator, qui va simplement prendre en charge le changement de norme. Dans un hub classique, avec un seul Transaction Translator (STT, Single Transaction Translator), ça peut devenir bloquant.
Pour faire court, vous allez perdre des paquets si vous avez plusieurs périphériques qui saturent le bus à 12 Mb/s. Et comme l’USB part du principe que ça n’arrive pas, ça peut être gênant. Typiquement, une souris rapide (1 000 Hz) peut faire perdre des frappes de clavier. Ou, exemple plus pratique, un hub USB avec de nombreux capteurs peut perdre des données. On peut aussi avoir des perturbations audio avec une souris rapide, par exemple. D’un point de vue un peu schématique, on peut imaginer que tous les périphériques lents se partagent les 12 Mb/s alors qu’ils pourraient chacun avoir 12 Mb/s. C’est le fonctionnement avec les hub MTT : il y a un Transaction Translator par port. Vous trouverez des informations sur ça ici.
Le hub Raspberry Pi est de ce type, comme le hub de mon écran. Tous mes autres hubs UBS 2.0 sont STT. Pour le vérifier, c’est (très) compliqué. Les vieux Windows avec les pilotes Intel l’indiquent, mais pas les pilotes Microsoft, obligatoires depuis un moment. Sous macOS, j’ai utilisé le vieux logiciels Apple USB Prober (qui nécessite un compte développeur). Il faut sélectionner le hub (c’est un High Speed device avec un nom genre Hub). Dans Configuration Descriptor (current config), si vous voyez deux Interface, il est MTT (dans Interface #0 – Hub (#1), c’est indiqué explicitement (Multi TT Hub)). Sur un hub STT, il n’y a qu’une ligne Interface.)
Bon, et le PPPS, c’est quoi ? Ça signifie Per-Port Power Switching et c’est une fonction qui permet de couper les ports totalement, logiciellement. Je ne vais pas m’étendre dessus pour une bonne raison : le hub USB Raspberry Pi n’est pas compatible. Par contre, le hub USB de mon écran l’est, et je peux le commander en ligne de commande avec uhubctl.
Dans tous les cas, le hub USB Raspberry Pi a l’avantage d’être MTT, pas trop cher, a priori plus stable que mes autres hubs et d’intégrer de l’USB-C. En gros, il coche pas mal de cases pour un bon hub USB 3.0, et c’est plutôt positif.