Le protocole USB

1) Présentation du protocole
2) Description physique de l'USB
3) Protocole de communication USB
4) Les descripteurs USB
5) L'énumération
Les liens utiles

Cette page a été réalisée, en avril 2003, par 3 élèves de 2ème année de SUPÉLEC Campus de Rennes dans le cadre de leur projet :
  • Fabien CHEVALIER
  • Sylvain RICHERIOUX
  • Nicolas SINÈGRE
  • 1) Présentation du protocole

    L'USB (Universal Serial Bus) est, comme son nom l'indique, un protocole de communication série entre entités. Plusieurs versions sont actuellement disponibles ; nous ne retiendrons pour cette description que la version 1.1 (la plus courante actuellement).

    Du point de vue utilisateur, le bus USB se présente sous la forme d'une architecture étoilée et pyramidale, l'hôte se trouvant au centre du réseau, et les périphériques à l'extérieur. Les échanges de données se font à une vitesse prédéfinie dans la spécification USB : 1,5 Mbits/s ou 12 Mbits/s selon la tolérance du périphérique concerné.
    L'intérêt principal de ce bus est le fait qu'un grand nombre de périphériques (jusqu'à 126) peuvent être connectés simultanément au même hôte, et qu'à tout moment, il est possible de les débrancher et de les rebrancher sans redémarrer le contrôleur hôte (c'est-à-dire l'ordinateur).

    Voici un exemple d'architecture d'un réseau USB :

    Cependant, si pour l'utilisateur la manipulation est aisée, pour le concepteur de circuit électronique ou de logiciels faisant appel aux ports USB, le protocole est loin d'être facile à comprendre et à maîtriser. Dans la suite de ce document, nous efforcerons de rester le plus clair possible, même si cela n'est pas toujours facile.

    2) Description physique de l'USB

    Le bus USB utilise 4 fils, ainsi que des connecteurs particuliers. Deux des fils permettent d'acheminer l'alimentation électrique du périphérique (une souris USB par exemple), et deux véhiculent les données elles-mêmes.

    Connecteur de type A


    Connecteur de type B


    La spécification USB impose une tension maximale de 5V sur les fils et un courant de 500 mA au plus.

    Il est évident que les fils d'alimentation sont toujours au même potentiel (tension de 5V si le périphérique est connecté, 0 sinon). Quant aux fils de données, la tension différentielle entre les deux peut valoir 0, 3,3 ou 5V. (cf spécification USB 1.1 (zip) pour plus de détails).

    3) Protocole de communication USB

    La spécification USB impose un protocole de communication en plusieurs couches superposées ; ce qui permet à l'utilisateur de ne manipuler que la ou les couches supérieures.

    a) Schéma type des transactions

    Les transactions USB se font par l'intermédiaire de l'émission de plusieurs paquets dont le format obéit à un standard.
    Chaque transaction consiste en la succession
    - d'un paquet Jeton (Token)
    - d'un paquet de données (DATA)
    - d'un paquet d'état (HandShake)

    Décrivons rapidement le schéma type d'une communication USB :
    Comme nous l'avons déjà vu, tout le bus est géré par l'hôte, ce qui signifie que c'est lui qui initie toutes les transactions en envoyant un paquet Jeton dans lequel figurent le type de transaction (lecture ou écriture), l'adresse du périphérique de destination, et la terminaison désignée (nous reviendrons sur ce terme plus loin).
    Suit le paquet DATA qui contient les informations réellement utiles dans la transaction, puis le paquet d'état qui indique si l'échange s'est correctement déroulé.

    Pour plus de détails sur le contenu de chaque paquet, se reporter à la spécification USB 1.1.


    b) Les terminaisons

    Nous avons déjà mentionné cette terminologie au-dessus. En fait, comme l'indique le schéma ci-dessous, chaque périphérique USB est décomposé en plusieurs sous blocs, possédant chacun un rôle différent dans la communication. Il s'agit ici de décrire de manière générale cette architecture, et non de développer complètement le fonctionnement précis de chaque étage ; pour cela, comme d'habitude, il conviendra de se reporter à la spécification USB 1.1 (zip).

    Nous pouvons distinguer 3 sous blocs principaux :
    - La partie qui décode l'adresse émise par l'hôte dans le paquet Jeton. Cette entité permet au périphérique de savoir que c'est bien à lui que l'hôte s'adresse,
    - La partie terminaison,
    - La partie réalisant la fonction USB proprement dit.

    Les terminaisons peuvent être vues comme des intermédiaires, des tampons entre le bus et la fonction USB. En effet, il n'est pas possible pour le bus d'écrire directement dans la fonction, et pour la fonction d'écrire directement sur le bus. Les données sont donc stockées temporairement (jusqu'à ce que l'hôte ou le périphérique les lisent) dans les terminaisons. C'est donc pour cette raison que dans le paquet Jeton, l'hôte précise la terminaison à laquelle il veut s'adresser.

    On peut remarquer qu'une même fonction USB peut utiliser plusieurs terminaisons. Dans la spécification USB 1.1 (zip), le nombre de paires de terminaisons est limité à 2, c'est-à-dire que les communications peuvent se faire via EP0 In, EP0 Out, EP1 In et EP1 Out. La paire de terminaisons utilisée par défaut par l'hôte pour dialoguer avec le périphérique est EP0.

    c) Les types de transfert

    La spécification de l'USB définit 4 types de transferts entre l'hôte et les périphériques.


    - Les transferts de commande

    Ce sont les transferts qui sont généralement utilisés pour les opérations de commande et d'état. L'énumération du périphérique par exemple, que nous détaillerons plus loin, se fait en mode transfert de commande.
    Ces transferts surviennent généralement en paquets directs et par rafales initiés par l'hôte, de manière à utiliser le meilleur rendement de livraison.
    Le transfert de commande est fiable : en cas d'erreur sur un paquet, il est répété.
    Plus de détails sur le type de transfert.

    - Les transferts d'interruption

    Ce type de transfert est très utilisé, puisque c'est celui qui est mis en oeuvre pour les souris, les claviers,… En fait, quand le périphérique a une donnée à transférer à l'hôte, il lui faut attendre que l'hôte l'interroge pour lui signaler qu'il a une information urgente à transférer. En fait, ce n'est pas réellement un système d'interruption au sens informatique du terme. L'hôte n'interrompt pas le transfert en cours avec un autre périphérique pour se précipiter vers le périphérique nécessitant un transfert urgent.

    - Les transferts isochrones

    C'est certainement le mode de transfert le plus efficace en matière de débit, de disponibilité de la bande passante et du délai d'attente. Mais c'est aussi le plus complexe. Il est utilisé principalement pour des données ayant des durées de vie critiques tels que les trames audio ou vidéo. Ce type de transfert assure un débit minimum, mais il y peut arriver que certains paquets soient erronnés.

    - Les transferts en Bloc

    Ce type de transfert est utilisé quand il faut transférer une grande quantité d'information pendant en temps relativement court. Par exemple, un appareil photo ou un caméscope utilise ce type de transfert pendant lequel 90% de la bande passante du bus est attribué au périphérique et les paquets erronnés sont répétés.


    4) Les descripteurs USB

    Ce point est essentiel pour le fonctionnement correct du bus. En effet chaque périphérique possède des caractéristiques propres qui le différencient du voisin. L'hôte doit être en possession de toutes ces caractéristiques pour initier une communication avec le périphérique en question.

    Pour cela, chaque périphérique possède « en dur » une série de descripteurs qui précisent complètement son identité, la façon de communiquer avec lui, …

    Il nous semble inutile pour cette partie de développer plus. La page mise en lien est très complète et explique très bien toutes les subtilités des descripteurs.

    La liste des descripteurs sera allongée quand nous traiterons de la spécification HID…

    L'hôte accède aux différents champs des descripteurs par un jeu de requêtes, que nous ne détaillerons pas.

    5) L'énumération

    Nous avons déjà rencontré ce terme. Dans cette partie, nous allons essayer de l'expliquer :

    Le concept de l'énumération est plutôt simple : il s'agit pour le périphérique nouvellement connecté au bus de s'identifier auprès de l'hôte, pour que celui-ci lui attribue une adresse.

    En pratique, l'hôte remarque qu'un nouveau périphérique a été connecté au bus en détectant la variation de tension résultant.
    Après avoir attendu que l'alimentation 5V se stabilise, l'hôte émet un Reset , autorisant ainsi le périphérique à répondre sur l'adresse 0 (qui est réservée à cet effet).
    Le périphérique, à la demande de l'hôte, envoie la liste de ses descripteurs, et se voit attribuer une adresse.

    De son côté, l'hôte informe le système d'exploitation de l'ordinateur qu'un périphérique a été connecté, pour qu'il se charge d'aller chercher le driver correspondant.

    Le périphérique est alors prêt à fonctionner.

    Les liens utiles

    Le site officiel de l'USB : http://www.usb.org

    Le site de Bernard Acquier, très complet sur le sujet : http://www.abcelectronique.com/acquier/USB.html

    Les cours de Bernard Acquier zippés au format PDF

    La spécification USB 1.1, la référence.

     

    Retour vers la page de la documentation USB-HID Retour vers les autres docs