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

Les six principaux connecteurs USB existant (source)
Les six principaux connecteurs USB existant (source)

À 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.

Les quatre fils d'un câble USB (source)
Les quatre fils d'un câble USB (source)

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 :

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 :

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.