Linux Infrared Remote Control

aus openSUSE, der freien Wissensdatenbank

Inhaltsverzeichnis

Beschreibung

Das Paket LIRC dient dem Empfang und der Verarbeitung von Fernbedienungssignalen. In Verbindung mit irexec und irxevent können viele Programme mit einer handelsüblichen Infrarot-Fernbedienung gesteuert werden. Besonders zu erwähnen ist die Benutzung im Zusammenhang mir VDR, MythTV, MPlayer, Kaffeine undn vielen anderen mehr.

Installation

Der einfachste Weg ist die Installation mittels Yast, hier einfach das Pakt LIRC und das passende LIRC Kernel Modul aus den Repositories installieren. Sollte unklar sein welcher Kernel verwendet wird, kann dies auf der Konsole mit dem Befehl "uname -r" abgefragt werden. Natürlich kann auch der Tarball von www.lirc.org heruntergeladen und von Hand installieren werden. Wer die jeweils neueste Version von LIRC braucht kann diese mit cvs herunterladen. Eine ausführliche Anleitung dazu findet sich hier.

Nützliche Links zur Installation

Konfiguration

Verfügbare Systeminfos abrufen

Nachdem LIRC inklusive Kernel Module installiert ist, sollte die Ausgabe von dmesg (zuerst mit ausgestöpseltem Empfänger und dann mit eingestöpseltem Empfänger) wertvolle Informationen über den Empfänger der Fernbedienung liefern. Anhand der dmesg Ausgabe kann ersehen werden um es sich bei der Fernbedienung z.B. um eine HID-Fernbedienung handelt:

 migo@desktop:~> dmesg
 usb 7-2: new low speed USB device using uhci_hcd and address 3
 usb 7-2: configuration #1 chosen from 1 choice
 input: HID 05a4:9881 as /devices/pci0000:00/0000:00:1d.1/usb7/7-2/7-2:1.0/input/input7
 input,hidraw1: USB HID v1.10 Keyboard [HID 05a4:9881] on usb-0000:00:1d.1-2
 input: HID 05a4:9881 as /devices/pci0000:00/0000:00:1d.1/usb7/7-2/7-2:1.1/input/input8
 input,hidraw2: USB HID v1.10 Mouse [HID 05a4:9881] on usb-0000:00:1d.1-2
 usb 7-2: New USB device found, idVendor=05a4, idProduct=9881
 usb 7-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0

Bei herkömmlichen Fernbedienungen sieht die Ausgabe von dmesg unter Umständen so aus:

 migo@desktop:~> dmesg
 usb 7-2: new low speed USB device using uhci_hcd and address 4
 usb 7-2: configuration #1 chosen from 1 choice
 usb 7-2: New USB device found, idVendor=0bc7, idProduct=0006
 usb 7-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
 usb 7-2: Product: RF receiver
 usb 7-2: Manufacturer: X10 WTI
 input: X10 WTI RF receiver as /devices/pci0000:00/0000:00:1d.1/usb7/7-2/input/input9
 ati_remote: Weird data, len=1 ff 00 00 00 00 00 ...
 usbcore: registered new interface driver ati_remote
 ati_remote: Registered USB driver ATI/X10 RF USB Remote Control v. 2.2.1
 lirc_dev: IR Remote Control driver registered, major 61
 lirc_atiusb: USB remote driver for LIRC $Revision: 1.71 $
 lirc_atiusb: Paul Miller <pmiller9@users.sourceforge.net>
 usbcore: registered new interface driver lirc_atiusb

Die Ausgabe von dmesg bringt viele wertvolle Informationen die das weitere Vorgehen bestimmen. Im ersten Fall handelt es sich um einen HID Fernbedienung, im zweiten Fall hingegen handelt es sich um eine Fernbedienung die den LIRC Treiber "lirc_atiusb" benötigt.


Einrichtung eines seriellen Empfängers, Beispiel openSUSE 11.0

Vorbereitung

Notwendig sind die Pakete lirc und das passende Kernel-Modul, z.B. lirc-kmp-pae wenn bereits kernel-pae installiert ist. Das Tool setserial wird zur Konfiguration des Kernel-Treibers der seriellen Schnittstelle verwendet. Installation mit:

 zypper in lirc lirc-kmp-pae setserial

Einrichtung und Test des Kernel-Moduls

Kurzfassung:

  • Seriellen Port mit "setserial /dev/ttyS0 uart none" freischalten ()
  • kernel-modul in /etc/modprobe.d/lirc konfigurieren

Zuerst ist zu prüfen, ob der ausgesuchte serielle Port (hier /dev/ttyS0 - "COM1" in der Mainboardbeschreibung) bereits belegt ist:

 # setserial /dev/ttyS0
 /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4

In diesem Fall ist der Port vom seriellen Treiber des Kernels belegt. Mit folgedem Befehl geben wir den Port frei - wenn auch nur bis zum reboot; das lirc-Kernelmodul kann geladen werden.

 # setserial /dev/ttyS0 uart none
 #  setserial /dev/ttyS0
 /dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
 # modprobe -v lirc_serial
 insmod /lib/modules/2.6.25.18-0.2-pae/weak-updates/lirc_serial/lirc_serial.ko irq=4 io=0x3f8 

Anlegen der Konfiguration für das Kernel-Modul "lirc_serial" (Treiber für seriellen Empfänger) mit

 echo -e "alias char-major-61 lirc_serial\noptions lirc_serial irq=4 io=0x3f8\n" > /etc/modprobe.d/lirc
 modprobe -v lirc_serial


Fernbedienungen die über ein LIRC Modul angesprochen werden

Nach der Ausgabe von dmesg sollte bekannt sein welches LIRC_Modul nötig ist um den Empfänger der Fernbedienung ansprechen zu können. Bei meiner Fernbedienung ist es das Modul "lirc_atiusb". In der Datei /etc/sysconfig/lirc sind folgende Zeilen zu editieren:

alt: LIRCD_DEVICE="" neu: LIRCD_DEVICE="/dev/lirc"

alt: LIRC_MODULE="" neu: LIRC_MODULE="lirc_atiusb"

Mit dem Befehl lsmod kann geprüft werden ob alle Module korrekt geladen werden.

desktop:/home/migo # lsmod | grep lirc
lirc_atiusb            14708  0
lirc_dev               11068  1 lirc_atiusb
usbcore               165892  7   
lirc_atiusb,usb_storage,ati_remote,usbhid,ehci_hcd,uhci_hcd

Das Modul ati_remote darf nicht geladen werden ! Um zu verhindern das das Modul geladen wird ist es erforderlich in der Datei /etc/modprobe.d/blacklist die Zeile

blacklist ati_remote

anzufügen. Damit das lirc Modul bei jedem starten des PC korrekt geladen wird, muß in der Datei /etc/modprobe.conf die Zeile

alias char-major-61 lirc_atiusb

angefügt werden. Nach einem Restart des PC sollte die Ausgabe von lsmod | grep lirc so aussehen:

desktop:/home/migo # lsmod | grep lirc
lirc_atiusb            14708  0
lirc_dev               11068  1 lirc_atiusb
usbcore               165892  6 lirc_atiusb,usb_storage,usbhid,ehci_hcd,uhci_hcd

Weiterhin sollte die Device Datei /dev/lirc0 vorhanden sein.


HID (Human Interface Device) Fernbedienung

Das System legt unter /dev/input/ mehrere Dateien an, über die die Fernbedienung, bzw. der Empfänger der Fernbedienung angesprochen wird. HID Geräte werden immer über zwei /dev/input/ Dateien angesprochen um alle Tasten der Fernbedienung benutzen zu können. Falls unklar ist, welche Dateien zuständig sind, den Rechner mit eingestöpseltem USB Empfänger runter und wieder hochfahren. Anschließend in das Verzeichnis /dev/input wechseln. Nun den USB Empfänger abstöpseln, und nachsehen welche Dateien verschwinden. Sobald der Empfänger wieder angschlossen wird, werden einige Dateien unter /dev/input/event* neu angelegt. (/dev/input/mice und /dev/input/mouse* kann hierfür ignoriert werden). Diese neu angelegten Dateien sind zuständig für den USB Empfänger. Bei manchen PC sind die Dateien unter /dev/input/event nach jedem Systemstart unterschiedlich, in diesem Fall sollten die entsprechenden Dateien unter /dev/input/by-path/* oder /dev/input/by-id/* verwendet werden. Das Skript lirc_multievent (siehe weiter unten) ist entsprechend anzupassen.

Im Gegensatz zu einer herkömmlichen Fernbedienung, die über ein LIRC Modul angesprochen wird, wird bei einer HID Fernbedienung vom System her schon alles für LIRC bereit gestellt. (Falls lirc nicht mit Yast aus den Repositories installiert wird sondern von Hand ist der Treiber "devinput" zu wählen !!) Somit ist eine Anpassung der Dateien /etc/sysconfig/lirc bzw. /etc/init.d/lirc nicht notwendig. Der Start von lirc erfolgt durch das Skript lirc_multievent (siehe unten). Diese Datei nach /etc/init.d kopieren und ausführbar machen, anschließend im RunlevelEditor den Dienst aktivieren. Anstelle von Yast-RunlevelEditor kann hierfür auch insserv verwendet werden.

Nun kann die lircd.conf Datei für den Linux Input Layer driver von hier heruntergeladen und als /etc/lircd.conf gespeichert werden. Dies ist eine Standard Datei und sollte für alle HID Fernbedienungen verwendet werden können. Im Gegensatz zu einer Installation mit einer "normalen" Fernbedienung wird irrecord deshalb nicht benötigt.

Ein erster Test mit irw:

 irw /dev/lircd

Ein Tastendruck auf der Fernbedienung sollte nun eine Ausgabe auf der Konsole erzeugen:

 migo@desktop:~> irw /dev/lircd
 0000000000010073 00 VOLUMEUP linux-input-layer
 0000000000010048 00 KP8 linux-input-layer
 000000000001006d 00 PAGEDOWN linux-input-layer


irrecord und die Datei lircd.conf

Mit Hilfe des Programms irrecord, das im LIRC Paket enthalten ist, kann für jede unterstützte Fernbedienung eine lircd.conf Datei erzeugt werden. Diese Datei enthält neben den Tasten-Codes auch deren (freiwählbare) Bezeichnung der Tasten. Es existiert bereits eine umfangreiche Sammlung von lircd.conf Dateien zu den unterstützten Fernbedienungen auf der Projektseite. Sollte eure Fernbedienung nicht dabei sein, muß eine entsprechende Datei mit irrecord angelegt werden. Nur bei HID Fernbedienungen ist dies nicht notwendig da hier eine Standard Datei verwendet werden kann. Die vergebenen Bezeichnungen der Tasten werden später in der Datei .lircrc verwendet.

irrecord /etc/lircd.conf

startet das Programm. Nach dem drücken aller Tasten auf der Fernbedienung wird die Datei /etc/lircd.conf erzeugt.


irexec, irxevent, .lircrc & co

Beide Programme sind im LIRC Paket vorhanden und werden verwendet um Programme zu steuern, bzw. innerhalb von Programmen "events" auszulösen. irexec und irxevent greifen auf die Datei .lircrc zu, die im Home Verzeichnis des Users anzulegen ist. Der Aufruf erfolgt in einem skript mittels

  #!/bin/bash
 irxevent /home/username/.lircrc &
 irexec /home/username/.lircrc &

Eine ausführliche Beschreibung zum Datei Format einer .lircrc Datei befindet sich hier.


Skript zum starten von LIRC bei HID Fernbedienungen

Das Skript kopieren und als /etc/init.d/lirc_multievent speichern und mit

 chmod 750 /etc/init.d/lirc_multievent

ausführbar machen

#! /bin/sh 
#
# /etc/init.d/lirc_multievent 
# 
#
### BEGIN INIT INFO
# Provides: lirc
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 5
# Default-Stop: 0 1 2 3 6
# Short-Description: lirc for use with multiple /dev/input/ devices
# Description:
### END INIT INFO
. /etc/rc.status
rc_reset
starting_lircd()
  {
  lircd --driver=devinput --device=/dev/input/event2 --pidfile=/var/run/lirc1.pid --listen=9988;
  lircd --driver=devinput --device=/dev/input/event3 --pidfile=/var/run/lirc2.pid --connect=localhost:9988;
# 
#
# Bei manchen PC ist die Vergabe der Dateien /dev/input/event nach einem Neustart nicht immer gleich. Deshalb kann der
# Zugriff auch über die Dateien /dev/input/by-id/* oder /dev/input/by-path/* erfolgen:
#
# lircd --driver=devinput --device=/dev/input/by-path/pci-0000:00:12.0-usb-0:3:1.0-event-kbd --pidfile=/var/run/lirc1.pid --listen=9988;
# lircd --driver=devinput --device=/dev/input/by-path/pci-0000:00:12.0-usb-0:3:1.1-event- --pidfile=/var/run/lirc2.pid --connect=localhost:9988;
#
#
# ein Beispiel wenn noch mehr devices eingebunden werden sollen:
# lircd --driver=devinput --device=/dev/input/event1 --pidfile=/var/run/lirc1.pid --listen=9988
# lircd --driver=devinput --device=/dev/input/event2 --pidfile=/var/run/lirc2.pid --listen=9987
# lircd --driver=devinput --device=/dev/input/event3 --pidfile=/var/run/lirc3.pid --connect=localhost:9988 --connect=localhost:9987
#
#
  if test ! -e /dev/lircd; then ln -s /var/run/lirc/lircd /dev/lircd; fi     # prüfen ob symlink /dev/lircd  existiert, wenn nein dann symlink anlegen
  checkproc lircd
  if [ "$?" == 0 ]; then                                                     # prüfen ob lircd auch wirklich gestartet wurde
    echo "sucess !";
  else
    echo "could not start lircd";
    exit 1
  fi
  }
case "$1" in
start)
  checkproc lircd
  if [ "$?" == 0 ]; then
    echo -n "lirc is already running with pid: "
    pidof lircd
    exit 1;
  else
    echo -n "starting lircd... ";
    starting_lircd
  fi
  rc_status -v1                           #  done-message
  ;;
stop)
  checkproc lircd
  if [ "$?" == 0 ]; then
    echo "killing lircd"
    killproc lircd
  else
    echo "lircd is not running"
  fi
  rc_status -v1
  ;;
restart)
  checkproc lircd
  if [ "$?" == 0 ]; then
    echo -n "lircd is already running with pid: "
    pidof lircd
    echo "lircd will be killed"
    killproc lircd
  fi
  echo -n "starting lircd... ";
  starting_lircd
  rc_status -v1
  ;;
status)
  checkproc /usr/sbin/lircd
  if [ "$?" == 0 ]; then
    echo -n "lircd is running with pid: ";
    pidof lircd
  else
    echo "lircd is not running";
  fi
  if test -e /dev/lircd; then 
    echo "/dev/lircd exists";
  else
    echo "/dev/lircd does not exist";
    fi
  ;;
*)
  echo "Usage: $0 {start|stop|restart|status}";
  exit 1;
   ;;
esac
rc_exit


Programmversionen, Hardware

Bei den von mir verwendeten Fernbedienungen handelt es sich um eine Auvision PC-Fernbedienung "Media Center Edition" auch bekannt als "Hama MCE Remote Control" (HID) bzw. einer "Fernbedienung Media Center Edition X10" (lirc_atiusb) . Die Konfiguartion habe ich mit openSuse11.1 & lirc0.8.4 als auch openSuse11.0 & lirc0.8.3 getestet.