Le protocole USB
| ||
![]() |
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 :
|
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 |
|
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.
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.
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.
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.