Prérequis

Les prérequis pour comprendre et suivre cet article sont :

  • savoir éditer un fichier texte sous Linux
  • savoir utiliser la ligne de commande
  • savoir compiler des sources
  • avoir des connaissances de base à propos de l'USB et du serveur X.org

Méthode

Pour faire fonctionner le périphérique, il est nécessaire de suivre plusieurs étapes :

  • vérifier que le noyau détecte le branchement du périphérique USB
  • charger le pilote permettant de contrôler de périphérique
  • configurer le serveur X.org pour qu'il considère le périphérique comme un pointeur
  • vérifier le bon fonctionnement sous Gimp

Détection du périphérique

Afin de vérifier que le noyau détecte bien le périphérique, branchez ce dernier sur un port USB libre, puis lancez la commande suivante :

shell# dmesg
hub 1-0:1.0: state 7 ports 6 chg 0000 evt 0008
ehci_hcd 0000:00:1d.7: GetStatus port 3 status 001403 POWER sig=k CSC CONNECT
hub 1-0:1.0: port 3, status 0501, change 0001, 480 Mb/s
hub 1-0:1.0: debounce: port 3: total 100ms stable 100ms status 0x501
ehci_hcd 0000:00:1d.7: port 3 low speed --> companion
usb usb3: wakeup_rh (auto-start)
ehci_hcd 0000:00:1d.7: GetStatus port 3 status 003002 POWER OWNER sig=se0 CSC
hub 3-0:1.0: state 7 ports 2 chg 0000 evt 0002
uhci_hcd 0000:00:1d.1: port 1 portsc 01a3,00
hub 3-0:1.0: port 1, status 0301, change 0001, 1.5 Mb/s
hub 3-0:1.0: debounce: port 1: total 100ms stable 100ms status 0x301
usb 3-1: new low speed USB device using uhci_hcd and address 5
usb 3-1: skipped 1 descriptor after interface
usb 3-1: default language 0x0409
usb 3-1: new device strings: Mfr=1, Product=2, SerialNumber=0
usb 3-1: Product: Tablet WP5540U
usb 3-1: Manufacturer: UC-LOGIC
PM: Adding info for usb:3-1
usb 3-1: uevent
usb 3-1: usb_probe_device
PM: Adding info for No Bus:usbdev3.5_ep00
usb 3-1: configuration #1 chosen from 1 choice
usb 3-1: adding 3-1:1.0 (config #1, interface 0)
PM: Adding info for usb:3-1:1.0
usb 3-1:1.0: uevent
usbhid 3-1:1.0: usb_probe_interface
usbhid 3-1:1.0: usb_probe_interface - got id
input: UC-LOGIC Tablet WP5540U as /class/input/input6
drivers/usb/core/file.c: looking for a minor, starting at 96
input,hiddev96: USB HID v1.00 Mouse [UC-LOGIC Tablet WP5540U] on usb-0000:00:1d.1-1
PM: Adding info for No Bus:usbdev3.5_ep81
drivers/usb/core/inode.c: creating file '005'
evbug.c: Connected device: "UC-LOGIC Tablet WP5540U", usb-0000:00:1d.1-1/input0
evbug.c: Event. Dev: usb-0000:00:1d.1-1/input0, Type: 0, Code: 0, Value: 0

Selon les options de compilation de votre noyau, le texte ci-dessus peut être plus ou moins verbeux. La partie importante se résume à la ligne usb 3-1: new low speed USB device using uhci_hcd and address 5 qui nous indique qu'un nouveau périphérique USB a été détecté.

Intéressons nous maintenant à ce périphérique. L'utilitaire lsusb (livré dans la plupart des distributions par le biais du paquet usbutils) permet de scanner les bus USB de la machine pour obtenir des informations sur les périphériques qui y sont attachés :

shell# lsusb
Bus 004 Device 001: ID 0000:0000  
Bus 003 Device 005: ID 5543:0004 UC-Logic Technology Corp. Genius MousePen 5x4 Tablet
Bus 003 Device 001: ID 0000:0000  
Bus 002 Device 001: ID 0000:0000  
Bus 001 Device 001: ID 0000:0000

Nous apprenons ici qu'un périphérique identifié par le numéro constructeur 5543 et l'identifiant produit 0004 est attaché au bus 3 en tant que périphérique 5. Nous pouvons obtenir plus d'informations sur ce périphérique précis :

shell# lsusb -vs 003:005
Bus 003 Device 005: ID 5543:0004 UC-Logic Technology Corp. Genius MousePen 5x4 Tablet
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x5543 UC-Logic Technology Corp.
  idProduct          0x0004 Genius MousePen 5x4 Tablet
  bcdDevice            0.00
  iManufacturer           1 UC-LOGIC
  iProduct                2 Tablet WP5540U


  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Devices
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              2 Tablet WP5540U
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.00
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     212
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10

Cette commande nous fournit amplement les renseignements que nous attendions. Nous apprenons donc que le périphérique attaché est de type Human Interface Devices (Périphérique d'interface homme/machine), qu'il est vendu par UC-Logic Technology Corp., et qu'il s'agit du produit Genius MousePen 5x4 Tablet. Nous apprenons également (et c'est le plus intéressant) qu'il est basé sur un produit nommé Tablet WP5540U.

Installation et chargement des pilotes

Le fait de connaître le nom générique du produit (Tablet WP5540U) permet d'avoir un peu plus d'informations et d'aide par le biais du Web. C'est ainsi que j'ai découvert le pilote WizardPen dérivé du pilote acecad.

Vous pouvez obtenir les sources de ce dernier à l'adresse : http://www.stud.fit.vutbr.cz/~xhora..., puis extraire les sources de l'archive :

shell# wget http://www.stud.fit.vutbr.cz/~xhorak28/wizardpen-driver-0.5.0.tar.gz
shell# tra -xzvf wizardpen-driver-0.5.0.tar.gz
shell# cd wizardpen-driver-0.5.0

Avant toute chose, c'est toujours une bonne idée de jeter un oeil aux fichiers README, INSTALL et BUGS. On y apprend beaucoup de choses intéressantes qui peuvent très souvent nous éviter de perdre des heures à essayer de comprendre un comportement aléatoire ou une erreur de compilation.

Dans notre cas, nous apprenons qu'il est nécessaire que le noyau soit compilé avec le support des évènements CONFIG_INPUT_EVDEV. Il est également nécessaire de récupérer les fichiers d'en-tête du serveur X ainsi que l'utilitaire xmkmf. Tout ceci est parfaitement expliqué dans le fichier INSTALL.

Une fois les dépendances résolues, nous pouvons nous lancer dans la compilation du pilote :

shell# xmkmf 
imake -DUseInstalled -I/usr/lib/X11/config
shell# make
rm -f wizardpen.o
gcc -m32 -O2 -fno-strength-reduce -fno-strict-aliasing   -fPIC  -I../Xincludes -I. -IXincludes/xc/programs/Xserver/hw/xfree86/common -IXincludes/xc/programs/Xserver/hw/xfree86/loader -IXincludes/xc/programs/Xserver/hw/xfree86/os-support    -IXincludes/xc/programs/Xserver/include -IXincludes/xc/programs/Xserver/mi -IXincludes/xc/exports/include/X11      -IXincludes/xc/include/extensions  -I/usr/include    -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L                    -D_POSIX_SOURCE -D_XOPEN_SOURCE                                 -D_BSD_SOURCE -D_SVID_SOURCE                                 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64                                  -DSHAPE -DXINPUT -DXKB -DLBX -DXAPPGROUP -DXCSECURITY -DTOGCUP         -DXF86BIGFONT -DDPMSExtension   -DXPRINT -DPIXPRIV -DPANORAMIX   -DRENDER -DRANDR       -DXFIXES -DDAMAGE -DCOMPOSITE -DXEVIE    -DGCCUSESGAS -DAVOID_GLYPHBLT -DPIXPRIV -DSINGLEDEPTH                          -DXFreeXDGA -DXvExtension                               -DXFree86LOADER -DDLOPEN_HACK -DXFree86Server                           -DXF86VIDMODE                   -DXvMCExtension                                 -DSMART_SCHEDULE                -DBUILDDEBUG -DXResExtension                            -DX_BYTE_ORDER=X_LITTLE_ENDIAN -DXORG_VERSION_CURRENT="(((6) * 10000000) + ((8) * 100000) + ((99) * 1000) + 903)" -DNDEBUG   -DFUNCPROTO=15 -DNARROWPROTO  -DIN_MODULE -DXFree86Module -DLINUX_INPUT   -c wizardpen.c
rm -f wizardpen_drv.so
gcc -m32 -o wizardpen_drv.so -shared  -nostdlib  wizardpen.o -Wl,-Bstatic -lgcc -Wl,-Bdynamic

La compilation se passe normalement sans aucun souci et un fichier nommé wizardpen_drv.so doit apparaître dans le dossier. Ce fichier correspond au pilote exploitable par le serveur X pour comprendre les données renvoyées par la tablette par le biais du fichier /dev/input/eventX (avec X le numéro du périphérique de type input/event).

Afin que le serveur X détecte ce pilote, nous devons le copier dans un de ses répertoires de pilote. Ces derniers peuvent varier selon la distribution utilisée. Sous ma Gentoo, il s'agit du répertoire : /usr/lib/xorg/modules/input/ :

shell# ls /usr/lib/xorg/modules/input/
evdev_drv.so  kbd_drv.so  keyboard_drv.so  mouse_drv.so  synaptics_drv.so

Si cela ne correspond pas à votre distribution, examinez le résultat de la recherche suivante, il devrait vous guider vers le bon répertoire :

shell# find /usr/ -type f -name "*_drv.so"
/usr/lib/xorg/modules/input/keyboard_drv.so
/usr/lib/xorg/modules/input/synaptics_drv.so
/usr/lib/xorg/modules/input/mouse_drv.so
/usr/lib/xorg/modules/input/evdev_drv.so
...

Nous pouvons alors copier le pilote fraîchement compilé dans ce répertoire.

shell# cp wizardpen_drv.so /usr/lib/xorg/modules/input/

Le pilote est maintenant installé, il nous suffit de configurer le serveur X pour pouvoir l'utiliser. Cependant, afin de nous faciliter la tâche, nous allons ajouter une règle udev afin de s'assurer que la tablette s'attache toujours au même fichier dev. En effet, vous pouvez remarquer que selon l'ordre dans lequel vous branchez ou débranchez vos périphériques USB, ceux-ci se voient affecter des numéros de périphériques différents. Pour palier à ce problème, nous allons demander au nouveau système udev de créer automatiquement un fichier symbolique vers le fichier auquel est attaché notre tablette.

Pour ce faire, rajoutez la ligne suivante au fichier /etc/udev/rules.d/60-persisten-input.rules (peut dépendre de votre distribution) :

KERNEL=="event*", ENV{ID_MODEL}=="Tablet_WP5540U", SYMLINK="tablet"

Ainsi nous sommes certain que la tablette sera toujours accessible par le biais du lien symbolique /dev/tablet. Nous pouvons tester que la règle udev fonctionne bien grâce à udevtest :

shell#  udevtest /sys/class/input/event3/
This program is for debugging only, it does not create any node,
or run any program specified by a RUN key. It may show incorrect results,
if rules match against subsystem specfic kernel event variables.

main: looking at device '/class/input/input9/event3' from subsystem 'input'
udev_rules_get_name: rule applied, 'event3' becomes 'input/event3'
run_program: 'usb_id -x'
run_program: '/lib/udev/usb_id' (stdout) 'ID_VENDOR=UC-LOGIC'
run_program: '/lib/udev/usb_id' (stdout) 'ID_MODEL=Tablet_WP5540U'
run_program: '/lib/udev/usb_id' (stdout) 'ID_REVISION=0000'
run_program: '/lib/udev/usb_id' (stdout) 'ID_SERIAL=UC-LOGIC_Tablet_WP5540U'
run_program: '/lib/udev/usb_id' (stdout) 'ID_TYPE=hid'
run_program: '/lib/udev/usb_id' (stdout) 'ID_BUS=usb'
run_program: '/lib/udev/usb_id' returned with status 0
udev_rules_get_name: reset symlink list
udev_rules_get_name: add symlink 'tablet'
run_program: 'path_id /class/input/input9/event3'
run_program: '/lib/udev/path_id' (stdout) 'ID_PATH=pci-0000:00:1d.1-usb-0:1:1.0'
run_program: '/lib/udev/path_id' returned with status 0
udev_rules_get_name: add symlink 'input/by-path/pci-0000:00:1d.1-usb-0:1:1.0-event-'
udev_device_event: device '/class/input/input9/event3' already in database, validate currently present symlinks
udev_node_add: creating device node '/dev/input/event3', major = '13', minor = '67', mode = '0600', uid = '0', gid = '0'
udev_node_add: creating symlink '/dev/tablet' to 'input/event3'
udev_node_add: creating symlink '/dev/input/by-path/pci-0000:00:1d.1-usb-0:1:1.0-event-' to '../event3'
main: run: '/sbin/modprobe '
main: run: 'udev_run_devd input'
main: run: 'socket:/org/kernel/udev/monitor'
main: run: 'socket:/org/freedesktop/hal/udev_event'

Configuration du serveur X

Maintenant que le pilote est compilé et que tout est prêt pour la tablette, il ne reste plus qu'à configurer le serveur X pour qu'il prenne en compte ce nouveau périphérique de pointage. Pour ce faire, il faut éditer (en tant que root) le fichier de configuration /etc/X11/xorg.conf.

Vous trouverez dans ce dernier une ou plusieurs section InputDevice. A la suite de ces dernières, vous pourrez ajouter le bloc suivant :

Section "InputDevice"
        Identifier      "Tablette"
        Driver          "wizardpen"
        Option          "Device"        "/dev/tablet"
        Option          "Mode"          "Relative"
        Option          "TopX"          "2836"
        Option          "TopY"          "4077"
        Option          "BottomX"       "30896"
        Option          "BottomY"       "30031"
        Option          "MaxX"          "30896"
        Option          "MaxY"          "30031"
EndSection

Puis, afin d'indiquer au serveur d'utiliser la tablette lorsqu'elle est présente, il faut ajouter, dans la section ServerLayout, une ligne :

        InputDevice     "Tablette" "SendCoreEvents"

Les valeurs des options TopX, TopY, ... peuvent être obtenues en utilisant l'utilitaire de calibrage présent avec les sources du pilote dans le répertoire calibrate.

Vous pouvez maintenant redémarrer votre serveur X avec ce nouveau fichier de configuration.

Utilisation sous Gimp

Afin de vérifier que le tout fonctionne bien, et après redémarrage du serveur X, on peut tester la tablette sous un logiciel conçu pour en tirer partie. Gimp est un choix de prédilection puisqu'il est possible de tester notamment les effets de pression.

Attention toutefois, le fait d'avoir une tablette graphique ne fais pas de vous un artiste ... je sais .. moi aussi j'ai été déçu ! :)