Site : tvaira.free.fr

Mise en oeuvre d’un périphérique USB sous Linux

Il est conseillé de lire ou de s’aider de ce document avant de poursuive.

Attention : Ce document décrit la prise en charge du péripéhrique USB : GPS Receiver de MTK. Vous pouvez l’adapter en fonction de vos besoins.

Prise en charge

Avant :

$ lsusb > lsusb-avant.txt
$ lsmod > lsmod-avant.txt
$ dmesg > dmesg-avant.txt

Brancher maintenant le périphérique USB.

Après :

$ lsusb > lsusb-apres.txt
$ lsmod > lsmod-apres.txt
$ dmesg > dmesg-apres.txt

Analyse :

$ diff lsusb-avant.txt lsusb-apres.txt 
> Bus 002 Device 011: ID 0e8d:3329 MediaTek Inc.

$ diff dmesg-avant.txt dmesg-apres.txt 
> [204555.128418] usb 2-1.4: new full-speed USB device number 10 using ehci-pci
> [204555.223664] usb 2-1.4: New USB device found, idVendor=0e8d, idProduct=3329
> [204555.223669] usb 2-1.4: New USB device strings: Mfr=3, Product=4, SerialNumber=0
> [204555.223672] usb 2-1.4: Product: GPS Receiver
> [204555.223674] usb 2-1.4: Manufacturer: MTK
> [204555.257427] cdc_acm 2-1.4:1.1: ttyACM0: USB ACM device
> [204555.257994] usbcore: registered new interface driver cdc_acm
> [204555.257997] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

$ diff lsmod-avant.txt lsmod-apres.txt 
> cdc_acm                26991  2

$ modinfo cdc_acm
filename:       /lib/modules/3.8.0-44-generic/kernel/drivers/usb/class/cdc-acm.ko
alias:          char-major-166-*
license:        GPL
description:    USB Abstract Control Model driver for USB modems and ISDN adapters
author:         ...
srcversion:     AD91845189110F8BEC40793
...
alias:          usb:v0E8Dp3329d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0E8Dp0003d*dc*dsc*dp*ic*isc*ip*in*
...

$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 sept. 18 16:24 /dev/ttyACM0
  • le périphérique USB a été détecté physiquement par le noyau (cf. lsusb et dmesg)
  • c’est un “GPS Receiver” de MTK (idVendor=0e8d, idProduct=3329)
  • ce périphérique (idVendor=0e8d, idProduct=3329) peut être pris en charge par le module chargeable cdc_acm (cf. lsmod et modinfo)
  • le pilote de périphérique (driver) associé à ce matériel (cdc_acm) a été chargé par le système (cf. dmesg et lsmod)
  • le périphérique sera accessible par le fichier spécial ttyACM0 dans /dev (cf.)

Attention : le périphérique ne sera accessible en lecture/écriture que par l’utilisateur propriétaire root et les membres du groupe dialout.

Droits d’accès

Par défaut, le système applique la politique des droits d’accès rw-rw---- pour ce type de périphérique USB :

$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 sept. 18 16:24 /dev/ttyACM0

Ici, le périphérique sera accessible en lecture/écriture par l’utilisateur propriétaire root et les membres du groupe dialout. Tous les autres (other) utilisateurs auront aucun accès.

Pour modifier cette situation, vous avez les possibilités suivantes :

  • changer les droits manuellement (à chaque fois !) : $ sudo chmod 666 /dev/ttyACM0
  • ajouter l’utilisateur demandeur (ici toto) dans le groupe dialout : $ sudo adduser toto dialout

Pour une gestion automatique, il faudra passer par udev qui est maintenant le service qui prend en charge le répertoire /dev.

$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 sept. 18 16:24 /dev/ttyACM0

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0e8d", ATTRS{idProduct}=="3329", MODE="0666"

$ ls -l /dev/ | grep ACM
crw-rw-rw-  1 root dialout   166,   0 sept. 18 17:08 ttyACM0

Il est aussi possible de créer un lien symbolique au choix :

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0e8d", ATTRS{idProduct}=="3329", MODE="0666", SYMLINK+="gps"

$ ls -l /dev/ | grep "\(ACM\|gps\)"
lrwxrwxrwx  1 root root             7 sept. 18 17:10 gps -> ttyACM0
crw-rw-rw-  1 root dialout   166,   0 sept. 18 17:10 ttyACM0

Ou de fixer le nom du fichier spécial :

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0e8d", ATTRS{idProduct}=="3329", MODE="0666", NAME="ttyUSB1", 
SYMLINK+="gps"

$ ls -l /dev/ | grep "\(gps\|USB\)"
lrwxrwxrwx  1 root root             7 sept. 18 17:12 gps -> ttyUSB1
crw-rw-rw-  1 root dialout   166,   0 sept. 18 17:12 ttyUSB1

Tests

Si le périphérique émet périodiquement des trames (ce qui est le cas ici), il est possible de tester la réception avec la commande screen (Ctrl-a k pour sortir) ou avec picocom (Ctrl-a Ctrl-x pour sortir) :

Exemple pour une périphérique NMEA 183 :

$ screen /dev/ttyACM0 115200
$GPRMC,000936.799,V,0000.0000,N,00000.0000,E,,,060180,,*10
$GPVTG,,T,,M,,N,,K*4E
$GPGGA,000937.799,0000.0000,N,00000.0000,E,0,00,,,M,,,,0000*04
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,000937.799,V,0000.0000,N,00000.0000,E,,,060180,,*11
$GPVTG,,T,,M,,N,,K*4E
$GPGGA,000938.799,0000.0000,N,00000.0000,E,0,00,,,M,,,,0000*0B
...

$ picocom -b 115200 /dev/ttyACM0 
picocom v1.4

port is        : /dev/ttyACM0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
escape is      : C-a
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : ascii_xfr -s -v -l10
receive_cmd is : rz -vv

Terminal ready
$GPGGA,064509.842,4405.2015,N,00457.8701,E,0,00,,,M,,,,0000*05
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,12,29,80,028,,31,61,278,,25,55,092,,21,29,178,*73
$GPGSV,3,2,12,26,28,296,,12,17,102,,02,14,041,,14,06,218,*74
$GPGSV,3,3,12,05,06,076,,20,03,123,,23,02,333,,16,02,290,*77
$GPRMC,064509.842,V,4405.2015,N,00457.8701,E,,,041015,,*1E
$GPVTG,,T,,M,,N,,K*4E
...

Remarque : 115200 est le débit de la “ligne” en bits/s.

Ou avec le logiciel cutecom :

Programmation : Mise en oeuvre d’un port série sous Qt [PDF]

Retour au sommaire