Table des matières


Utilisation d'un périphérique HID

Les périphériques de la norme HID permettent d'envoyer des commandes au serveur X. Toutefois toutes les commandes reçues ne sont pas toujours exploitables directement sous linux… C'est pourquoi il est intéressant de pouvoir les "remapper", c'est à dire les attribuer aux commandes linux (inputdev) de notre choix.

Dans ce tutoriel, une télécommande disponible pour 5€65 sera configurée afin d'effectuer de nombreuses actions ainsi que d'émuler le déplacement de la souris.

En second lieu, on verra comment configuer LIRC pour exploiter ce matériel.

Préalables

Identification du matériel compatible

Tout d'abord, lancer la commande suivante afin d'identifier le matériel que vous souhaitez configurer :

cat /proc/bus/input/devices

Dans mon cas, le matériel est le suivant :

I: Bus=0003 Vendor=0755 Product=2626 Version=0110
N: Name="www.irfmedia.com W-01RN USB_V3.1"
P: Phys=usb-0000:00:02.0-7/input0
S: Sysfs=/devices/pci0000:00/0000:00:02.0/usb2/2-7/2-7:1.0/input/input5
U: Uniq=
H: Handlers=sysrq kbd event5
B: PROP=0
B: EV=120013
B: KEY=e080ffdf01cfffff fffffffffffffffe
B: MSC=10
B: LED=1f

I: Bus=0003 Vendor=0755 Product=2626 Version=0110
N: Name="www.irfmedia.com  W-01RN USB_V3.1"
P: Phys=usb-0000:00:02.0-7/input1
S: Sysfs=/devices/pci0000:00/0000:00:02.0/usb2/2-7/2-7:1.1/input/input6
U: Uniq=
H: Handlers=kbd mouse1 event6
B: PROP=0
B: EV=1f
B: KEY=4837fff072ff32d bf54444600000000 1f0001 20c100b17c000 267bfad941dfed 9e168000004400 10000002
B: REL=1c3
B: ABS=100000000
B: MSC=10

Blacklist de l'entrée du périphérique

Afin que les entrées ne produisent pas d'effet direct dans notre serveur X, nous devons lui dire de l'ignorer. Pour cela créer le fichier suivant :

sudo nano /usr/share/X11/xorg.conf.d/50-HID-blacklist.conf

Et y copier ces lignes, en rensigant MatchProduct en fonction de ce que vous avez obtenu ci-dessus :

Section "InputClass"
Identifier "HID blacklist"
MatchProduct "W-01RN USB_V3.1"
Option "Ignore" "on"
EndSection

HID_MAPPER

On va ensuite utiliser le programme présenté ici pour assigner les commandes voulues aux évènements générés parnotre périphérique.

Installation

L'installation de hid_mapper s'effectue parles commandes suivantes :

wget http://www.coldsource.net/hid_mapper_beta.tar.gz
tar zxvf hid_mapper_beta.tar.gz
cd hid_mapper_beta
make
sudo cp hid_mapper /usr/local/bin/
sudo chmod +x /usr/local/bin/hid_mapper

Configuration

Enregistrement des évènements

Nous allons ensuite "écouter ce que raconte notre périphérique lorque nous apuyons sur chacune des touches. Lancer la commande suivante en rensignant les options manufacturer et product avec les ID obtenus précédemment (ici Vendor=0755 et Product=2626) :

sudo hid_mapper --learn --lookup-id --manufacturer '0755' --product '2626' --map ''

Sous la pression d'une touche, on voit apparaitre des lignes similaires à celles-ci :

Found HID device at /dev/hidraw0
038100000000
01 00 00 00 00 00 00 00 00
04003d0000000000
01 00 00 00 00 00 00 00 00

Chaque code tel que 038100000000 ou 04003d0000000000 correspondent à une touche, et ici 010000000000000000 est sans importance puisqu'il apparaît pour chaque touche…

Assignation des évènement à des actions

On relève alors les codes obtenus ci-dessus pour générer au choix 1 ou 2 fichier de configuration : remote.map et mouse.map Les codes d'actions qui peuvent-être utilisées sont disponible dans le fichier /usr/include/linux/input.h.

Fichier remote.map

On constitue le fichier remote.map de la manière suivante, cet exemple correspondant à ma télécommande.

038100000000:KEY_POWER
04003d0000000000:KEY_CLOSE
0100080000000000:KEY_VIDEO
0300170000000000:KEY_TV
0100040000000000:KEY_RADIO
01000c0000000000:KEY_P
0100100000000000:KEY_AUDIO
0300100000000000:KEY_MENU
0300050000000000:KEY_REWIND
02b700000000:KEY_STOP
02b300000000:KEY_FORWARD
02b600000000:KEY_PREVIOUSSONG
02cd00000000:KEY_PLAYPAUSE
02b500000000:KEY_NEXTSONG
02e900000000:KEY_VOLUMEUP
02e200000000:KEY_MUTE
0800070000000000:KEY_HOME
00004b0000000000:KEY_CHANNELUP
02ea00000000:KEY_VOLUMEDOWN
0c00280000000000:KEY_MEDIA
00004e0000000000:KEY_CHANNELDOWN
0000520000000000:KEY_UP
0000500000000000:KEY_LEFT
0000280000000000:KEY_ENTER
00004f0000000000:KEY_RIGHT
0000510000000000:KEY_DOWN
00002a0000000000:KEY_BACK
0000650000000000:KEY_INFO
0100150000000000:KEY_RED
022302000000:KEY_GREEN
028a01000000:KEY_YELLOW
00001e0000000000:KEY_1
00001f0000000000:KEY_2
0000200000000000:KEY_3
022402000000:KEY_PREVIOUS
0000210000000000:KEY_4
0000220000000000:KEY_5
0000230000000000:KEY_6
022502000000:KEY_NEXT
0000240000000000:KEY_7
0000250000000000:KEY_8
0000260000000000:KEY_9
0000270000000000:KEY_0
0200250000000000:KEY_SUBTITLE
0200200000000000:KEY_LANGUAGE
0000290000000000:KEY_CLEAR
0400280000000000:KEY_ZOOM
010100000000:BTN_LEFT  #clic gauche de la souris
010200000000:BTN_RIGHT #clic droit de la souris
Fichier mouse.map

Dans mon cas, ma télécommande a une fonction spéciale d'émulation du déplacement du curseur de la souris, et affiche différents codes en fonction du temps d'appui sur les flèches directionnelles. Celui sera configurable de la manière suivante dans le fichier mouse.map. - REL_Y correspond à un déplacement sur l'axe vertical - REL_X sur l'axe horizontal - Le dernier chiffre de chaque ligne à la taille du déplacement en nombre de pixel.

010000fe0000:REL_Y:-1  # haut -->  -1->-8de plus en plus vite
010000fc0000:REL_Y:-4
010000f80000:REL_Y:-8
010000020000:REL_Y:1    # bas --> 1->8 de plus en plus vite
010000040000:REL_Y:4
010000080000:REL_Y:8
0100fe000000:REL_X:-1     # gauche --> -1->-8 de plus en plus vite
0100fc000000:REL_X:-4
0100f8000000:REL_X:-8
010002000000:REL_X:1       # droite -->  1->8 de plus en plus vite
010004000000:REL_X:4
010008000000:REL_X:8

Lancement

On peut alors lancer le "mappage" pour assigner les nouveaux codes aux évènements envoyés parnotre périphérique.

Manuel

Le démarrage de hid_mapper s'effectue de la manière suivante :

sudo hid_mapper --lookup-id --manufacturer '0755' --product '2626' --map '/repertoire/contenant/remote.map' --map-mouse '/repertoire/contenant/mouse.map'

Automatique

On peut également créer une règle udev pour lancer hid_mapper à la détection du matériel.

Pour cela créer un fichier :

sudo nano /etc/udev/rules.d/10-HID-REMOTE.rules

contenant le code (penser à adapter idVendor et idProduct):

SUBSYSTEM=="usb", ENV{INTERFACE}=="*/2",ATTRS{idVendor}=="0755",ATTRS{idProduct}=="2626",ENV{HID_MAPPER_SUPPORTED}="1", RUN+="/bin/sh -c '/sbin/modprobe -b uinput; sleep 1 && /usr/local/bin/hid_mapper --lookup-id --manufacturer 0755 --product 2626 --map /repertoire/contenant/remote.map --map-mouse /repertoire/contenant/mouse.map 2>&1 &'"

hid_mapper se lancera alors au démarrage et permettra d'assigner des raccourcis clavier aux codes correspondant aux touches de la télécommande.

Utilisation du HID avec LIRC

Pour les habitués de LIRC, il est possible d'utiliser le périphérique précédemment configuré. Pour cela, on attribue un lien symbolique à l' input/eventx générée parhid_mapper en ajoutant la ligne suivante au fichier 10-HID-REMOTE.rules que l'on vient de créer :

KERNEL=="event*",ATTRS{name}=="Generic USB input mapper",SYMLINK="input/hid_mapper"

Il nous faudra également ajouter les codes devinput au fichier /etc/lirc/lircd.conf.

Pour des raisons pédagogiques, admettons que vous avez une télécommande MiroPCTV connectée sur le port série ttyS0 (lirc_serial).

Démarrage manuel

Lancer deux instances lircd, dont l'une est connectée à l'autre :

sudo lircd -H pinsys --device=/dev/ttyS0 --output=/var/run/lirc/lircd1 --pidfile=/var/run/lircd1.pid --listen
sudo lircd -H dev/input -d /dev/input/hid_mapper -o /var/run/lirc/lircd --pidfile=/var/run/lircd.pid --connect=localhost:8765

Démarrage automatique

On doit pour cela mofifier les fichiers de configuration de LIRC pour intégrer le support de notre nouvelle télécommande :

# /etc/lirc/hardware.conf
#
#Chosen Remote Control
REMOTE_MODULES="lirc_dev lirc_serial"
REMOTE_DRIVER=""
REMOTE_DEVICE=""
REMOTE_SOCKET=""
REMOTE_LIRCD_CONF="/etc/lirc/lircd.conf"
REMOTE_LIRCD_ARGS="-H pinsys --device=/dev/ttyS0 --output=/var/run/lirc/lircd1 --pidfile=/var/run/lircd1.pid --listen"
REMOTE_LIRCD2_ARGS="-H dev/input --device=/dev/input/hid_mapper --output=/var/run/lirc/lircd --pidfile=/var/run/lircd.pid --connect=localhost:8765"

#Enable lircd
START_LIRCD="true"
#Try to load appropriate kernel modules
LOAD_MODULES="true"

- Enfin, on modifie le sript de lancement de lirc pour qu'il démarre les 2 instances de lircd :

Editer le fichier /etc/init.d/lirc et le modifier vers la ligne 160 :

- Remplacer :

REMOTE_LIRCD_ARGS=`build_remote_args $REMOTE_LIRCD_ARGS`

par

REMOTE_LIRCD_ARGS=`build_remote_args $REMOTE_LIRCD_ARGS`
REMOTE_LIRCD2_ARGS=`build_remote_args $REMOTE_LIRCD2_ARGS`

- Ainsi que :

start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/lircd -- $REMOTE_LIRCD_ARGS < /dev/null

par:

start-stop-daemon --start --quiet --oknodo --name lirc1 --exec /usr/sbin/lircd -- $REMOTE_LIRCD_ARGS < /dev/null
start-stop-daemon --start --quiet --oknodo --name lirc2 --exec /usr/sbin/lircd -- $REMOTE_LIRCD2_ARGS < /dev/null

Source pricipale : http://forum.xbmc.org/showthread.php?tid=88560&page=17