2019-02-21
md
Configuration de télécommandes à infrarouge sur l'Orange Pi Zero
Prise en charge d'une télécommande IR avec python-evdev->

Depuis des années, le nombre de télécommandes à infrarouge (IR) ne cesse de croître chez moi alors que l'équipement électronique qu'elles contrôlaient disparaît. Or la carte d'expansion achetée avec l'ordinateur monocarte Orange Pi Zero contient un récepteur infrarouge. C'était donc prévisible que j'essayerais d'utiliser une télécommande surnuméraire avec l'Orange Pi Zero. En deux billets, voici comment j'ai procédé.

Ce premier billet est consacré au matériel: comment installer le pilote du récepteur IR et comment prendre en charge diverses télécommandes. Le second billet qui ne saurait trop tarder examine le côté logiciel. Ces deux billets constitueront une version améliorée de trois billets rédigés en anglais.

Bien qu'il soit question d'un Orange Pi Zero exécutant Armbian Stretch, une grande partie de ce qui se trouve ici, excluant l'installation du pilote du récepteur IR, serait probablement valable pour le Raspberry Pi. Je compte examiner cela plus tard.

Table des matières

  1. Installation du module IR du noyau
  2. Sélectionner le protocole IR
  3. Obtenir les codes de balayage de la télécommande
  4. Les codes de clavier
  5. L'utilitaire ir-keytable
  6. Répétition automatique
  7. Gestion des tables de code
  8. La règle udev défectueuse
  9. Le fichier de configuration rc_maps.cfg
  10. Configuration automatique
  11. Conclusion

Installation du module IR du noyau toc

Par défaut, le pilote du récepteur infrarouge, appelé sunxi-cir, n'est pas installé. Cela a du sens car l’Orange Pi Zero n’a pas de récepteur IR à bord. Cependant, la carte d’extension en option en contient un, que j'utiliserai dans ce qui suit. Le moyen le plus simple, en fait, le seul que je connaisse pour charger le module du noyau lors du démarrage est d'utiliser l'utilitaire armbian-config. Activez le module cir dans les paramètres système/matériel (System/Hardware). Si cette procédure n'est pas familière, voici les détails commençant par le lancement de l'utilitaire de configuration.

zero@opi:~$ sudo armbian-config

Main configuration screen

Mettre en surbrillance System à l'aide des touches de curseur haut et bas, puis en "cliquant" sur le bouton < OK >. Pour ce faire, il faut appuyer sur la barre d'espacement ou sur le bouton Entrée lorsque < OK > est sélectionné. Si ce bouton n'est pas en surbrillance, utilisez la touche de tabulation ou les touches de curseur gauche et droite pour le sélectionner.

System settings screen

Dans l'écran System settings, mettre en surbrillance l'option Hardware (matériel) et cliquer sur le bouton < OK >.

Toggle hardware configuration screen

Dans l'écran Toggle hardware configuration (basculer la configuration matérielle), mettre en surbrillance la fonction cir et appuyer sur la barre d'espacement de sorte qu'une étoile '*' apparaisse à gauche de cir. Cliquer sur le bouton < Save > (enregistrer), puis sur le bouton < Exit >.

Applying changes screen

Enfin, cliquer sur le bouton < Reboot >.

Après environ une minute, démarrer une nouvelle session SSH avec l’OPiZ pour effectuer quelques vérifications, question de voir si le module est chargé et initialisé.

zero@opi:~$ lsmod | grep -i cir sunxi_cir 16384 0 zero@opi:~$ dmesg | grep -i ir ... [ 8.767310] Registered IR keymap rc-empty [ 8.767518] rc rc0: sunxi-ir as /devices/platform/soc/1f02000.ir/rc/rc0 [ 8.767835] input: sunxi-ir as /devices/platform/soc/1f02000.ir/rc/rc0/input0 [ 8.771309] rc rc0: lirc_dev: driver sunxi-ir registered at minor = 0, raw IR receiver, no transmitter [ 8.780154] sunxi-ir 1f02000.ir: initialized sunXi IR driver ... zero@opi:~$ cat /proc/bus/input/devices I: Bus=0019 Vendor=0001 Product=0001 Version=0100 N: Name="sunxi-ir" P: Phys=sunxi-ir/input0 S: Sysfs=/devices/platform/soc/1f02000.ir/rc/rc0/input0 U: Uniq= H: Handlers=kbd event0 B: PROP=0 B: EV=100013 B: KEY=1000000 0 0 0 0 B: MSC=10 zero@opi:~$ ls /dev/input/event* /dev/input/event0

Tout semble en ordre. Le module est chargé, il est initialisé au démarrage et l'arborescence du dispositif /sys/devices/platform/soc/1f02000.ir/rc/rc0 a été crée par le noyau. Typiquement, on n'accède pas directement au contenu de ce dossier; on passe plutôt par un lien symbolique.

zero@opi:~$ ls -l /sys/class/rc/rc0 lrwxrwxrwx 1 root root 0 Feb 12 02:19 /sys/class/rc/rc0 -> ../../devices/platform/soc/1f02000.ir/rc/rc0

Les signaux IR décodés provenant de la télécommande infrarouge devraient s'afficher sur l'entrée event0. Il est temps d'essayer la télécommande. Notez que si le filtre xxd n'est pas installé, exécutez la commande sans | xxd. La sortie aura l’air très bizarre, mais peu importe.

zero@opi:~$ cat /dev/input/event0 | xxd

KEYES IR remote Cela semblait si prometteur, mais rien ne se passa lorsque j’appuyai sur des boutons de la télécommande infrarouge qu'on peut voir à droite. Comme on peut le constater, la télécommande est l’une de celles que l'on obtient chez les vendeurs chinois habituels pour presque rien; environ 1 $US pour la télécommande et un récepteur IR. Or presque toutes ces télécommandes bon marché utilisent le protocole NEC. Il est donc temps de regarder le protocole IR pris en charge par le module IR du noyau. Pour quitter la commande cat qui attend toujours un événement, appuyez sur la combinaison de touches CtrlC.

Sélectionner le protocole IR toc

Il suffit d'afficher le contenu d'un fichier pour connaître le protocol actuellement utilisé.

zero@opi:~$ cat /sys/class/rc/rc0/protocols rc-5 nec rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]

Les protocoles connus sont affichés, celui ou ceux pris en charge actuellement sont entre les crochets []. Il est nécessaire de devenir le "superutilisateur" pour activer un autre protocole.

zero@opi:~$ sudo su root@opi:/home/zero# echo nec > /sys/class/rc/rc0/protocols root@opi:/home/zero# exit exit zero@opi:~$ cat /sys/class/rc/rc0/protocols rc-5 [nec] rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]

On peut aller directement à la section suivante, car ce qui suit est une explication de la forme un peu complexe de la commande pour changer le protocole et l'élaboration d'un petit script pour simplifier la tâche.

On ne peut pas utilisé la commande sudo devant la fonction echo.

zero@opi:~$ sudo echo rc-5 > /sys/class/rc/rc0/protocols -bash: /sys/class/rc/rc0/protocols: Permission denied zero@opi:~$ ls -l /sys/class/rc/rc0/protocols -rw-r--r-- 1 root root 4096 Feb 3 12:21 /sys/class/rc/rc0/protocols

Comme on peut le constater, l'écriture dans le fichier protocols ne peut être effectuée que par le propriétaire du fichier qui est root. La commande echo est exécutée en tant qu'utilisateur root à cause du préfixe sudo, mais l'écriture du résultat dans le fichier est effectuée en tant qu'utilisateur zéro qui ne dispose pas de ce privilège. Cela me rappelle une erreur que je fais parfois. La commande combinée

sudo apt update && apt upgrade

ne fonctionne pas, car seul update est fait en tant que root. Il faut écrire

sudo apt update && sudo apt upgrade

Quelque chose de semblable à cela doit être fait. C’est un problème bien connu qui a fait l’objet d’un long dialogue sur stackoverflow depuis 2008. Voici une des deux solutions généralement acceptées.

zero@opi:~$ echo nec | sudo tee /sys/class/rc/rc0/protocols nec zero@opi:~$ cat /sys/class/rc/rc0/protocols rc-5 [nec] rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]

On peut expliquer ce qui se passe. La sortie de la commande echo est introduite dans l'entrée du programme tee. Celui-ci est un filtre qui reporte ses entrées dans le fichier spécifié. La commande sudo signifie que root exécute tee qui aura le privilège d'écriture nécessaire.

Heureusement que tee est déjà installé sur Armbian mais que faire si cet utilitaire n'est pas disponible ? L'autre solution proposée est que root créé une session dans laquelle la commande echo est exécuté par root.

zero@opi:~$ sudo sh -c "echo jvc > /sys/class/rc/rc0/protocols" zero@opi:~$ cat /sys/class/rc/rc0/protocols rc-5 nec rc-6 [jvc] sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]

J'ai eu à changer le protocole tellement souvent qu'inspiré par hololeap, j'ai décidé de créer une fonction dans le fichier de configuration de bash. Comme on verra, cela n'est pas vraiment nécessaire, car ir-keytable sera installé plus tard et il est capable d'en faire autant.

zero@opi:~$ nano .bashrc

Il suffit d'ajouter les lignes suivantes.

... # function to set IR remote protocol irp() { [[ "$#" -ge 2 ]] && echo "Usage: irp [[+|-]<protocol>]" && return 1 [[ "$#" -eq 1 ]] && echo "$1" | sudo tee /sys/class/rc/rc0/protocols > /dev/null echo -n "IR protocols: " && cat /sys/class/rc/rc0/protocols }

La session doit être redémarrée pour que la commande soit disponible. Au lieu d'une page man expliquant comment l'utiliser, voici une liste exhaustive d'exemples.

Afficher les protocoles IR connus et actuellement pris en charge.
zero@opi:~$ irp IR protocols: rc-5 nec rc-6 [jvc] sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]
Les protocoles pris en charge sont entre les crochets []. lirc est toujours pris en charge.
Activer qu'un seul protocole IR.
zero@opi:~$ irp nec IR protocols: rc-5 [nec] rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]
Activer un protocole IR supplémentaire.
zero@opi:~$ irp +jvc IR protocols: rc-5 [nec] rc-6 [jvc] sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]
Désactivé un seul protocole IR.
zero@opi:~$ irp IR protocols: rc-5 [nec] rc-6 [jvc] sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc] zero@opi:~$ zero@opi:~$ irp -jvc IR protocols: rc-5 [nec] rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]
Combinaison d'opérations multiples.
zero@opi:~$ irp IR protocols: rc-5 [nec] rc-6 [jvc] sony rc-5-sz sanyo sharp [mce_kbd] xmp imon [lirc] zero@opi:~$ zero@opi:~$ irp "-jvc +sony +sanyo" IR protocols: rc-5 [nec] rc-6 jvc [sony] rc-5-sz [sanyo] sharp [mce_kbd] xmp imon [lirc]
Activer tous les protocoles IR connus.
zero@opi:~$ irp "rc-5 +nec +rc-6 +jvc +sony +rc-5-sz +sanyo +sharp +mce_kbd +xmp +imon" IR protocols: [rc-5] [nec] [rc-6] [jvc] [sony] [rc-5-sz] [sanyo] [sharp] [mce_kbd] [xmp] [imon] [lirc]
Désactiver tous les protocoles IR.
zero@opi:~$ irp lirc IR protocols: rc-5 nec rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]

Obtenir les codes de balayage de la télécommande toc

En activant le bon protocol IR, il est maintenant possible d'afficher les codes provenant de la télécommande.

zero@opi:~$ irp nec IR protocols: rc-5 [nec] rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc] zero@opi:~$ cat /dev/input/event0 | xxd 00000000: a988 545c 9970 0100 0400 0400 1600 0000 ..T\.p.......... 00000010: a988 545c 9970 0100 0000 0000 0000 0000 ..T\.p.......... 00000020: a988 545c f337 0200 0400 0400 1600 0000 ..T\.7.......... 00000030: a988 545c f337 0200 0000 0000 0000 0000 ..T\.7.......... 00000040: a988 545c b9dc 0300 0400 0400 1600 0000 ..T\............ 00000050: a988 545c b9dc 0300 0000 0000 0000 0000 ..T\............

Comme précédemment, appuyer sur la combinaison de touches CtrlC quand l'affichage incompréhensible ne saura plus fasciner.

Si rien ne s'affiche et si le répertoire /dev/input/event0 existe, alors il se peut qu'un autre processus se soit accaparer le périphérique. On peut vérifier avec l'utilitaire fuser.
zero@opi:~ $ sudo fuser -v /dev/input/event0 USER PID ACCESS COMMAND /dev/input/event0: nobody 337 f.... thd root 554 f.... lircd

On peut voir ici que lircd est installé et utilise le périphérique. On peut éliminer cette bibliothèque.

zero@opi:~ $ sudo systemctl stop lirc* zero@opi:~ $ sudo systemctl disable lircd.service Synchronizing state of lircd.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable lircd

Si vous ne savez pas quel protocole est utilisé par une télécommande, activez-les tous pour au moins établir que le noyau peut la prendre en charge. On peut faire cela dans une autre session, les changements de protocoles se manifestent immédiatement dans toutes les sessions ouvertes.

Une autre remarque s'impose. L'utilisateur, ici c'est zero, doit être membre du groupe input pour accéder à la file d'attente d'événements. En principe, c'est déjà le cas dans Armbian.

zero@opi:~$ groups zero dialout sudo audio video plugdev systemd-journal input netdev ssh

Le flux de valeurs lues de la file d'événements event0 n'est pas facilement interprété. Il y a un programme qui rend intelligible cette production. Si, comme c'est le cas dans Raspbian, evtest n'est pas installé (on peut le faire facilement avec la commande habituelle&nbps;: sudo apt install evdev. Ce n'est pas indispensable, ir-keytable -t, qu'on verra plus loin, accomplie à peu près la même tâche.

zero@opi:~$ evtest /dev/input/event0 Input driver version is 1.0.1 Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100 Input device name: "sunxi-ir" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 152 (KEY_SCREENLOCK) Event type 4 (EV_MSC) Event code 4 (MSC_SCAN) Key repeat handling: Repeat type 20 (EV_REP) Repeat code 0 (REP_DELAY) Value 500 Repeat code 1 (REP_PERIOD) Value 125 Properties: Testing ... (interrupt to exit) Event: time 1549043265.338647, type 4 (EV_MSC), code 4 (MSC_SCAN), value 18 Event: time 1549043265.338647, -------------- SYN_REPORT ------------ Event: time 1549043265.389764, type 4 (EV_MSC), code 4 (MSC_SCAN), value 18 Event: time 1549043265.389764, -------------- SYN_REPORT ------------ Event: time 1549043265.497432, type 4 (EV_MSC), code 4 (MSC_SCAN), value 18 Event: time 1549043265.497432, -------------- SYN_REPORT ------------ Event: time 1549043267.562994, type 4 (EV_MSC), code 4 (MSC_SCAN), value 19 Event: time 1549043267.562994, -------------- SYN_REPORT ------------ Event: time 1549043267.614064, type 4 (EV_MSC), code 4 (MSC_SCAN), value 19

Voici un peu d'information (an anglais) au sujet des types d'événements dont les deux affichés ci-dessus.

EV_MSC
Décrit comme des « données d'entrée diverses » (miscellaneous input data) car ces événements ne relèvent pas des autres catégories définies telles que EV_KEY (clavier, boutons ...), EV_REL (mouvements de la souris), EV_SW (commutateurs).
EV_SYN
Décrit comme « marqueurs pour séparer les événements » (markers to separate events).

Chaque type a un ensemble de codes identifiant les événements. SYN_REPORT est l'un des 4 codes associés à EV_SYN et il « synchronise et sépare des événements en paquets de modifications de données d'entrée se produisant au même moment dans le temps ». Cela n’a pas grand sens ici, mais il pourrait être utile de faire la distinction entre des mouvements X et Y de la souris se produisant simultanément et deux mouvements séquentiels le long des axes X et Y.

Le code MSC_SCAN n'est pas défini dans la documentation, mais il fait évidemment référence à un code de balayage généré par le périphérique d'entrée. Le code de balayage associé à chaque bouton de la télécommande infrarouge est indiqué dans le champ nommé value. Le champ time est probablement le code MSC_TIMESTAMP qui correspond au "nombre de microsecondes écoulées depuis la dernière réinitialisation". Il est censé être une valeur entière non signée sur 32 bits. En fait, la partie entière est l'heure Posix soit le nombre de secondes écoulées depuis le 1970-01-01 00:00 temps universel coordonnée.

Facilement et rapidement, il a été possible de créer avec evtest le tableau suivant qui indique le code de balayage (en hexadécimal et décimal) de chaque bouton poussoir de la télécommande

CodeButton  CodeButton
0x528200x4670UP
0x162210x4064OK
0x192520x1521DOWN
0x0d1330x4367RIGHT
0x0c1240x4468LEFT
0x182450x4266*
0x5e9460x4a74#
0x0887
0x1c288
0x5a909

Il existe une bibliothèque Python qui peut lire la file d'attente d'événements. Il est donc possible d'écrire un script Python pour traduire les codes de balayage de la télécommande en actions. Toutefois, je ne recommande pas une telle approche, et ce pour deux raisons. Premièrement, si l'on devait changer de télécommande il faudrait refaire le script car les fabricants n'utilisent pratiquement jamais les mêmes codes de balayage. Il est préférable de convertir les codes de balayage en symboles abstraits, dits codes de clavier, et d'établir les actions à prendre en fonction de ces symboles. D'importants programmes comme Kodi (xmbc) et Rhythmbox peuvent être contrôlés avec ces symboles abstraits. Deuxièmement, le noyau prend en charge cette conversion tout en simplifiant le flux d'événements de telle sorte qu'un script Python véritablement utile sera bien plus facile à écrire.

Les codes de clavier toc

La conversion d'un code de balayage (scancode) en un code de clavier (keycode) est pris en charge par le noyau. Encore faut-il qu'il sache quels sont les codes de balayage de la télécommande et les codes de clavier correspondants.

La table suivante montre une correspondance possible entre les codes de balayage et de clavier pour la télécommande KEYES.

# table keyes, type: nec 0x46 KEY_UP 0x40 KEY_OK 0x15 KEY_DOWN 0x43 KEY_RIGHT 0x44 KEY_LEFT 0x52 KEY_0 0x16 KEY_1 0x19 KEY_2 0x0d KEY_3 0x0c KEY_4 0x18 KEY_5 0x5e KEY_6 0x08 KEY_7 0x1c KEY_8 0x5a KEY_9 0x42 KEY_NUMERIC_STAR 0x4a KEY_NUMERIC_POUND

Ce n'est pas la seule définition possible, on pourrait faire correspondre les boutons numériques à des codes claviers différents et le bouton OK au code KEY_PLAY.

... 0x40 KEY_PLAY ... 0x52 KEY_NUMERIC_0 0x16 KEY_NUMERIC_1 ...

Tout cela dépend des attentes du programme qui utilisera la télécommande infrarouge. Les codes de clavier tels KEY_0 et KEY_OK sont en fait des symboles qui correspondent à des nombres.

... #define KEY_0 11 ... #define KEY_OK 0x160 ...

Typiquement, il n'est pas nécessaire de connaître les équivalences numériques des symboles, mais en revanche il est utile d'avoir la liste des symboles. On retrouve des listes plus ou moins complètes comme celle de Richard Atterer. On peut engendrer une liste avec la commande irrecord -l ou irrecord --list-namespace qui fait partie de LIRC, on peut utiliser mon script Python keytable.py (avec les options -l, -ld ou -lh), ou l'on peut consulter la liste définitive input-event-codes.h.

Le fait qu'un symbole soit contenu dans cette liste ne veut évidemment pas dire qu'il soit significatir pour un logiciel quelconque qui prend en charge les télécommandes IR. Un programme pourrait interpréter les code clavier KEY_1, KEY_2, etc comme des nombres, un autre programme en ferait autant mais avec les codes clavier KEY_NUMERIC_1, KEY_NUMERIC_2

L'utilitaire ir-keytable toc

Il faut une table d'équivalence entre codes de balayage d'une télécommande et codes de clavier, mais il faut aussi que le module IR du noyau soit appelé à utiliser cette table. C'est ici qu'intervient l'utilitaire ir-keytable. Celui-ci n'est pas présent dans l'image téléchargée de Armbian. On installe l'utilitaire sans difficulté de la façon classique.

zero@opi:~$ sudo apt install -y ir-keytable ... Setting up ir-keytable (1.12.3-1) ... Processing triggers for man-db (2.7.6.1-2) ...

En plus du programme, plusieurs fichiers sont ajouté au système dont des tables de conversion pour de nombreuses télécommandes dans de répertoire /lib/udev/rc_keymaps, des objets noyau associés dans /lib/modules/4.19.17-sunxi/kernel/drivers/media/rc/keymaps/, une règle udev, un fichier de configuration et un répertoire vide dans /etc.

zero@opi:~$ which ir-keytable /usr/bin/ir-keytable zero@opi:~$ ls /lib/udev/rc_keymaps a800 dibusb kworld_pc150u real_audio_220_32_keys adstech_dvb_t_pci digitalnow_tinytwin kworld_plus_tv_analog reddo ... dib0700_nec kaiomy pv951 dib0700_rc5 kworld_315u rc6_mce zero@opi:~$ ls /lib/modules/4.19.17-sunxi/kernel/drivers/media/rc/keymaps/ rc-adstech-dvb-t-pci.ko rc-encore-enltv.ko rc-pinnacle-pctv-hd.ko rc-alink-dtu-m.ko rc-evga-indtube.ko rc-pixelview-002t.ko ... rc-avermedia-a16d.ko rc-gotview7135.ko rc-rc6-mce.ko ... zero@opi:~$ ls /lib/udev/rules.d/60-ir-keytable.rules /lib/udev/rules.d/60-ir-keytable.rules zero@opi:~$ ls -l /etc/rc_* -rw-r--r-- 1 root root 6213 Feb 17 2017 /etc/rc_maps.cfg /etc/rc_keymaps: total 0

Cela fait beaucoup, mais avec l'aide abondante sur le Web et la page man de l'utilitaire (disponible en français) on s'y retrouve. Examinons initialement l'utilisation interactive de l'utilitaire.

L'exécution du programme sans aucun paramètre de ligne de commande affiche des informations sur les pilotes, les périphériques, les protocoles actuellement pris en charge, etc.

zero@opi:~$ ir-keytable Found /sys/class/rc/rc0/ (/dev/input/event0) with: Driver sunxi-ir, table rc-empty Supported protocols: other lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp Enabled protocols: lirc rc-6 Name: sunxi-ir bus: 25, vendor/product: 0001:0001, version: 0x0100 Repeat delay = 500 ms, repeat period = 125 ms

On peut fixer les protocoles à prendre en charge.

zero@opi:~$ sudo ir-keytable -p nec,rc-5 Protocols changed to rc-5 nec zero@opi:~$ sudo ir-keytable -p all Protocols changed to other lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp

Notez la nécessité du préfixe sudo. L'option -p (forme longue: --protocol) n'a pas la souplesse de mon script irp, mais la facilité avec laquelle on peut sélectionner tous les protocoles en même temps est fort utile pour vérifier la compatibilité d'un contrôle à distance IR inconnu.

Hauppauge IR Remote L'option -t (ou --test) est utilisée pour lire les événements engendrés par la télécommande. Elle est utilisée ci-dessous avec tous les protocoles pour vérifier qu'une vieille télécommande Hauppauge est compatible.

zero@opi:~$ sudo ir-keytable -p all -t Protocols changed to other lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp Testing events. Please, press CTRL-C to abort. 1550102987.314314: event type EV_MSC(0x04): scancode = 0x1e01 1550102987.314314: event type EV_SYN(0x00). 1550102987.428177: event type EV_MSC(0x04): scancode = 0x1e01 1550102987.428177: event type EV_SYN(0x00). 1550102988.516736: event type EV_MSC(0x04): scancode = 0x1e02 1550102988.516736: event type EV_SYN(0x00). 1550102988.630634: event type EV_MSC(0x04): scancode = 0x1e02 1550102988.630634: event type EV_SYN(0x00).

Il a été facile de déterminer que la télécommande utilise le protocole rc-5. Il est possible de définir les codes de clavier pour les codes de balayage avec ir-keytable, puis d’afficher les codes de balayage reçus et les codes de clavier correspondants s’ils sont disponibles.

zero@opi:~$ ir-keytable -k 0x1e01=KEY_1,0x1e02=KEY_2 Wrote 2 keycode(s) to driver zero@opi:~$ sudo ir-keytable -p rc5 -t Protocols changed to rc-5 Testing events. Please, press CTRL-C to abort. 1550103171.756070: event type EV_MSC(0x04): scancode = 0x1e01 1550103171.756070: event type EV_KEY(0x01) key_down: KEY_1(0x0002) 1550103171.756070: event type EV_SYN(0x00). 1550103171.869890: event type EV_MSC(0x04): scancode = 0x1e01 1550103171.869890: event type EV_SYN(0x00). 1550103172.108620: event type EV_KEY(0x01) key_up: KEY_1(0x0002) 1550103172.108620: event type EV_SYN(0x00). 1550103174.084489: event type EV_MSC(0x04): scancode = 0x1e02 1550103174.084489: event type EV_KEY(0x01) key_down: KEY_2(0x0003) 1550103174.084489: event type EV_SYN(0x00). 1550103174.198391: event type EV_MSC(0x04): scancode = 0x1e02 1550103174.198391: event type EV_SYN(0x00). 1550103174.436615: event type EV_KEY(0x01) key_up: KEY_2(0x0003) 1550103174.436615: event type EV_SYN(0x00). 1550103176.671375: event type EV_MSC(0x04): scancode = 0x1e03 1550103176.671375: event type EV_SYN(0x00). 1550103176.785293: event type EV_MSC(0x04): scancode = 0x1e03 1550103176.785293: event type EV_SYN(0x00).

L'option -k a été utilisé pour définir les codes de clavier, pour les boutons «1» et «2». Quand ces boutons et le bouton «3» sont activés, l'utilitaire affiche leur code de balayage et le code de clavier correspondant lorsque défini. Notez également comment les événements key_down et key_up de type EV_KEY sont signalés avec les codes de clavier.

Si l'on utilise evdev on peut voir les dessous de ce qui se passe un peu mieux et l'on confirme que c'est bien le noyau qui modifie les événements quand un code clavier est défini.

zero@opi:~$ evtest /dev/input/event0 ... Testing ... (interrupt to exit) Event: time 1550104138.017196, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e01 Event: time 1550104138.017196, type 1 (EV_KEY), code 2 (KEY_1), value 1 Event: time 1550104138.017196, -------------- SYN_REPORT ------------ Event: time 1550104138.131054, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e01 Event: time 1550104138.131054, -------------- SYN_REPORT ------------ Event: time 1550104138.368629, type 1 (EV_KEY), code 2 (KEY_1), value 0 Event: time 1550104138.368629, -------------- SYN_REPORT ------------ Event: time 1550104138.904789, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e02 Event: time 1550104138.904789, type 1 (EV_KEY), code 3 (KEY_2), value 1 Event: time 1550104138.904789, -------------- SYN_REPORT ------------ Event: time 1550104139.018659, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e02 Event: time 1550104139.018659, -------------- SYN_REPORT ------------ Event: time 1550104139.256626, type 1 (EV_KEY), code 3 (KEY_2), value 0 Event: time 1550104139.256626, -------------- SYN_REPORT ------------ Event: time 1550104139.642573, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e03 Event: time 1550104139.642573, -------------- SYN_REPORT ------------ Event: time 1550104139.756456, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e03 Event: time 1550104139.756456, -------------- SYN_REPORT ------------

Lorsque le bouton «1» est enfoncé, deux événements se produisent. Le premier, de type EV_MSC, retourne le code de balayage 0x1e01dans le champ value. Le second, de type EV_KEY retourne le code de clavier 2 soit KEY_1 dans le champ code. La valeur 1 dans le champ value indique que le bouton a été enfoncé. Quand le bouton est relâché, ce sont presque les mêmes événements qui sont engendrés, la seule différence est la valeur 0 dans le champ value de l'événement de type EV_KEY. Ce 0 indique que le bouton a été relâché. Voilà d'où viennent les key_down et key_up qu'on a vus avec ir-keytable.

Répétition automatique toc

Hauppauge IR Remote La plupart des télécommandes retransmettent à une fréquence régulière le code de balayage d'un bouton qu'on garde enfoncé. Selon ce qui suit, une troisième télécommande, de HP, sur laquelle il est indiqué que le protocole utilisé est RC-6, répète le code à chaque dixième de seconde.

zero@opi:~$ sudo ir-keytable -p rc6 -t Protocols changed to rc-6 Testing events. Please, press CTRL-C to abort. 1549900869.364917: event type EV_MSC(0x04): scancode = 0x800f0403 1549900869.364917: event type EV_SYN(0x00). 1549900869.471014: event type EV_MSC(0x04): scancode = 0x800f0403 delta: 0.106096982955933 1549900869.471014: event type EV_SYN(0x00). 1549900869.577187: event type EV_MSC(0x04): scancode = 0x800f0403 delta: 0.106173038482666 1549900869.577187: event type EV_SYN(0x00). 1549900869.683334: event type EV_MSC(0x04): scancode = 0x800f0403 delta: 0.106147050857544 1549900869.683334: event type EV_SYN(0x00). 1549900869.789506: event type EV_MSC(0x04): scancode = 0x800f0403 delta: 0.106171846389771 1549900869.789506: event type EV_SYN(0x00). 1549900869.895648: event type EV_MSC(0x04): scancode = 0x800f0403 delta: 0.106142044067383 1549900869.895648: event type EV_SYN(0x00). 1549900870.001833: event type EV_MSC(0x04): scancode = 0x800f0403 delta: 0.106184959411621 1549900870.001833: event type EV_SYN(0x00). 1549900870.107974: event type EV_MSC(0x04): scancode = 0x800f0403 delta: 0.106141090393066 1549900870.107974: event type EV_SYN(0x00). 1549900870.214139: event type EV_MSC(0x04): scancode = 0x800f0403 delta: 0.106164932250977 ...

Indépendamment des capacités de répétition du contrôle à distance, le noyau répète les codes de clavier s'ils sont définis, mais il ne répète pas les codes de balayage. Les valeurs par défaut sont un délai initial de 1/2 seconde (500 ms) et une période de répétition de 1/8 seconde (125 ms). Ce sont des valeurs typiques pour un clavier. Le tableau suivant indique les intervalles de temps entre les codes de balayage et les codes de clavier lorsque le bouton «1» est maintenu enfoncé pendant 3 secondes. Les événements de synchronisation EV_SYN ont été supprimés pour obtenir une image plus claire. La première colonne est l'horodatage de l'évènement. La cinquième colonne Delta EV_* est l'intervalle de temps en millisecondes entre les événements successifs, qu'il s'agisse de codes de balayage de la télécommande ou de codes de clavier. La dernière colonne, Delta EV_KEY contient les intervalles de temps entre les codes EV_KEY. Comme la période de répétition des codes de clavier est de 125 ms et la période de répétition de la télécommande est de 100 ms, la plupart du temps, il n'y a qu'un code de balayage entre deux codes de clavier, mais occasionnellement il y en a deux. L'exception est au début en raison du délai de 500 ms avant la première répétition du code de clavier.

Heure posix Événement Type Code Delta EV_* Delta EV_KEY
1549903838.71569 EV_MSC(0x04) scancode 0x800f0401

1549903838.71569 EV_KEY(0x01) key_down KEY_1(0x0002)

1549903838.82179 EV_MSC(0x04) scancode 0x800f0401 106
1549903838.92789 EV_MSC(0x04) scancode 0x800f0401 106
1549903839.03404 EV_MSC(0x04) scancode 0x800f0401 106
1549903839.14021 EV_MSC(0x04) scancode 0x800f0401 106
1549903839.24636 EV_MSC(0x04) scancode 0x800f0401 106
1549903839.24705 EV_KEY(0x01) key_down KEY_1(0x0002) 1 531
1549903839.35254 EV_MSC(0x04) scancode 0x800f0401 105
1549903839.37905 EV_KEY(0x01) key_down KEY_1(0x0002) 27 132
1549903839.45869 EV_MSC(0x04) scancode 0x800f0401 80
1549903839.51104 EV_KEY(0x01) key_down KEY_1(0x0002) 52 132
1549903839.56487 EV_MSC(0x04) scancode 0x800f0401 54
1549903839.64305 EV_KEY(0x01) key_down KEY_1(0x0002) 78 132
1549903839.67109 EV_MSC(0x04) scancode 0x800f0401 28
1549903839.77505 EV_KEY(0x01) key_down KEY_1(0x0002) 104 132
1549903839.77717 EV_MSC(0x04) scancode 0x800f0401 2
1549903839.88333 EV_MSC(0x04) scancode 0x800f0401 106
1549903839.90704 EV_KEY(0x01) key_down KEY_1(0x0002) 24 130
1549903839.98951 EV_MSC(0x04) scancode 0x800f0401 82
1549903840.03905 EV_KEY(0x01) key_down KEY_1(0x0002) 50 132
1549903840.09567 EV_MSC(0x04) scancode 0x800f0401 57
1549903840.17105 EV_KEY(0x01) key_down KEY_1(0x0002) 75 132
1549903840.20184 EV_MSC(0x04) scancode 0x800f0401 31
1549903840.30305 EV_KEY(0x01) key_down KEY_1(0x0002) 101 132
1549903840.30798 EV_MSC(0x04) scancode 0x800f0401 5
1549903840.41415 EV_MSC(0x04) scancode 0x800f0401 106
1549903840.43504 EV_KEY(0x01) key_down KEY_1(0x0002) 21 127
1549903840.52032 EV_MSC(0x04) scancode 0x800f0401 85
1549903840.56705 EV_KEY(0x01) key_down KEY_1(0x0002) 47 132
1549903840.62648 EV_MSC(0x04) scancode 0x800f0401 59
1549903840.69904 EV_KEY(0x01) key_down KEY_1(0x0002) 73 132
1549903840.73265 EV_MSC(0x04) scancode 0x800f0401 34
1549903840.83105 EV_KEY(0x01) key_down KEY_1(0x0002) 98 132
1549903840.83879 EV_MSC(0x04) scancode 0x800f0401 8
1549903840.94495 EV_MSC(0x04) scancode 0x800f0401 106
1549903840.96304 EV_KEY(0x01) key_down KEY_1(0x0002) 18 124
1549903841.05119 EV_MSC(0x04) scancode 0x800f0401 88
1549903841.09505 EV_KEY(0x01) key_down KEY_1(0x0002) 44 132
1549903841.15729 EV_MSC(0x04) scancode 0x800f0401 62
1549903841.22704 EV_KEY(0x01) key_down KEY_1(0x0002) 70 132
1549903841.26346 EV_MSC(0x04) scancode 0x800f0401 36
1549903841.35905 EV_KEY(0x01) key_down KEY_1(0x0002) 96 132
1549903841.3696 EV_MSC(0x04) scancode 0x800f0401 11
1549903841.47578 EV_MSC(0x04) scancode 0x800f0401 106
1549903841.49105 EV_KEY(0x01) key_down KEY_1(0x0002) 15 121
1549903841.58194 EV_MSC(0x04) scancode 0x800f0401 91
1549903841.62306 EV_KEY(0x01) key_down KEY_1(0x0002) 41 132
1549903841.75504 EV_KEY(0x01) key_down KEY_1(0x0002) 132 173
1549903841.81905 EV_KEY(0x01) key_up KEY_1(0x0002) 64

Le délai initial avant la première répétition du code de clavier et la période de répétition du code de clavier après peuvent être modifiés avec les options -D et -P.

zero@opi:~$ ir-keytable -D 100 -P 25 Repeat delay = 100 ms, repeat period = 125 ms Changed Repeat delay to 100 ms and repeat period to 25 ms

Gestion des tables de code toc

La fonction principale d'ir-keytable est sa capacité à gérer les tables traduisant les codes de balayage en codes de clavier stockés dans des fichiers. On a déjà créé un fichier de ce genre pour la télécommande KEYES (voir le début de la section Les codes de clavier).

Comme indiqué ci-dessus, un bon nombre de définitions de télécommande IR ont été incluses dans le paquet ir-keytable. Les fichiers se trouvent dans le répertoire /lib/udev/rc_keymaps. Parmi eux, il en existe un pour les télécommandes RC6: rc6-mce dont le contrôleur à distance HP. La commande pour charger ce fichier de traduction des codes est simple.

michel@hp:~$ sudo ir-keytable -w /lib/udev/rc_keymaps/rc6_mce Read rc6_mce table Wrote 63 keycode(s) to driver Protocols changed to rc-6

Les traductions de code contenues dans le fichier ont été ajoutées à celles déjà utilisées par le noyau. Pour voir les entrées actuelles, utilisez l’option -r (forme longue: --read).

zero@opi:~$ ir-keytable -r Enabled protocols: lirc rc-6 scancode 0x002a = KEY_COFFEE (0x98) scancode 0x800f0400 = KEY_NUMERIC_0 (0x200) scancode 0x800f0401 = KEY_NUMERIC_1 (0x201) scancode 0x800f0402 = KEY_NUMERIC_2 (0x202) scancode 0x800f0403 = KEY_NUMERIC_3 (0x203) ...

L'enregistrement KEY_COFFEE n'est pas contenu dans le fichier rc6_mce. On efface la table d'enregistrements utilisés par le noyau avec l'option -c (ou --clear) qui peut être utilisé seul. En combinaison avec l'option d'écriture (-w ou --write), nous effectuons une opération de remplacement.

zero@opi:~$ sudo ir-keytable -c -w /lib/udev/rc_keymaps/rc6_mce Read rc6_mce table Old keytable cleared Wrote 63 keycode(s) to driver Protocols changed to rc-6 zero@opi:~$ ir-keytable -r Enabled protocols: lirc rc-6 scancode 0x800f0400 = KEY_NUMERIC_0 (0x200) scancode 0x800f0401 = KEY_NUMERIC_1 (0x201) scancode 0x800f0402 = KEY_NUMERIC_2 (0x202) scancode 0x800f0403 = KEY_NUMERIC_3 (0x203) scancode 0x800f0404 = KEY_NUMERIC_4 (0x204) ...

L'utilitaire sait quel protocole IR définir, car il est spécifié dans la première ligne du fichier de définition.

zero@opi:~$ head -n 5 /lib/udev/rc_keymaps/rc6_mce # table rc6_mce, type: RC6 0x800f0400 KEY_NUMERIC_0 0x800f0401 KEY_NUMERIC_1 0x800f0402 KEY_NUMERIC_2 0x800f0403 KEY_NUMERIC_3

Le paramètre de ligne de commande -p (ou --protocol) a préséance sur le protocole spécifié dans le fichier de définition, ce qui sera très utile. Le préfixe sudo doit être utilisé lorsque l'option -w ou -p si l'on veut que le protocole soit modifié.

L'usage veut que l'on ne charge pas le fichier de définition d'une télécommande directement à partir du répertoire /lib/udev/rc_keymaps/. Utilisez plutôt le répertoire /etc/rc_keymaps. Si le fichier inclus dans le package ir-keytable contient une définition correcte, créez un lien symbolique vers celui-ci dans le répertoire /etc/rc_keymaps.

zero@opi:~$ sudo ln -s /lib/udev/rc_keymaps/rc6_mce /etc/rc_keymaps/rc6_mce zero@opi:~$ ls -l /etc/rc_keymaps/ total 0 lrwxrwxrwx 1 root root 28 Feb 10 12:39 rc6_mce -> /lib/udev/rc_keymaps/rc6_mce zero@opi:~$ sudo ir-keytable -c -w /etc/rc_keymaps/rc6_mce Read rc6_mce table Old keytable cleared Wrote 63 keycode(s) to driver Protocols changed to rc-6

Si la définition fournie doit être modifiée, copiez le fichier depuis /lib/udev/rc_keymaps/ vers le répertoire /etc/rc_keymaps, modifiez cette copie selon vos besoins et chargez son contenu modifié avec la même commande que ci-dessus. C'est ce que j'ai fait avec la définition de la télécommande Hauppauge, pour modifier le code de clavier du bouton «Power» à KEY_POWER plutôt que KEY_POWER2 et pour éliminer tous les enregistrements inutiles. Si un nouveau fichier de définition doit être créé pour une télécommande infrarouge, placez-le dans le répertoire /etc/rc_keymaps. C’est ce que j’ai fait pour utiliser la télécommande KEYES.

michel@hp:~$ ls -l /etc/rc_keymaps total 20 -rw-r--r-- 1 root root 777 Feb 11 21:48 hauppauge_1e -rw-r--r-- 1 root root 328 Feb 10 13:00 keyes lrwxrwxrwx 1 root root 28 Feb 10 12:39 rc6_mce -> /lib/udev/rc_keymaps/rc6_mce

La commande suivante remplace la table de code utilisée par le noyau par deux définitions afin que les télécommandes IR KEYES et HP puissent être utilisées. Notez comment deux protocoles IR ont été spécifiés sur la seconde ligne de commande. Cela était nécessaire, car, sans l'option -p, ir-keytable aurait défini le protocole sur nec uniquement en fonction de la première ligne du fichier keyes.

zero@opi:~$ ir-keytable -c -w /etc/rc_keymaps/rc6_mce Read rc6_mce table Old keytable cleared Wrote 63 keycode(s) to driver /sys/class/rc/rc0//protocols: Permission denied Couldn't change the IR protocols zero@opi:~$ sudo ir-keytable -p nec,rc6 -w /etc/rc_keymaps/keyes Read keyes table Wrote 17 keycode(s) to driver Protocols changed to nec rc-6 zero@opi:~$ ir-keytable -t Testing events. Please, press CTRL-C to abort. 1549818188.628176: event type EV_MSC(0x04): scancode = 0x800f0401 1549818188.628176: event type EV_KEY(0x01) key_down: KEY_NUMERIC_1(0x0201) 1549818188.628176: event type EV_SYN(0x00). 1549818188.734319: event type EV_MSC(0x04): scancode = 0x800f0401 1549818188.734319: event type EV_SYN(0x00). 1549818188.971971: event type EV_KEY(0x01) key_up: KEY_NUMERIC_1(0x0201) 1549818188.971971: event type EV_SYN(0x00). 1549818214.729052: event type EV_MSC(0x04): scancode = 0x16 1549818214.729052: event type EV_KEY(0x01) key_down: KEY_NUMERIC_1(0x0201) 1549818214.729052: event type EV_SYN(0x00). 1549818214.780128: event type EV_MSC(0x04): scancode = 0x16 1549818214.780128: event type EV_SYN(0x00). 1549818215.015970: event type EV_KEY(0x01) key_up: KEY_NUMERIC_1(0x0201) 1549818215.015970: event type EV_SYN(0x00).

Comme on peut le constater, le code de clavier KEY_NUMERIC_1 est transmis par le noyau, d’abord en réponse au code de balayage 0x800f0401 de la télécommande HP à l’aide du protocole RC-6, puis à la réception du code de balayage 0x16 via le protocole NEC de la télécommande KEYES.

La règle udev défectueuse toc

L'installation de ir-keytable a ajouté une règle udev. Si, comme moi, vous n'êtes pas familier avec udev, je recommande le document udev - the Linux dynamic device management module de Debian, que j'ai trouvé étonnamment compréhensible. Bravo à l'auteur. Voici la règle qui devrait charger un fichier de configuration.

michel@hp:~$ cat /lib/udev/rules.d/60-ir-keytable.rules # Automatically load the proper keymaps after the Remote Controller device # creation. # The keycode tables rules should be at /etc/rc_maps.cfg ACTION=="add", SUBSYSTEM=="rc", RUN+="/usr/bin/ir-keytable -a /etc/rc_maps.cfg -s $name"

La règle ne fonctionne pas, du moins sur le Orange Pi Zero.

zero@opi:~$ journalctl | grep udevd ... Feb 09 16:46:35 opi systemd-udevd[358]: Process '/usr/bin/ir-keytable -a /etc/rc_maps.cfg -s rc0' terminated by signal SEGV.

Je suppose que cela signifie que le récepteur infrarouge est reconnu par udev, mais qu'une erreur de segmentation s'est produite lorsque ir-keytable a essayé de charger le fichier de définition. Ceci peut être une indication qu'un fichier est manquant. Pour en savoir plus, j'ai modifié la règle.

# Automatically load the proper keymaps after the Remote Controller device # creation. # The keycode tables rules should be at /etc/rc_maps.cfg #ACTION=="add", SUBSYSTEM=="rc", RUN+="/usr/bin/ir-keytable -a /etc/rc_maps.cfg -s $name" ACTION=="add", SUBSYSTEM=="rc", RUN+="/bin/ls -l /sys/class/rc &> /tmp/ls.txt"

After un redémarrage, j'ai pu constater que /sys/class/rc n'avait pas encore été créé.

zero@opi:~$ journalctl | grep udevd ... Feb 10 16:47:31 opi systemd-udevd[517]: Process '/bin/ls -l /sys/class/rc &> /tmp/ls.txt' failed with exit code 2. zero@opi:~$ cat /tmp/ls.txt cat: /tmp/ls.txt: No such file or directory

Peut-être que le répertoire /sys/devices/platform/soc/1f02000.ir/rc/rc0 réel existait et que la règle a été invoquée avant que le lien symbolique vers ce répertoire ne soit créé. Alors j'ai renommé la règle pour qu'elle soit la dernière à être exécutée et je l'ai encore modifiée.

zero@opi:~$ cat /lib/udev/rules.d/99-xir-keytable.rules # Automatically load the proper keymaps after the Remote Controller device # creation. # The keycode tables rules should be at /etc/rc_maps.cfg #ACTION=="add", SUBSYSTEM=="rc", RUN+="/usr/bin/ir-keytable -a /etc/rc_maps.cfg -s $name" ACTION=="add", SUBSYSTEM=="rc", RUN+="/bin/ls -l /sys/devices/platform/soc/1f02000.ir/rc &> /tmp/ls.txt"

Le résultat était tout aussi décevant. Il semble qu'il sera nécessaire de recourir à une tache cron au moment du démarrage pour initialiser correctement le pilote IR.

Le fichier de configuration rc_maps.cfg toc

L'option -a est utilisé pour charger le fichier de configuration, rc_maps.cfg comme dans la règle udev. La façon dont le fichier de configuration est censé fonctionner est mystérieuse pour certains, y compris moi. Voici ce que j'ai pu déchiffré.

# Keymaps table # # This table creates an association between a keycode file and a kernel # driver. It can be used to automatically override a keycode definition. # # Although not yet tested, it is meant to be added at udev. # # To use, you just need to run: # ./ir-keytable -a # # Or, if the remote is not the first device: # ./ir-keytable -a -s rc1 # for RC at rc1 # # Format: # driver - name of the driver provided via uevent - use * for any driver # table - RC keymap table, provided via uevent - use * for any table # file - file name. If directory is not specified, it will default to # /etc/rc_keymaps. # For example: # driver table file # cx8800 * ./keycodes/rc5_hauppauge_new # * rc-avermedia-m135a-rm-jx ./keycodes/kworld_315u # saa7134 rc-avermedia-m135a-rm-jx ./keycodes/keycodes/nec_terratec_cinergy_xs # em28xx * ./keycodes/kworld_315u # * * ./keycodes/rc5_hauppauge_new # Table to automatically load the rc maps for the bundled IR's provided with the # devices supported by the linux kernel #driver table file ... une longue liste dont * rc-rc6-mce rc6_mce ..

Un simple essai montrera que, contrairement à ce qui est écrit dans l'en-tête, ir-keytable -a ne fonctionnera pas. Le chemin complet du fichier de configuration doit être spécifié. De plus, keytable -a /etc/rc_maps.cfg (avec ou sans le préfixe sudo) ne fait rien.

Pour expérimenter, j'ai supprimé toutes les entrées de la table des pilotes (driver table), à l'exception de celle de la télécommande RC6. Encore une fois ir-keytable -a /etc/rc_maps.cfg n'a rien fait. Cependant, changer l'enregistrement à

#driver table file * * rc6_mce

ou

#driver table file sunxi-ir * rc6_mce

fonctionne et la définition contenue dans rc6_mce est chargée:

zero@opi:~$ sudo ir-keytable -a /etc/rc_maps.cfg Old keytable cleared Wrote 63 keycode(s) to driver Protocols changed to rc-6

Enfin, un peu de progrès. Notez que toute mention de l'objet noyau rc-rc6-mce avec ou sans l'extension .ko et avec ou sans son chemin complet ne fonctionne pas. L'ajout du pilote sunxi-ir comme premier élément ne change rien:

#driver table file * * rc6_mce fonctionne sunxi-ir * rc6_mce fonctionne * rc-rc6-mce rc6_mce ne fonctionne pas sunxi-ir rc-rc6-mce rc6_mce ne fonctionne pas

Malheureusement, il ne semble pas possible de charger deux définitions de contrôle à distance avec le fichier de configuration. J'ai essayé de lister les fichiers de traduction souhaités.

... #driver table file * * rc6_mce * * keyes

Cela ne fonctionne pas, ir-keytable s’arrête dès que le premier fichier est chargé.

Configuration automatique toc

Étant donné les deux dernières sections, voici comment la pile IR est initialisée au démarrage de l'Orange Pi Zero si une seule télécommande est utilisée. Commencez par ajouter dans le fichier de configuration /etc/rc_maps.cfg le nom d'un fichier de définition contenu dans le répertoire /etc/rc_keymaps, comme indiqué ci-dessous.

... #driver table file * * rc6_mce

Créez ensuite une tâche que cron exécutera au démarrage.

zero@opi:~$ crontab -e
... # m h dom mon dow command @reboot sudo ir-keytable -a /etc/rc_maps.cfg &> /tmp/ir-keytable.log

Cela devrait fonctionner!

Si deux ou plusieurs définitions de télécommandes IR doivent être utilisées, il sera nécessaire d'ignorer rc_maps.cfg complètement. Conséquemment, la tâche à effectuer au démarrage sera un peu plus complexe.

zero@opi:~$ crontab -e
# m h dom mon dow command @reboot sudo ir-keytable -p nec,rc6 -w /etc/rc_keymaps/rc6_mce &>> /tmp/ir-keytable.log @reboot sudo ir-keytable -w /etc/rc_keymaps/keyes &> /tmp/ir-keytable.log

Cela peut sembler étrange, mais les commandes sont exécutées dans l’ordre inverse. La deuxième ligne ajoute les enregistrements contenus dans le fichier keyes. Un fichier journal temporaire est crée et tous les messages ou avertissements provenant de ir-keytable y sont redirigés. Ensuite, la commande de la première ligne est exécutée. Elle ajoute les définitions du fichier rc6_mce, définit les protocoles IR nécessaires et tout message de sortie ou d'erreur est ajouté au fichier journal.

Étant un peu mal à l'aise avec cet ordre inversé, j'ai préféré créer un petit script bash dans lequel l'ordre d'exécution est clair et qui sera plus facile à modifier à l'avenir.

zero@opi:~$ mkdir bin zero@opi:~$ nano bin/ir-setup

Le fichier de configuration .profile ajoutera le répertoire ~/bin au chemin de recherche et ainsi bash saura trouver le script. Voici son contenu.

#!/bin/bash # Setup key tables and IR protocols for the KEYES and HP MCE IR remote controls sudo ir-keytable -w /etc/rc_keymaps/keyes &> /tmp/ir-keytable.log sudo ir-keytable -p nec,rc6 -w /etc/rc_keymaps/rc6_mce &>> /tmp/ir-keytable.log

N'oubliez pas que le « shebang » (le premier commentaire) est obligatoire pour que le fichier soit auto-exécutable. Mais il est également nécessaire de le marquer comme un exécutable.

zero@opi:~$ chmod +x bin/ir-setup

Il ne reste plus qu'à l'ajouter au ficher crontab.

zero@opi:~$ crontab -e
# m h dom mon dow command @reboot bin/ir-setup

Conclusion toc

Si l'on veut utiliser une télécommande IR comme interface avec un lecteur audio tel Rhythmbox ou un lecteur multimédia comme Kodi ce qui précède suffit. Ces logiciels prennent en charge la lecture des files d'attente d'évènements clavier. Il suffit d'associer les bons codes clavier aux codes de balayage de la télécommande. Évidemment, il faut connaître les codes clavier utilisé par les lecteurs, mais il s'agit là d'un autre sujet.

Quand on utilise un Orange Pi Zero, il est peu probable qu'on y installe un des lecteurs mentionnés ci-dessus. Mon objectif est d'utiliser une télécommande pour activer des dispositifs du système de domotique déjà en place. Ce sera le sujet du prochain billet.

Prise en charge d'une télécommande IR avec python-evdev->