Configurer sa carte tv et sa télécommande sous linux

Décembre 2016


Configurer sa carte tv et sa télécommande sous linux




Ce tutoriel s'adresse aux personnes sous debian ou une distribution qui se base dessus (ubuntu, xandros...). Sauf contre indication, les commandes qui suivent requièrent des droits administrateurs et doivent être lancées en root ou via un sudo.

Ce tutoriel a été réalisé avec une carte Winfast TV 2000 XP sous debian lenny et une télécommande Leadtek Y0400046.

Étape 1 : Installation de la carte


Le module bttv utilisé pour cette carte est directement fournit par le paquet linux-image. Il suffit de le configurer conformément au modèle de la carte TV. Pour cela on crée/corrige le fichier /etc/modprobe.d/bttv.conf et on met dedans :

options bttv radio=0 card=34 tuner=24 gbuffers=8  


Attention : Ceci est spécifique à la carte TV et donc il faudra sans doute le corriger si vous utilisez un autre modèle de carte.

Afin que le module soit chargé au démarrage on corrige également /etc/modules en rajoutant dedans le module bttv. On peut d'ores et déjà charger le module bttv en tapant :

modprobe bttv



Dans mon cas le device associé à la carte TV s'appelle /dev/video0.

Étape 2 : Installation de tvtime


Il existe plusieurs logiciels pour regarder la télé sous linux. J'ai essayé KdeTV mais malheureusement, avec ma carte, une bande verte apparaît sur le bord droit de l'image en mode plein écran pour une raison assez obscure.

Sous tvtime, pas de problème, tout marche impeccable. Pour l'installer

aptitude update  
aptitude safe-upgrade  
aptitude install tvtime


Il ne reste plus qu'à lancer TV Time et à scanner les chaînes avec TV time (tout peut se faire à la souris). Si le tuner et la carte sont correctement configurés au moment de charger le module bttv ça ne devrait pas poser de problème. Dans mon cas
- source vidéo : télévision
- mode sonore : pal-i
- norme de réception : secam

Si vous n'avez pas de son dans tvtime et que vous ne pouvez le régler


C'est probablement que vous utilisez un noyau récent OSS, n'est pas forcément directement supporté. Vous pouvez pouvez retrouver le numéro de version de votre noyau avec la commande :

uname -r


Si vous utilisez un noyau => 3.0.0 installez oss-compat et redémarrez :

aptitude install oss-compat


Pour les noyaux antérieurs, essayez d'installer oss4-dkms, et redémarrez.

Étape 3 : Configuration de la télécommande


C'est là que tout se complique. Pour que la télécommande soit prise en charge, il faut passer par lirc.

Toutefois, l'utilisation de lirc est assez complexe pour le néophytes et les quelques tutoriels que j'ai pu croiser pas forcément grand public ou d'actualité. En particulier il est souvent question d'un module lirc_gpio qui n'existe plus sur les noyaux récents.

a) Installation de lirc


On commence par installer le module qui va permette la prise en charge de la télécommande. Je vous recommande de passer par module-assistant car les archives disponibles sur le site de lirc ont peu de chance de compiler à moins que vous ayez recompilé votre propre noyau.

aptitude install module-assistant lirc-modules-source lirc-x module-assistant  


Dans l'interface de module assistant, choisir lirc-modules-source (Get, Build, Install). Si tout s'est bien passé module-assistant a créé un module, l'a empaqueté sous forme d'un paquet debian dans /usr/src, et l'a installé.

Si tout va bien la carte est visible quand on tape la commande :

cat /proc/bus/input/devices  


Dans mon cas :

...  
I: Bus=0001 Vendor=107d Product=6606 Version=0001  
N: Name="bttv IR (card=34)"  
P: Phys=pci-0000:01:07.0/ir0  
S: Sysfs=/class/input/input6  
U: Uniq=  
H: Handlers=kbd event6  
B: EV=100003  
B: KEY=10afc336 2150a48 0 0 0 404 80010007 80000190 4801 1e0000 4400 100000 10000ffc  
...  


Il est important de relever le device auquel est associé la télécommande. En effet celui-ci peut différer dans votre cas, à vous de l'adapter en conséquence dans ce qui suit. Dans la commande qui suit, je considère que c'est event6.

lircd -d /dev/input/event6 -H dev/input  


Cette commande permet de créer le device /dev/lircd qui sera utilisé par lircd pour recevoir les signaux émis par la télécommande.

Ensuite on corrige le fichier /etc/lirc/hardware.conf de sorte à avoir :

#Chosen Remote Control  
REMOTE="Winfast TV2000/XP (card=34)"  

# Arguments which will be used when launching lircd  
LIRCD_ARGS=""  

#Don't start lircmd even if there seems to be a good config file  
#START_LIRCMD=false  

#Try to load appropriate kernel modules  
LOAD_MODULES=true  

# Run "lircd --driver=help" for a list of supported drivers.  
DRIVER="dev/input"  
# If DEVICE is set to /dev/lirc and devfs is in use /dev/lirc/0 will be  
# automatically used instead  
DEVICE="/dev/input/event6"  
MODULES=""  

# Default configuration files for your hardware if any  
LIRCD_CONF="/etc/lirc/lircd.conf"  
LIRCMD_CONF=""  


Attention à corriger les variables DEVICE et REMOTE conformément à votre matériel ! Ensuite on (re)lance lirc :

/etc/init.d/lirc restart  


Remarque : si suite à une mise à jour noyau lirc ne fonctionne plus, il est possible que le device associé à lirc ait changé. Dans ce cas là, irw ne parviendra bien entendu plus à se connecter (que ce soit en utilisateur ou en root puisque lirc ne pointe pas sur le bon device !)

(mando@aldur) (~) $ irw  
connect: Connection refused  


Dans ce cas, il suffit de reprendre l'étape "a) Installation de lirc" en corrigeant les différents fichiers de configuration, puis de relancer lirc.

b) Premiers tests


À ce stade il est normalement possible de commencer à récupérer les signaux de la télécommande avec la commande irw. Ce programme peut être lancé en utilisateur. Pendant qu'il tourne, on peut appuyer sur les touches de la télécommande pour récupérer les identifiants de touches (en gras ci-dessous) qui seront utilisés dans les fichiers de configuration lirc. Ces identifiants dépendent de la télécommande. Par exemple chez moi, voici ce qui est apparu en appuyant sur les touches "channel +", "finetune +", "8", "6" et "5" :

(mando@aldur) (~) $ irw  
0000000080010192 00 CH_UP Leadtek-RM0010  
000000008001004e 00 FINETUNE+ Leadtek-RM0010  
0000000080010009 00 8 Leadtek-RM0010  
0000000080010007 00 6 Leadtek-RM0010  
0000000080010006 00 5 Leadtek-RM0010  


À présent il faut dire à lirc comment traiter ces signaux.

Note : À l'époque où lirc_gpio existait, ce module créait un device /dev/lirc et il était possible d'utiliser mode2 pour récupérer des codes touches. En ce qui me concerne ce device n'existe plus et la commande mode2 ne marche donc plus.

c) Configurer lirc


On peut récupérer sur le site de lirc une map de télécommande à peu près utilisable. On peut télécharger une archive ici contenant de très nombreux fichiers pouvant servir à remplir /etc/lirc/lircd.conf
http://www.lirc.org/remotes.tar.bz2

Dans mon cas j'ai utilisé celui de la télécommande Y0400052 car je n'avais pas trop le courage d'en reconstruire un. Voici à quoi ressemble mon fichier /etc/lirc/lircd.conf :

#/etc/lirc/lircd.conf  
# Please make this file available to others  
# by sending it to <lirc@bartelmus.de>  
#  
# this config file was automatically generated  
# using lirc-0.8.3-CVS(dev/input) on Sat Jan 12 17:04:54 2008  
#  
# contributed by: Mike Treichler  
#  
# brand: LeadTek  
# model no. of remote control: Y0400046 (bundled with Winfast 2000XP Deluxe)  
# devices being controlled by this remote: LeadTek Winfast 2000XP Deluxe  

# brand: Leadtek  
# model: Y0400052 (bundeled with Winfast PVR2000 TV-card)  
#  
# Note: Only CH_UP, CH_DOWN, VOL_UP and VOL_DOWN will repeat. This  
# seems to be a limitation of the remote control.  

begin remote  

name Leadtek-RM0010  
bits 16  
eps 30  
aeps 100  

one 0 0  
zero 0 0  
pre_data_bits 16  
pre_data 0x8001  
gap 423871  
toggle_bit_mask 0x0  

begin codes  
POWER 0x0074  
MTS 0x0188  
TV/FM 0x0182  
VIDEO 0x0189  
DISPLAY 0x0166  
CH_UP 0x0192  
CH_DOWN 0x0193  
VOL_DOWN 0x0072  
VOL_UP 0x0073  
FULLSCREEN 0x0174  
TELETEXT 0x0184  
SLEEP 0x008E  
BOSSKEY 0x0163  
MUTE 0x0071  
RED 0x018E  
GREEN 0x018F  
YELLOW 0x0190  
BLUE 0x0191  
1 0x0002  
2 0x0003  

3 0x0004  
4 0x0005  
5 0x0006  
6 0x0007  
7 0x0008  
8 0x0009  
9 0x000A  
0 0x000B  
. 0x0034  
FINETUNE+ 0x004E  
FINETUNE- 0x004A  
PIP 0x00E2  
ENTER 0x001C  
RECALL 0x0195  
BACK 0x019C  
PLAY 0x00A4  
NEXT 0x0197  
TIMESHIFTING 0x0169  
STOP 0x0080  
REC 0x00A7  
SNAPSHOT 0x00EA  
end codes  
end remote  


Je précise que si vous utilisez la même télécommande les touches BOSS KEY, PIP, colorées (vert, rouge, bleue, jaune), ZZ et les touches de magnétoscope seront mal reconnues (mais de toutes façon elles sont peu utiles donc bon...). Quoi qu'il en soit la commande irw ou avec irrecord permet d'arranger ça, je laisse ça aux courageux... Exemple :

0000000080010192 00 CH_UP Leadtek-RM0010  


... correspond à la ligne :

CH_UP 0x0192  

d) Configurer le comportement des touches


À ce stade les codes touches sont correctement associées à des identifiants, mais ça ne rend pas lirc utilisable pour autant (ce serait trop simple...).

Il faut maintenant intercepter ces évènements soit avec irexec, soit avec irxevent et les transmettre vers les différents logiciels lancés. Ceci se fait à l'aide de règles. Elles définissent ce qui va se passer quand on appuie sur telle ou telle touche. Ce qu'il faut retenir :
- irexec permet de lancer une commande shell
- irxevent permet de lancer l'équivalent d'une action sur le clavier (éventuellement vers une application particulière).

Ce qui n'est pas forcément intuitif, c'est que les deux logiciels sont susceptibles de lire le même fichier de configuration, par défaut ~/.lircrc. Ils doivent tourner en tâche de fond pour fonctionner (démons). Chacun d'eux retrouve ses billes à l'aide du tag "prog" (voir ci-dessous).

Exemple : ces deux règles sont équivalentes : sous tvtime, la touche f permet de passer en mode plein écran.

a) avec irxevent :

begin  
  prog = irxevent  
  button = FULLSCREEN  
  config = Key f tvtime  
end  


b) avec irexec :

begin  
  prog = irexec  
  button = FULLSCREEN  
  config = tvtime-command TOGGLE_FULLSCREEN  
end  


Ces règles sont configurées généralement dans ~/.lircrc. Personnellement, je les ai mises dans /etc/lirc/lircrc, ce qui permet de les partager pour tous les profils de la machine. Il suffit ensuite de créer un lien symbolique dans son home.

ln -s /etc/lirc/lircrc ~/.lircrc


Quelle que soit la méthode retenue, il ne faut pas perdre de vue que les identifiants touches figurant dans ~/.lircrc et dans /etc/lirc/lircd.conf doivent concorder sinon il ne se passera rien !

Voici par exemple à quoi ressemble un fichier ~/.lircrc cohérent avec l'exemple que j'ai présenté pour piloter tvtime :

begin  
 prog = irexec  
 button = CH_DOWN  
 config = tvtime-command CHANNEL_DOWN  
end  

begin  
 prog = irexec  
 button = CH_UP  
 config = tvtime-command CHANNEL_UP  
end  

begin  
 prog = irexec  
 button = VOL_DOWN   
 config = tvtime-command MIXER_DOWN  
end  

begin  
 prog = irexec  
 button = VOL_UP   
 config = tvtime-command MIXER_UP  
end  

begin  
 prog = irexec  
 button = FULLSCREEN  
 config = tvtime-command TOGGLE_FULLSCREEN  
end  

begin  
 prog   = irexec  
 button = 1  
 config = tvtime-command CHANNEL_1  
end  

begin  
 prog   = irexec  
 button = 2  
 config = tvtime-command CHANNEL_2  
end  

begin  
 prog   = irexec  
 button = 3  
 config = tvtime-command CHANNEL_3  
end  

begin  
 prog   = irexec  
 button = 4  
 config = tvtime-command CHANNEL_4  
end  

begin  
 prog   = irexec  
 button = 5  
 config = tvtime-command CHANNEL_5  
end  

begin  
 prog   = irexec  
 button = 6  
 config = tvtime-command CHANNEL_6  
end  

begin  
 prog   = irexec  
 button = 7  
 config = tvtime-command CHANNEL_7  
end  

begin  
 prog   = irexec  
 button = 8  
 config = tvtime-command CHANNEL_8  
end  

begin  
 prog   = irexec  
 button = 9  
 config = tvtime-command CHANNEL_9  
end  

begin  
 prog   = irexec  
 button = 0  
 config = tvtime-command CHANNEL_0  
end  


Une fois le fichier terminé ou corrigé, on (re)lance irexec et irxevent en tâche de fond pour qu'il soit pris en compte :

irxevent -d /etc/lirc/lircrc  
irexec -d /etc/lirc/lircrc  

e) Lancement automatique


Afin d'éviter d'avoir à les lancer à chaque redémarrage, le plus simple est de les lancer automatiquement quand on se loggue. Par exemple sous KDE, il suffit de créer un fichier ~/.kde/Autostart/remote.sh et de mettre dedans :

#!/bin/sh  
#CONF=/etc/lirc/lircrc 
CONF="$HOME/.lircrc" 

if [ "'ps -eo cmd | grep -c ^irxevent'" -eq 0 ]  
then  
    echo "Starting irxevent..."  
    irxevent -d $CONF 
fi  

if [ "'ps -eo cmd | grep -c ^irexec'" -eq 0 ]  
then  
    echo "Starting irexec..."  
    irexec -d $CONF 
fi  


Ensuite on met les droits en exécution :

chmod u+x ~/.kde/Autostart/remote.sh  

Un exemple plus complet


On peut trouver un exemple assez détaillé sur http://doc.ubuntu-fr.org/lircrc, pour piloter amarok, kaffeine, totem, ...

Dans le lien ci-dessus, la télécommande propose 4 modes. Un mode est délimité par un bloc (par exemple "begin totem" et "end totem"). Typiquement, le contenu de ~/.lircrc.tvtime n'est pris en compte que lorsque la télécommande est en mode "tvtime", c'est-à-dire après avoir appuyé sur le bouton tv.
Liens

Pour écrire ce tutoriel j'ai utilisé les liens suivants :
http://doc.ubuntu-fr.org/carte_tv_pilote_bttv
http://doc.ubuntu-fr.org/tvtime
http://doc.ubuntu-fr.org/lircrc
http://forums.debian.net/viewtopic.php?t=36134&sid=6b65ceba08d0c2f0b3444a080278c587

A voir également :

Ce document intitulé «  Configurer sa carte tv et sa télécommande sous linux  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.