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.

