Le protocole USB
2014-09-27
Introduction
Cette page se veut un résumé très simplifié du fonctionnement du protocole USB (Universal Serial Bus). Le but est de pouvoir avoir une vue globale sur le protocole et comprendre des notions de base comme l’endpoint afin de pouvoir manipuler le code d’un pilote ou d’un contrôleur USB.
Le contenu est fortement inspiré de USB in a nutshell par Beyond Logic.
Généralités
L’acronyme USB souligne qu’il s’agit d’un protocol sériel : contrairement à un protocol parallèle, les données ne sont pas transmises bloc par bloc (8 bits par 8 bits par exemple) mais bit par bit ; on ne peut transférer qu’un seul bit à la fois.
Dans une connection USB, une hiérarchie est imposée (c’est un protocole master/slave) : l’un des système est défini comme host (ou master) et l’autre comme device (ou slave).
Le protocole différencie deux types de systèmes : host (l’ordinateur) et device (ce qu’on y raccorde). Les connecteurs USB sont divisés en deux catégories : A pour les host et B pour les device. Les dimensions originelles du connecteurs ont été réduites une première fois pour donner d’abord les connecteur mini, puis une nouvelle fois pour donner les connecteurs micro. Cela a été fait à destination des device et concerne donc d’abord la catégorie B.
Connectique
À l’origine, les deux seuls connecteurs étaient TypeA pour l’host et TypeB pour le device, avec quatre connexions. Lorsqu’il a fallut réduire leur taille (téléphones portables, lecteurs audio, …), on a obtenu les formats MiniA et MiniB d’abord (maintenant dépréciés), puis MicroA et MicroB.
Il s’est avéré aussi que certains dispositifs pouvaient jouer alternativement le rôle d’host ou de device (un téléphone portables branché à un ordinateur ou à un périphérique de stockage par exemple). On a donc ajouté une connexion pour idenfier leur statut de chaque système.
Pour les connecteurs mini et micro, la pin 4 sert à différencier un host d’un device. Les autres pins (pour les six connecteurs) sont dans l’ordre :
- Vcc : alimentation 5V (voir Vcc)
- Data+ : première pin de données
- Data- : seconde pin de données
- GND : la masse (voir GND)
Note : Il y a bien deux connexions pour les données, mais elles ne permettent de transférer qu’un bit à la fois. En effet, USB utilise un code à Non Retour à Zéro Inversé (NZRI) : la tension entre Data+ et Data- est initialisée à une valeur ; pour coder un 1, on inverse cette valeur et, pour un 0, on la laisse en l’état (voir l’article Wikipédia).
Communications
Les communications entre un host et un device sont inhabituelles dans un protocole de communication : c’est toujours l’host qui initie une communication. Il y a trois types de communication : setup, in et out. La première est purement administrative (initialisation des communications) ; la second signifie que l’host requiert de l’information ; la troisième qu’il en envoie.
On notera que l’host ne peux pas émettre puis recevoir des données en un seul échange. En fait, le device comporte ce qu’on appelle des endpoint, ou EP ; chacun de ces endpoint correspond à un tampon (buffer) d’entrée et un de sortie. Voici ce à quoi peut ressembler une communication :
host envoie à device des informations sur
EP0 OUT
device lit
EP0 OUT
, traite les données, écrit le résultat dansEP0 IN
host demande à device les données de
EP0 IN
Note : le « IN » et le « OUT » d’un EP sont relatif à l’host (respectivement données reçues par l’host, données émises par l’host).
EP0
est l’endpoint utilisé pour les tâches administratives (connexion du device, vérification de l’état, …).
Les descripteurs
Un descripteur est un ensemble de données détaillant le fonctionnement du device. Les descripteurs sont organisés en quatre niveau.
descripteur de device : il décrit le device lui-même (il est donc unique) et comporte notament le VID et le PID du device;
decripteur de configuration : le device peut fonctionner selon plusieurs configurations différentes (par exemple, USB permet différentes vitesses de communications selon les besoin);
descripteur d’interfaces : il correspond en fait à un ensemble de descripteurs d’endpoint pour une fonctionnalité donnée (les fonctions impression, scan ou fax d’une imprimante multifonction par exemple);
descripteur d’endpoint : il permet d’expliquer les caractéristiques (taille, comportement) d’un endpoint.