Guide USB pour Gentoo Linux Shyam Mani Clément Varaldi L'objectif de ce document est d'aider les utilisateurs à configurer leur USB sous Gentoo Linux et utiliser un certain nombre de périphériques USB. 1.0 2005-03-02 Introduction
Qu'est-ce que l'USB

USB signifie Universal Serial Bus, soit Bus en Série Universelle. Pour faire simple, il s'agit d'une interface externe standard qui permet la communication entre l'ordinateur et plusieurs autres périphériques. Parmi les périphériques les plus communément utilisés actuellement, il y a les claviers, les souris, les mémoires USB, les appareils photos numériques, les graveurs CD et DVD externes, les imprimantes etc.

Il existe actuellement deux versions de l'USB : USB 1.1 et USB 2.0. Dans la mesure où l'USB a toujours proposé une compatibilité ascendante avec les versions antérieures, l'USB 2.0 est compatible avec la version 1.1. Les derniers périphériques USB sont en général compatibles avec l'USB 2.0. L'USB 2.0 permet une vitesse de transmission maximum des données de 480Mbps ou 60Mbps comme pour l'USB 1.1, et c'est là la plus grande différence entre les deux standards. Un autre avantage de l'USB est que tous les périphériques peuvent se connecter et déconnecter à chaud ce qui signifie que vous n'avez pas besoin de redémarrer votre système pour pouvoir utiliser ces périphériques.

Un aperçu technique

Avant de commencer avec les options de configuration du noyau, il est bon d'en apprendre encore un peu plus sur l'USB. Si vous êtes pressés ou que vous souhaitez sauter ce chapitre, passez directement à la configuration du noyau.

Un système USB est constitué d'un contrôleur d'hôte, des hubs, un hub principal. Ces systèmes peuvent supporter jusqu'à 127 périphériques USB en incluant les hubs. Le contrôleur USB fait seulement office d'interface matérielle entre le périphérique USB et le système d'exploitation. Il existe une poignée de HCI (Host Controller Interface pour Interface de Contrôleur d'Hôte) actuellement en circulation : le OHCI (Open HCI) de Compaq, le UHCI (Universal HCI) et le EHCI (Enhanced HCI) tous les deux d'Intel. UHCI et OHCI sont les deux standards de l'industrie pour le support de l'USB 1.1. EHCI est réservé pour l'USB 2.0.

Le dispositif matériel fournit une interface pour le programmeur qui permet au système d'interagir avec le matériel. C'est le HCD, ou Host Controller Device (Dispositif de Contrôleur d'Hôte). C'est à travers le HCD que le périphérique va interagir avec le logiciel du système. Le diagramme suivant devrait vous aider à comprendre un peu mieux la chose.

(La partie logiciel concerne tous les autres composants mais par souci
de
simplicité ils ne sont pas détaillés

    + -----  Matériel  -----   + ----  Logiciel  ---- + 
    |                          |                      |
    |  [Disp USB] -+-> {EHCI} -+--->  ( EHCD )        | 
    |              |           |                      |  Utilisateur
    |              `-> {UHCI} -+--->  ( UHCD )        |
    |                          |                      |
    + -----  Matériel  -----   + ----  Logiciel  ---- +
    

Le périphérique USB peut soit utiliser un pilote personnalisé soit en utiliser un déjà présent dans le système et qui est basé sur le concept de classe de périphérique. Cela signifie que si un périphérique appartient à une certaine classe alors les autres périphériques appartenant à la même classe peuvent utiliser le même pilote. Parmi ces classes se trouve la classe USB HID (Human Interface Devices pour Dispositif d'Interface Homme-machine) qui rassemble des périphériques d'entrée comme les claviers et les souris ; la classe pour les périphériques USB Mass Storage (Stockage de Masse) qui regroupe des périphériques comme les clefs USB, les appareils photos numériques, les lecteurs audio etc. ; et la classe USB CDC pour Communication Devices Class (Classe de Dispositifs de Communication) qui regroupe essentiellement les modems USB et autres périphériques de ce type.

Qu'est-ce qui est sur votre machine

C'est très facile de savoir si votre machine dispose du support USB 2.0 ou non. Pour le découvrir nous utiliserons la commande lspci.

L'outil lspci fait partie du paquet sys-apps/pciutils. Si vous ne l'avez pas installé, faites-le avec emerge pciutils. Remarquez que vous devez être root pour pouvoir utiliser la commande lspci.
(Sur un système supportant l'USB 1.1, remarquez qu'il n'y a que l'UHCI)

# lspci -v | grep USB
0000:00:04.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB (rev 01) (prog-if 00 [UHCI])

(Sur un système supportant l'USB 2.0 remarquez que vous disposez de EHCI et
UHCI)

00:1d.0 USB Controller: Intel Corp. 82801DB USB (Hub #1) (rev 01) (prog-if 00 [UHCI])
00:1d.1 USB Controller: Intel Corp. 82801DB USB (Hub #2) (rev 01) (prog-if 00 [UHCI])
00:1d.2 USB Controller: Intel Corp. 82801DB USB (Hub #3) (rev 01) (prog-if 00 [UHCI])
00:1d.7 USB Controller: Intel Corp. 82801DB USB EHCI Controller (rev 01) (prog-if 20 [EHCI])

Grâce à la commande lspci nous pouvons découvrir si le système supporte l'USB 2.'. C'est très utile dans la mesure où ça nous permettra d'activer les bonnes options dans le noyau.

Configuration du noyau
Récupérer le noyau

Tout d'abord installez les sources du noyau de votre choix. Pour les besoins de ce guide nous utiliserons gentoo-dev-sources (pour avoir un noyau 2.6.x) et gentoo-sources (pour un noyau 2.4.x). Pour plus d'informations sur les différents noyaux disponibles dans Portage, jetez un oeil sur le Guide noyaux pour Gentoo Linux.

(pour un 2.6.x)
#  emerge gentoo-dev-sources
(pour un 2.4.x)
#  emerge gentoo-sources

Maintenant, passons à la configuration du noyau.

#  cd /usr/src/linux
#  make menuconfig
L'exemple ci-dessus suppose que /usr/src/linux est un lien symbolique pointant vers les sources du noyau que vous souhaitez utiliser. Assurez-vous que c'est bien le cas chez vous.
Options de configuration pour un noyau 2.6.x

Maintenant nous allons jeter un oeil sur certaines des options que nous devrons activer sur notre noyau 2.6 pour assurer un support USB correct pour vos périphériques. Si vous utilisez un noyau 2.4, passez au chapitre sur les options de configuration pour un noyau 2.4.x.

Les exemples dans ce document vous montreront les options de configuration pour un support basique de l'USB ainsi que le support des périphériques les plus communément utilisés comme par exemple les périphériques de stockage de masse USB (pour le support de la plupart des appareils photos et des clefs USB). Si vous disposez d'un périphérique USB spécifique que vous devez configurer lisez votre manuel ou cherchez sur Internet pour savoir si ce périphérique dispose d'un support intégré au noyau ou utilise ses propres pilotes. Remarquez que pour des raisons de simplicité nous compilerons tout dans le noyau. Si vous souhaitez un noyau modulaire assurez-vous de bien noter les différents modules et ajuster vos fichiers de configuration en fonction de ceux-ci.
Device Drivers  --->
  SCSI device support  --->

(Même si le SCSI sera activé automatiquement en sélectionnant le support
de l'USB Mass Storage, vous devrez activer le support de disques.)
---   SCSI support type (disk, tape, CD-ROM)
<*>   SCSI disk support

(Puis passez au support USB)
USB support  --->

(C'est le hub principal et il est nécessaire pour le support USB. Si vous
voulez le compiler comme module, son nom est usbcore.)
<*> Support for Host-side USB 

(Activez cette fonction pour voir vos périphériques USB dans /proc/bus/usb.
Nous vous le recommandons.)
 [*]   USB device filesystem

(Choisissez au moins l'un de ces HCDs. Si vous n'êtes pas sûr,
sélectionnez-les tous.)
--- USB Host Controller Drivers 
<*> EHCI HCD (USB 2.0) support
< > OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support

(Plus bas, activons le support CDC et stockage de masse.)
< > USB Modem (CDC ACM) support
<*> USB Printer support
<*> USB Mass Storage support
 [*]   USB Mass Storage Write-Protected Media Detection (EXPERIMENTAL)

(Ensuite les éléments HID. Vous devez sélectionner le support des entrées
HID si vous avez un périphérique d'entrée USB comme un clavier, une souris,
un joystick...)
--- USB Input Devices
<*> USB Human Interface Device (full HID) support
 [*]   HID input layer support

(Si vous avez une carte réseau USB comme le RTL8150 vous aurez besoin de ces
éléments.)
USB Network Adapters  --->
    <*> USB RTL8150 based ethernet device support (EXPERIMENTAL)

(Si vous avez un convertisseur USB  -> port série comme le Prolific 2303
vous aurez besoin de ces éléments.)
USB Serial Converter support  --->
    <*> USB Serial Converter support
    <*> USB Prolific 2303 Single Port Serial Driver (NEW) 

Maintenant que les options sont mises vous devez (re)compiler le noyau et le support USB devrait être fonctionnel dès le prochain redémarrage sur votre nouveau noyau. Vous pouvez maintenant passer au chapitre Regarder l'USB travailler et vérifiez que tout fonctionne bien comme prévu.

Options de configuration pour un noyau 2.4.x

Nous allons maintenant voir les options que vous devrez activer pour avoir un support correct de vos périphériques USB sur votre machine pour un noyau 1.4. Si vous utilisez un noyau 2.6 allez au chapitre Options de configuration pour un noyau 2.6.x.

Les exemples dans ce document vous montreront les options de configuration pour un support basique de l'USB ainsi que le support des périphériques les plus communément utilisés comme par exemple les périphériques de stockage de masse USB (pour le support de la plupart des appareils photos et des clefs USB). Si vous disposez d'un périphérique USB spécifique que vous devez configurer lisez votre manuel ou cherchez sur Internet pour savoir si ce périphérique dispose d'un support intégré au noyau ou utilise ses propres pilotes. Remarquez que pour des raisons de simplicité nous compilerons tout dans le noyau. SI vous souhaitez un noyau modulaire assurez-vous de bien noter les différents modules et ajuster vos fichiers de configuration en fonction de ceux-ci.
(Cette partie n'est nécessaire que pour ceux qui disposent de
d'interfaces d'entrée USB. Le support est plus tard nécessaire pour le
USB HID)
Input core support  --->
   <*> Input core support
   < >   Keyboard support
   < >   Mouse support
   < >   Event interface support

USB support  --->

(C'est le hub principal et il est nécessaire pour le support USB. Si vous
voulez le compiler comme module, son nom est usbcore.o)
<*> Support for USB

(Activez cette fonction pour voir vos périphériques USB dans /proc/bus/usb.
Nous vous le recommandons.)
 [*]   Preliminary USB device filesystem

(Choisissez au moins l'un de ces HCDs. Si vous n'êtes pas sûr,
sélectionnez-les tous.)
--- USB Host Controller Drivers 
<*>   UHCI Alternate Driver (JE) support
< >   OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support

(Ceci est la section des périphériques. Choisissez seulement ceux dont vous avez
besoin.)
--- USB Device Class drivers 
< >   USB Audio support
<*>   USB Mass Storage support
< >   USB Modem (CDC ACM) support
<*>   USB Printer support

(Ensuite les éléments HID. Vous devez sélectionner le support des entrées
HID si vous avez un périphérique d'entrée USB.)
--- USB Human Interface Devices (HID)
<*>   USB Human Interface Device (full HID) support
 [*]     HID input layer support

(Si vous avez un convertisseur USB -> port série comme le Prolific 2303
vous aurez besoin de ces éléments.)
USB Serial Converter support  --->
    <*> USB Serial Converter support
    <*> USB Prolific 2303 Single Port Serial Driver (NEW)

Maintenant que les options sont mises vous devez (re)compiler le noyau et le support USB devrait être fonctionnel dès le prochain redémarrage sur votre nouveau noyau.

Regarder l'USB travailler
dmesg est votre ami

Le temps est enfin venu de jouer avec vos périphériques USB. Dans ce chapitre nous verrons comment le système répond aux différents périphériques USB. Nous commencerons par connecter une clef USB de 512Mo de mémoire. Vous pouvez utiliser évidemment un périphérique similaire pour suivre l'exemple. Nous commencerons par utiliser dmesg pour voir ce qui se passe et comment le système répond à notre périphérique.

dmesg vous renverra une grosse quantité de messages avant d'arriver à l'information voulue car il lit dans la mémoire tampon des messages du noyau qui stocke tous les messages depuis le démarrage sur le système d'exploitation. Nous avons sélectionné uniquement les portions qui nous intéressent pour plus de lisibilité.
(Connectez votre clef USB sur un port USB libre puis...)
# dmesg

(Le périphérique est connecté en USB 1.1 et récupère une adresse. Nous
remarquons au passage que le HCD est utilisé.)
usb 1-1: new full speed USB device using uhci_hcd and address 2

(L'émulation SCSI est automatiquement activée.)
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 2

(Viennent les informations relatives au périphérique, notamment le numéro du
modèle utilisé.)
usb-storage: waiting for device to settle before scanning
  Vendor: JetFlash  Model: TS512MJF2A        Rev: 1.00
  Type:   Direct-Access                      ANSI SCSI revision: 02
SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)

(La protection d'écriture est un code expérimental sur les derniers noyaux.)
sda: Write Protect is off
sda: Mode Sense: 0b 00 00 08
sda: assuming drive cache: write through
SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)
/dev/scsi/host0/bus0/target0/lun0: p1
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
Attached scsi generic sg0 at scsi0, channel 0, id 0, lun 0,  type 0
usb-storage: device scan complete
(Le périphérique est normalement accessible en montant /dev/sda1.)

(Quand le périphérique est déconnecté le système vous en informera
également.)
usb 1-1: USB disconnect, address 2

Une fois le périphérique connecté et monté vous pouvez y accéder comme si c'était un disque dur normal. Les opérations habituelles comme cp, mv, rm etc. fonctionneront bien. Vous pouvez également initialiser un système de fichiers sur une clef USB.

# mount /dev/sda1 /mnt/usb
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda8             9.4G  7.5G  1.9G  80% /
/dev/hda9              11G  8.1G  2.4G  78% /usr
none                  189M     0  189M   0% /dev/shm
/dev/sda1             490M   34M  457M   7% /mnt/usb
Les appareils photo numériques ont un mode d'accès similaire à celui des clefs USB. Je possède un Nikon Coolpix 5200 et j'accède aux photos de la même manière. L'appareil est reconnu comme étant un périphérique de stockage de masse USB grâce au mode PTP que la plupart des appareils photos utilisent de nos jours. La procédure est exactement la même, c'est pourquoi nous ne l'expliquons pas en détail de nouveau. Remarquez que cela ne fonctionnera pas dans tous les cas ni pour tous les appareils photos disposant d'un support USB (NdT : en réalité, les appareils photos suivent de plus en plus ce mode de fonctionnement mais pour les appareils plus anciens ou certains modèles, le support sous Linux peut être complètement inexistant).

Comment sera reconnue une souris USB pour le cas où vous en auriez une ? Elle sera reconnu comme étant un périphérique HID.

# dmesg | grep USB
drivers/usb/input/hid-core.c: v2.0:USB HID core driver
usb 1-1: new low speed USB device using address 2
input: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on usb-0000:00:07.2-1

Une autre commande très utile que vous pouvez utiliser pour voir le statut de vos ports USB est lsusb. Elle fait partie du paquet sys-apps/usbutils. Nous la présenterons dans le chapitre suivant.

Environnement utilisateur pour l'USB
Outils pratiques

Nous avons vu jusqu'à présent à quel point le noyau et le système supportent l'USB sur Linux. Maintenant nous allons jeter un oeil sur le support proposé par Gentoo pour l'USB pour l'utilisateur.

L'un des outils les plus utiles est lsusb. Il permet de lister tous les périphériques USB connectés au système. L'installer est un jeu d'enfant.

# emerge usbutils

Une fois installé il vous suffit d'exécuter lsusb pour obtenir des informations simples sur les périphériques USB connectés à votre machine.

Vous devez la plupart du temps être root pour pouvoir lancer la commande lsusb. lsusb lit les informations concernant les périphériques USB dans le répertoire /proc/bus/usb. Si vous n'avez pas activé cet élément dans le noyau il y a des chances pour que lsusb ne fonctionne pas du tout. Assurez-vous que le support du système de fichiers /proc est activé dans le noyau et que usbfs est monté dans /proc/bus/usb (ce qui devrait se faire automatiquement).
# lsusb
(Voici la clef USB de 512Mo de chez Transcend)
Bus 001 Device 003: ID 0c76:0005 JMTek, LLC. USBdisk
(Voici la souris optique)
Bus 001 Device 002: ID 046d:c00e Logitech, Inc. Optical Mouse
(Et enfin le hub principal)
Bus 001 Device 001: ID 0000:0000

Si vous faites partie de ceux qui aiment avoir beaucoup d'informations vous pouvez utiliser l'option lsusb -v. Essayez voir la quantité d'informations que vous obtiendrez. Une autre bonne option est d'obtenir une copie de la hiérarchie physique actuelle de votre arborescence USB grâce à lsusb -t. Par exemple :

# lsusb -t
Bus#  1
`-Dev#   1 Vendor 0x0000 Product 0x0000
  |-Dev#   2 Vendor 0x046d Product 0xc00e
  `-Dev#   3 Vendor 0x0c76 Product 0x0005

Vous pouvez alors facilement faire le lien entre les sorties de lsusb et lsusb -t ce qui vous permet de faire du débogage et de comprendre comment fonctionne l'USB.

Connexion à chaud ou à froid

Gentoo met à votre disposition deux paquets : sys-apps/hotplug et sys-apps/coldplug. Ils permettent d'effectuer diverses tâches pour les périphériques que vous pouvez connecter à chaud. Comme toutes les astuces il y a une logique derrière. Nous allons essayer de les explorer.

Le Firmware peut être défini comme un logiciel embarqué sur du matériel. Il est chargé et exécuté mais n'est pas facilement modifiable. De nombreux périphériques disposent d'un firmware pour s'assurer qu'ils fonctionnent correctement. Souvent, le firmware contient du code critique pour s'assurer que le matériel fonctionne comme attendu de lui. Les firmwares sont présents dans bien des périphériques informatiques, depuis les puces ROM jusqu'aux périphériques USB et aux cartes PCMCIA. Quand un périphérique est connecté le firmware (qui peut dans certains cas être également le pilote) est lu et chargé en mémoire. Après quoi le périphérique pourra être utilisé par le système.

Pour faire rapide, Gentoo utilise le paquet sys-apps/hotplug pour gérer la partie firmware des périphériques qui peuvent être connectés à chaud. sys-apps/hotplug utilisera le firmware nécessaire pour rendre utilisable le périphérique. Le firmware doit être mis dans le répertoire /lib/firmware et sera récupéré à cet endroit. Pour le récupérer, l'installation est toujours aussi simple :

# emerge hotplug

Maintenant la question évidente est : Qu'est-ce que coldplug et à quoi ça sert. sys-apps/coldplug fait ce que hotplug fqit, mais il fonctionne pour les périphériques pouvant être connectés à chaud qui sont déjà connectés au moment du démarrage. Un bon exemple serait une carte réseau USB. Jusqu'à présent hotplug se chargeait des deux mais il a été séparé en deux : hotplug et coldplug, chacun ayant son propre objectif. Installez ce paquet si vous disposez de périphériques connectés et que vous devez activer lors du démarrage.

# emerge coldplug
(Et vous pouvez l'ajouter au niveau de lancement boot)
# rc-update add coldplug boot
 * coldplug added to runlevel boot
 * rc-update complete.
Le script d'initialisation ci-dessus se charge de ce que hotplug faisait auparavant (pour les périphériques pouvant être connectés à chaud). hotplug ne dispose désormais plus de script d'initialisation.
Remerciements...
Références

J'ai utilisé un bon nombre de documents sur Internet pour écrire celui-ci. Certains d'entre eux sont très techniques mais vraiment intéressants. Je pense qu'ils méritent tous une certaine attention.

1) Le site officiel pour l'USB ;

2) La FAQ USB ;

3) Le standard OHCI de Compaq ;

4) Le standard UHCI d'Intel ;

5) Le standard EHCI d'Intel ;