ERROR 404

Usb Tutorial

Quelques rappels indispensables à la compréhension de l'USB

Introduction :

Le bus USB est, comme son nom l'indique un bus série (Universal Serial Bus). Le bus USB s'est répandu de façon très significative ces dernières années, que ce soit dans les applications grand public (imprimantes, scanners, appareils photos) ou dans les applications professionnelles (programmateurs, automates, appareils de mesure).

Ce standard (Universal Serial Bus) a été élaboré par Intel, Compaq, Digital, IBM, Microsoft, NEC et Northern Telecom, en 1996 (USB 1.0). Les versions USB 1.1 et USB 2.0 apparurent par la suite.

Le bus USB a une architecture série pour deux raisons principales :

Architecture du bus USB :

Les connexions se font point à point. Le fonctionnement du bus USB est régie par un host unique. Tous les appareils ont une connexion amont vers le host. Il est possible de connecter jusqu'à 127 périphériques simultanément. Les ports USB supportent le Hot Plug & Play, c'est à dire qu'un périphérique peut être connecté et reconnu, sans redémarrage de l'ordinateur.

Les périphériques qui disposent actuellement de ce type de port sont les imprimantes, scanners, webcams, les clés USB... Ils peuvent être connectés directement sur un port USB ou reliés à un Hub (en étoile) comme illustré ci dessous.

architecture du bus

Connectique :

Le câble se compose de 4 fils :

Le câble comporte un connecteur mâle de type A à une extrémité (connexion vers le host) et un connecteur mâle de type B à l'autre extrêmité (connexion vers l'appareil). Un blindage est fortement recommandé pour une utilisation à 12 Mbits/s ou plus. La longueur maximale est de 5 mètres. On retrouve ces deux connecteurs sur l'image ci dessous :

connecteurs USB

Il existe une autre série de connecteurs appelée "mini A" et "mini B". Ce sont les connecteurs que l'on retrouve sur les appareils photo et les lecteurs MP3.

mini B

Si on regarde en détail, on peut s'apercevoir que ces connecteurs disposent non pas de 4 connexions mais de 5 !!! Pourquoi 5 connexions alors que le bus USB a besoin de 4 conducteurs ? En fait, on retrouve les 4 connecteurs du bus USB et une connexion pour la configuration du périphérique utile lors de l'utilisation OTG (On The Go). Pour faire simple, l'OTG est une évolution de la norme USB qui permet la connexion entre deux appareils sans ordinateur. Ex : un appareil photo et une imprimante.

Comme vu plus haut, l'USB a besoin d'un host et un host unique. Lorsque l'on connecte un appareil photo à une imprimante, il faut bien donner le rôle de host à l'un des deux : c'est la fonction de cette connexion supplémentaire sur les connecteurs "mini". A sa première extrémité, le câble mini A/mini A positionne la broche supplémentaire à +Vusb et à sa deuxième extrémité à la masse (GND).

Le rôle host/device sera donc fixé par le sens du câble. Au passage, je précise que le host peut décider d'échanger sa fonction avec le périphérique : le host devient périphérique et le périphérique devient host. Cet échange est normalisé par la norme HNP (Host Negociation Protocol). Je n'irai pas plus loin car ce n'est pas du tout indispensable de connaître ce protocole pour développer un host mais c'est intéressant d'en avoir entendu parler.

Identification des fils :

Vitesse de transmission :

Le bus USB propose plusieurs vitesses de communication :

  • Haute Vitesse (High Speed) : 480 Mbits/s
  • Idéal pour les périphériques très haut débit (disque dur, camera...)

  • Pleine Vitesse (Full Speed) : 12 Mbits/s
  • Idéal pour les périphériques haut débit : scanners, imprimantes....

  • Basse Vitesse (Low Speed) : 1,5 Mbits/s
  • Idéal pour les périphériques d'interface utilisateur : claviers, souris, manettes de jeu...

    Remarque intéressante : il y a souvent confusion entre la version de la norme USB (USB1.0, USB1.1, USB2.0) et la vitesse maximale de communication : par abus, on entend souvent "ma clé usb va vite parce qu'elle est USB2.0". NON ! ce n'est pas la raison.

    En toute rigueur, il faut dire qu'un périphérique est capable de communiquer en Low Speed en Full Speed ou en High Speed. USB1.0 USB1.1 USB2.0 sont les 3 versions actuelles de la norme. USB2.0 ne signifie pas obligatoirement une communication High Speed. Une souris, par exemple, peut répondre à la norme USB2.0 et fonctionner en Low Speed (1.5Mbits/s) !!! Ne vous faites pas avoir par les vendeurs malveillants....

    Les caractéristiques matérielles du bus :

    La transmission sur le bus USB est une transmission quasi différentielle qui se réalise sur les deux lignes de données : data+ et data-.

    La norme USB définie 3 états sur les lignes du bus :

    Le codage des données se fait selon la méthode NRZI (Non Retour à Zéro Inversé). Un "1" est représenté par l'absence de changement d'état du bus, un "0" est représenté par un changement d'état du bus. Ce codage permet d'avoir un débit en Mbits 1,4 fois plus élevé que la bande passante réelle du système, en l'occurrence ici la bande passante du câble. Ce codage est réalisé de façon matérielle, c'est le composant host qui sérialise les données en respectant ce codage. Le codage est donc transparent pour l'utilisateur.

    Ce codage est illustré sur la figure suivante :

    codage NRZI

    Les données sur le BUS USB sont transmises avec le bit de poids faible en premier (« Little Endian »).

    Communications sur le bus USB :

    Le host initie toutes les transactions, un périphérique ne peut pas prendre la parole si l'host ne la lui a pas donnée. On parle de maître-esclave, l'abolition de l'esclavage n'ayant pas été prononcée dans le domaine de l'électronique..

    Les transmissions sur le bus USB se réalisent à l'aide de paquets (principe fondamental du bus USB). Il existe deux types de paquets principaux : les paquets JETON (TOKEN) et les paquets DONNEE (DATA). Les paquets TOKEN permettent d'initier toutes les transactions USB, ils sont produits par le host pour :

    Les paquets DATA, comme leur nom l'indique, sont des paquets qui transportent des données.

    Composition d'un paquet TOKEN :
    8 bits 8 bits 7 bits 4 bits 5 bits
    SYNC PID ADDRESS ENDP CRC
    Composition d'un paquet DATA :
    8 bits 8 bits 0 to 512 bits 16 bits
    SYNC PID PAYLOAD CRC
  • SYNC :
  • Tous les paquets doivent commencer avec un champ SYNC. Le champ SYNC est utilisé pour synchroniser l'horloge du récepteur avec celle de l'émetteur/récepteur.

  • PID :
  • PID signifie Paquet ID. Ce champ est utilisé pour identifier le type de paquet qui est envoyé.

  • ADDRESS :
  • Adresse du périphérique auquel le paquet est destiné.

  • ENDP :
  • Numéro de la terminaison du périphérique : il s'agit d'une terminaison virtuelle. En informatique, ces terminaisons sont appelées "pipes" ou "endpoints".

  • PAYLOAD :
  • Suite de bits contenant les données à envoyer.

  • CRC :
  • Cyclic Redundancy Checks (Contrôle de redondance cyclique) : il s'agit d'une suite de bits permettant de vérifier que les données transmises ont été transférées sans erreur.

    Il existe plusieurs types de paquets identifiés par leur PID :

  • SETUP :
  • Il permet d'indiquer au périphérique que le host veut lui envoyer une commande.

  • IN :
  • Il permet d'indiquer au périphérique qu'il est autorisé à envoyer des données.

  • OUT :
  • Il permet d'indiquer au périphérique que le host va lui envoyer des données.

  • DATA :
  • Il permet au host ou au périphérique d'envoyer des données.

  • ACK :
  • Il permet d'indiquer que la transmission a bien été reçue.

  • NAK :
  • Il permet d'indiquer que le périphérique n'a pas de donnée à envoyer.

    Ensuite ces différents paquets sont organisés dans un certain ordre ; c'est ce qu'on appelle le type de transfert.

    Il existe 4 types de transfert en USB :
  • Control Transfert :
  • Ce transfert est régulièrement utilisé pour les opérations de commande et d'état. Il est utilisé par les fonctions d'initialisation.

  • Interrupt Transfert :
  • Ce transfert est utilisé lorsque le temps de latence doit être garanti. On l'utilise par exemple pour les périphériques HID tels que souris et claviers.

  • Isochronous Transfert :
  • C'est un transfert qui garantit la bande passante. Il est utilisé pour les périphériques dont le flux doit être continu comme par exemple une caméra ou un périphérique audio.

  • Bulk :
  • C'est le transfert qui est utilisé lorsque de grandes quantités de données sont échangées. Ce transfert a l'avantage de prendre le maximum de la bande passante si elle est disponible. C'est le protocole qui est utilisé par les scanners, les imprimantes, les disques dur, les clés USB.

    L'énumération :

    Le terme "énumération" désigne un processus USB par lequel le système identifie et configure le périphérique en lui donnant une adresse unique. C'est une gestion dynamique de la connexion et de la déconnexion des périphériques reliés à un bus USB.

    Cette phase d'énumération se produit lors de chaque connexion de périphérique. Lors de cette phase, le périphérique fournit au host une suite de descripteurs qui permettent son identification complète. Le host assigne une adresse unique au périphérique (adressage dynamique) et configure le périphérique.

    Cette phase d'énumération est totalement transparente lors de la connexion d'un périphérique sur un ordinateur, mais lorsque l'on développe un host ou un périphérique USB, il faut obligatoirement comprendre et réaliser l'énumération pour qu'une communication soit possible.

    Au passage, notez que tous les périphériques qui n'ont pas été énumérés correctement n'ont pas le droit de consommer plus de 100 mA sur le bus. Cependant, on peut trouver dans le commerce tout un tas d'objet "dit USB" qui ne respectent pas cette norme : lampe USB, aspirateur USB, et même chauffe-tasse.... C'est uniquement des objets qui prennent l'alimentation sur le bus de façon tout à fait illégale, mais les PCs, en général, ne contrôlent pas la consommation sur les ports USB.

    La détection de la vitesse du périphérique :

    Lors de la connexion d'un nouveau périphérique, le host doit en premier lieu reconnaître la vitesse du périphérique afin de pouvoir dialoguer avec lui. Pour cela, la norme USB définit un protocole d'identification de vitesse :

    Dès son branchement, le périphérique doit mettre une des lignes de donnée au niveau haut via une résistance de 1.5kohms. Le host détermine donc la vitesse en reconnaissant le niveau haut sur l'une des deux lignes. Si la ligne data- est portée au niveau haut,il s'agit d'un périphérique LOW SPEED. Si la ligne data+ est portée au niveau haut, il s'agit d'un périphérique FULL SPEED.

    Remarque : pour les périphériques HIGH SPEED, l'énumération se réalise en FULL SPEED. C'est après l'énumération que le host envoie une commande pour changer de vitesse et ainsi passer en HIGH SPEED.

    Changement d'adresse :

    C'est la première commande à faire : le host doit envoyer une requête pour attribuer une nouvelle adresse au périphérique. Pour cela, le host envoie une requête appelée SET_ADDRESS. Cette requête débute par un paquet SETUP suivi de 8 octets de données identifiant la requête SET_ADDRESS.

    Pour s'assurer que le périphérique a bien interprété la requête, le host lui envoie un paquet IN auquel le périphérique répond par un paquet DATA ne contenant aucune donnée (uniquement le PID et le CRC).

    Sur la figure ci-dessous, en jaune on visualise les paquets envoyés par le périphérique et en gris ceux envoyés par le host.


    SET_ADDRESS

    La requête est constituée de 8 octets qui sont détaillés ci-dessous :


    Requête détaillée
    Identification du périphérique :

    Pour identifier les périphériques (clé USB, souris etc...) qui sont connectés sur le bus, le host envoie une fonction appelée GET_DESCRIPTOR à laquelle le périphérique doit répondre en envoyant ses identifiants. Cette requête débute par un paquet SETUP suivi de 8 octets de données identifiant la requête GET_DESCRIPTOR.

    Le périphérique envoie ensuite ses identifiants dans un paquet IN. Le host peut ainsi connaître le fabriquant du périphérique, le type du produit ainsi que la classe du produit (ex HID, Mass Storage).

    Sur la figure ci-dessous, en jaune on visualise les paquets envoyés par le périphérique et en gris ceux envoyés par le host.


    GET_DESCRIPTOR

    Les identifiants sont envoyés à l'aide de 2 paquets de 8 octets et 1 paquet de 2 octets, soit au total 18 octets. La signification des différents octets est présentée dans le tableau suivant :

    1 byte Constant 0x18
    1 byte Constant 0x01
    2 bytes USB version (1.01, 2.00)
    1 byte Device Class
    1 byte Device SubClass
    1 byte Device Protocol
    1 byte Max Packet size
    2 bytes VID vendor ID
    2 bytes PID poroduct ID
    1 byte Product number
    1 byte Vendor index
    1 byte Device name index
    1 byte Serial number index
    1 byte Configuration number


    Les fonctions spécifiques aux clés USB :

    Une clé USB est une mémoire flash qui fonctionne sur le bus USB, elle répond donc au protocole USB vu dans le chapitre précédent.

    Dans un premier temps, la clé répondra aux requêtes USB standards (énumération) puis elle répondra aux requêtes spécifiques qui permettront d'écrire et de lire dans sa mémoire flash. L'USB, comme nous l'avons vu lors de l'énumération, est un protocole qui permet de diviser les périphériques en différentes classes. Cette division permet aux utilisateurs de ne pas avoir à installer un driver sur tous les ordinateurs sur lesquels ils branchent une clé USB.L'ordinateur va interroger la clé pour savoir à quelle classe elle appartient. Il utilisera ensuite un driver générique à la classe : la généricité est l'un des grands avantages de l'USB !

    Les clés USB, comme les disques durs, les appareils photos, appartiennent à la classe "stockage de masse" (Mass Storage Class). Le numéro de cette classe est donné dans le descripteur d'interface : il s'agit du numéro 0x08.

    Cette classe se subdivise en deux sous-classes :

    Ces deux sous-classes définissent deux protocoles différents d'accès au stockage des données : le premier utilise uniquement les transferts Bulk pour échanger des données, tandis que le second utilise le Control Transfert pour envoyer la commande : le Bulk pour envoyer les données et le Transfert Interrupt pour recevoir l'acquittement de la commande.

    Les PCs utilisent uniquement le Bulk Only qui est un protocole plus rapide et qui peut être considéré comme plus simple. Ce protocole utilise les fonctions SCSI génériques qu'il empaquette dans des paquets USB. Ce protocole est donc beaucoup plus générique que son homologue. D'autre part, le protocole Bulk/Control Transfer/Transfert Interrupt est condamné à disparaître dans les années à venir.

    D'autre part, vu que ce protocole est celui utilisé par les PCs, on peut avoir un exemple concret (reverse engineering) des échanges qui sont réalisés pour lire/écrire sur les supports de stockage de masse. N'hésitez pas à regarder la page consacrée aux techniques de développement sur le bus USB.

    Le protocole Bulk Only :

    Le protocole Bulk Only utilise uniquement 2 types de paquet USB :

    Ce protocole s'organise en trois phases :

    Illustration de ce protocole :
    protocole Bulk Only

    Le paquet CBW :

    C'est le paquet dans lequel la commande est envoyée. Il est composé de 31 octets envoyés dans un paquet OUT. Les quatre premiers octets sont la signature du paquet 'USBC'. Cette signature reste constante et permet la reconnaissance d'un paquet CBW.

    Les quatre octets suivants sont un 'tag' qui sera retourné avec le paquet CSW. Ces quatre octets ne sont pas utiles pour le fonctionnement de la clé. Cependant, le host pourra, lors de la réception du paquet CSW, contrôler que le 'tag' est identique à celui envoyé dans la commande CBW. On retrouvera ensuite une série d'octet qui coderont la commande à réaliser, par exemple read (address, sector number,...).

    Le paquet de données :

    C'est le paquet qui contient les données utiles. C'est à l'intérieur de ce paquet que l'on écrira les données.

    Le paquet CSW :

    C'est le paquet d'acquittement de la commande. Ce paquet renvoie la/les erreur(s) qui se sont produites lors de la précédente commande.

    Présentation du stockage de masse

    Dans le domaine informatique, le premier besoin qui est apparu est le besoin de sauvegarder des données. Pour cela, de nombreux périphériques ont été développés : disques durs, cartes mémoire, clés USB. Il a donc fallu choisir arbitrairement une unité de stockage élémentaire. L'élément qui est utilisé sur les périphériques de stockage de masse est appelé un « secteur ». Il est composé de 512 octets soit 4096 bits. Ce choix résulte d'un compromis entre la taille des adresses et la taille des données.

    Du point de vue de l'utilisateur, un périphérique de stockage de masse apparaît comme une succession de secteurs. On retrouve cette organisation en secteur sur tous les périphériques de stockage de masse courants. Cette organisation implique une écriture/lecture au minimum d'un élément mémoire, c'est à dire au minimum une écriture/lecture de 512 octets. Un secteur est indivisible. Par conséquent, lorsqu'on voudra modifier un octet sur une clé USB, il faudra commencer par lire le secteur qui contient l'octet, modifier l'octet, puis ré-écrire entièrement le secteur.

    Mes autres pages USB