Tout est lié à l'arbitrage. Tout système qui nécessite la connexion de plusieurs appareils a besoin d'un moyen de déterminer qui doit parler quand. Il existe différents schémas que vous attendez en fonction de l'application.
Un exemple courant - dans la mise en réseau, nous avons de nombreux nœuds qui se parlent tous. Cela se fait par chaque nœud ayant une adresse (par exemple, une adresse IP), et lorsqu'un nœud veut parler à un autre nœud, il envoie un paquet à cette adresse. Vous avez ensuite des périphériques tels que des routeurs qui acceptent les paquets arrivant sur plusieurs ports et les transmettent au port approprié. L'arbitrage se fait en utilisant de la mémoire pour stocker les paquets jusqu'à ce que le port de destination soit libre.
Maintenant sur USB. C'est en fait beaucoup plus simple que la mise en réseau car tous les nœuds ne sont pas égaux. Vous avez deux sortes, un hôte et un point de terminaison. Il n'y a qu'un seul hôte, mais il peut y avoir plusieurs points de terminaison. Dans ce cas, l'arbitrage est beaucoup plus facile car seul le port hôte est autorisé à parler à volonté. Les points de terminaison ne sont autorisés à parler que sur demande de l'hôte , et l'hôte ne parle qu'à un seul point de terminaison à la fois.
Pour les paquets hôte-> point d'extrémité, les concentrateurs USB transmettent simplement la demande de l'hôte à tous les points d'extrémité. Étant donné que tous les points d'extrémité ont une adresse, seul celui auquel la demande a été adressée fera quoi que ce soit avec elle (par exemple, répondra), tous les autres ignoreront le paquet.
Pour les paquets endpoint-> host, l'hôte envoie d'abord un paquet à un endpoint spécifique par adresse pour dire "vous pouvez parler maintenant", puis ce endpoint doit immédiatement envoyer une réponse. Étant donné qu'un seul point de terminaison est autorisé à parler à un moment donné, le concentrateur USB achemine simplement le paquet à partir du port qui répond à une demande de l'hôte.
Pour ce qui est de la façon dont l'hôte détermine quels périphériques sont connectés et comment le point de terminaison obtient son adresse, cela est réalisé grâce à l'énumération.
Tous les ports hôte et concentrateur ont des résistances de rappel (15kOhm) sur les lignes D + et D-. Ceux-ci placent les lignes de données de ce port dans un état connu quand aucun périphérique n'est connecté, un état dans lequel le port n'enverra aucune donnée sur les lignes D + / D-.
Lorsqu'un appareil est connecté, il se fait connaître en connectant la ligne de données D + (pleine vitesse) ou D- (basse vitesse) à VCC à l'aide d'une résistance de 1,5 kOhm. Cela déclenche un événement d'énumération. Le port commencera alors le processus de configuration de l'appareil et d'attribution d'une adresse. Si vous deviez brancher deux appareils simultanément, ils seront énumérés un à la fois .
S'il n'y a pas de concentrateur, l'hôte parle simplement au nouveau périphérique et le configure. S'il y a des concentrateurs dans le système, c'est le concentrateur qui signale que le nouveau périphérique est connecté . Si un concentrateur signale qu'un nouveau périphérique est connecté, l'hôte demandera au concentrateur de réinitialiser le nouveau périphérique et de démarrer les communications. Lors de la réinitialisation, le noeud final reçoit une adresse par défaut de 0 (*). L'hôte peut ensuite parler au point de terminaison à l'aide de l'adresse par défaut et le configurer avec une adresse non nulle unique qui lui permettra de savoir quand il est en communication.
(*) Étant donné qu'un seul périphérique est énuméré à la fois, l'adresse 0 sera toujours unique au périphérique nouvellement connecté.
Vous pourriez alors vous demander: "Comment puis-je alors avoir plusieurs appareils qui parlent tous en même temps?". Supposons que vous ayez une souris, un clavier et une clé USB tous connectés au même concentrateur USB. Nous savons tous que vous pouvez utiliser votre souris et votre clavier en même temps tout en copiant des fichiers vers / depuis votre lecteur flash, mais si un seul appareil peut parler à la fois, comment cela est-il possible?
Eh bien, tout se résume au fait que les quelques centaines de millisecondes qu'il faut à votre cerveau pour remarquer que vous avez appuyé sur une touche et que l'écran se met à jour est une éternité pour l'ordinateur. Une interface USB 2.0 peut fonctionner jusqu'à 480 Mbit / s (USB 3.1 peut fonctionner jusqu'à 10 Gbit / s!), Ce qui signifie que même si l'hôte ne parle qu'à un seul point de terminaison à un moment donné, il passe d'un cycle à l'autre si rapidement que vous le pouvez dis pas que ça le fait.
Hôte USB: "Hé, souris sur le port 1, dites-moi si vous avez déménagé. Ok maintenant, le clavier sur le port 2 avez-vous des touches à signaler? Maintenant, vous êtes sur le port 3, lecteur flash, stockez ces données pour moi. Quelqu'un d'autre à qui je dois parler? Non, d'accord alors, souris sur le port 1, dites-moi si vous avez déménagé ... "
Humain: "Oh regarde, l'ordinateur a remarqué que je viens de déplacer ma souris, d'appuyer sur une touche de mon clavier et de copier une photo sur le lecteur flash, tout en même temps!"
Le périphérique hôte garde une trace des adresses de point d'extrémité qui sont utilisées et enverra des paquets à chacun séquentiellement ou selon les besoins (c'est-à-dire lorsque le système d'exploitation demande l'accès à un périphérique spécifique). Donc, même si tout ne se passe pas simultanément, l'arbitrage est si rapide que les ordinateurs humains ne peuvent pas faire la différence.