Les télécommandes infrarouge sous Linux

Les télécommandes infrarouge sous Linux

Article mis-à-jour en différenciant les informations spécifiques à Ubuntu 20.04 en vert, et celles spécifiques à Ubuntu 18.04 en orange;

Historique

Les télécommandes infrarouge étaient classiquement gérées par LIRC (Linux Infrared Remote Control) sous Linux pendant longtemps.

Depuis début 2016, on utilise plutôt libinput pour gérer tous les périphériques d'interface utilisateurs (clavier/souris etc) dont les télécommandes.

Fonctionnement

Avec un système récent et l'arrivée de libinput, les codes des télécommandes sont gérés directement dans le noyau. La table (keytable) est généralement chargé avec le pilote du récepteur (ou de la carte TV). Pour le vérifier :

$ dmesg | grep "IR keymap" -C5

Le système est alors près à utiliser la télécommande.

Utilisation / Configuration

Sur les variantes de debian, il faut avoir installé le paquet ir-keytable. Sous les variantes de RedHat, il faut avoir installé le paquet v4l-utils.

Une fois la table de touche (keytable) identifiée au niveau noyau, le fichier /etc/rc_maps.cfg est lu, permettant de sélectionner le fichier de correspondance entre les codes infrarouge des touches, et les touches habituelles d'un clavier multimédia. Ce second fichier est situé dans un dossier rc_keymaps (/lib/udev/rc_keymaps sur Ubuntu).

Débogguage

Tout d'abord, s'assurer que lirc ne tourne pas avant toute opération, sinon il empêche la capture des événements :

$ sudo systemctl stop lircd.service lircd.socket

Vérifier la configuration active, qui doit à minima retourner un périphérique infrarouge :

$ ir-keytable
Found /sys/class/rc/rc0/ (/dev/input/event1) with:
    Name: Avermedia A835B(3835)
    Driver: dvb_usb_af9035, table: rc-it913x-v2
    Supported protocols: nec  
    Enabled protocols: nec  
    Extra capabilities: <access denied>

Ici, la table rc-it913x-v2 a été chargé par le noyau, ce qui se traduit par le chargement du fichier /lib/udev/rc_keymaps/it913x_v2 via la configuration /etc/rc_maps.cfg.
Malheureusement dans mon cas les code des touches ne correspondent pas du tout à ceux qu'émet ma télécommande.

On va alors supprimer les codes enregistrés, et tester ceux envoyés par la télécommande

$ sudo ir-keytable -v -c
$ sudo ir-keytable -v -t

Les nouveaux codes sont à enregister dans un nouveau fichier de correspondance.

Pour vérifier si un fichier de correspondance adapté ou proche n'existerait pas déjà, chercher quelques codes émis par la télécommande (0x0516 dans l'exemple ci-dessous) :

$ grep '0x0516' /lib/udev/rc_keymaps/*

Pour avoir une idée des correspondances possibles (liste complète ici) :

$ cut -d' ' -f2 /lib/udev/rc_keymaps/* | sort -u | sed /table/d
$ cut -d'"' -f2 /lib/udev/rc_keymaps/* | grep KEY | sort -u

Une fois créé, charger le fichier (ici avec le fichier avermedia-rm-hv.rc ou avermedia-rm-hv.toml pour l'exemple), puis tester les touches :

$ fichier_correspondance=avermedia-rm-hv.toml
$ sudo ir-keytable -v -c -w ${fichier_correspondance}
$ sudo ir-keytable -v -t

Une fois satisfait de la table, il faut la faire charger à chaque démarrage, à la place de l'ancienne table :

$ sudo cp ${fichier_correspondance} /etc/rc_keymaps/
$ table_par_defaut=$(ir-keytable 2>&1 | grep -E '(table|Default keymap)' | awk '{print $NF}')
$ sudo sed -i -re /${table_par_defaut}/s:[[:alnum:]_]+\$:${fichier_correspondance}: /etc/rc_maps.cfg

Agancement du clavier

Une particularité avec les KEY_0 à KEY_9 est qu'elle correspondent aux touches au dessus de la zone des lettres sur un clavier. Aussi sur un clavier avec agancement qwerty, ce sont les chiffres, mais sur un clavier azerty, il s'agit de caractère de ponctuation/accent etc.

Une solution à ce problème est d'utiliser KEY_NUMERIC_0 à KEY_NUMERIC_9 à la place.

Utilisation avec Kodi

Kodi s'appui toujours sur LIRC pour exploiter pleinement les télécommandes. En effet, sans LIRC, Kodi exploitera les touches comme un clavier multimédia, ce qui fonctionnera pour les flêches de direction et le volume, mais pas pour la fonction retour/quitter par exemple, car elle n'existe pas sur un clavier.

Démarrer lirc et vérifier les informations que ce dernier renvoit, en essayant quelques touches :

$ sudo systemctl start lircd
$ irw
000000008001006a 00 KEY_RIGHT devinput-32
000000008001006a 01 KEY_RIGHT devinput-32

Bien noter le nom du périphérique renvoyé par lirc, dans mon cas devinput-32. C'est le périphérique pour lequel la correspondance des fonctions doit être faite dans Kodi. Cette correspondance est dans le fichier /usr/share/kodi/system/Lircmap.xml.

Si les touches renvoyées par libinput à travers lirc ne correspondent pas à une fonction dans Kodi, il est possible d'en rajouter ou de les modifier en surchargeant la configuration avec le fichier .kodi/userdata/Lircmap.xml. Dans mon cas, j'ai rajouté la fonction retour à la touche correspondante, ainsi que le retour à l'accueil ; voici mon fichier :

<?xml version="1.0" encoding="UTF-8"?>
<lircmap>
        <remote device="devinput-32">
                <start>KEY_HOME</start>
                <back>KEY_BACK</back>
        </remote>
</lircmap>

Pour prendre en compte ces changements, il faut redémarrer Kodi.

Ressources complémentaires

Haut de page