Anleitung Lirc Installation für Antec Fusion mit Atric Empfänger

Aus VDR Wiki
Wechseln zu: Navigation, Suche

Diese Anleitung beschreibt, wie man LIRC und LCDProc auf Ubuntu 9.04 installiert, um das im Antec Fusion eingebaute LCD und den verbauten Lautstärkeregler an der Gehäusefront (Imon Device von Soundgraph 15c2:0038), sowie einen externen IR-Empfänger zu nutzen. Die Anleitung funktioniert möglicherweise auch mit anderen Gehäusen, die das gleiche Soundgraph LCD verbaut haben, sowie mit anderen IR-Empfängern.

Inhaltsverzeichnis

Hintergrund

Das Gehäuse "Antec Fusion Remote" hat zwar einen IR-Empfänger eingebaut, dieser kann aber nur mit MCE Fernbedienungen umgehen. Ich habe deswegen in das Gehäuse einen Atric IR-Einschalter eingebaut. Damit man das verbaute LCD-Display, den Lautstärkeregler an der Front, sowie den zusätzlichen IR-Empfänger nutzen kann, muss man LIRC entsprechend installieren und konfigurieren. Den IR Empfänger des Atric Einschalter habe ich hinter dem Frontpanel platziert, wo standardmäßig der IR-Empfänger des integrierten Soundgraph Moduls verbaut ist.

LIRC

Installation

Diese Installationsanleitung ist geschrieben für Ubuntu Jaunty Jackalope (9.04) und das Imon Device von Soundgraph 15c2:0038.

Anmerkung: Die Anleitung funktioniert auch mit LIRC 0.8.5 und Kernel 2.6.29.4. Siehe dazu Anmerkungen im Text.

Man kann mit lsub prüfen, ob man das richtige Modul installiert hat:

$ lsusb |grep -i sound
Bus 003 Device 003: ID 15c2:0038 SoundGraph Inc.

Herunterladen der aktuellsten LIRC Version:

mkdir src
cd src
wget http://prdownloads.sourceforge.net/lirc/lirc-0.8.4a.tar.bz2
tar xvfj lirc-0.8.4a.tar.bz2
rm -r lirc-0.8.4a.tar.bz2
cd lirc-0.8.4a/

Der Trick besteht darin, zuerst Lirc jeweils einmal separat für das Imom zu installieren und anschließend für den IR-Emfpänger. Danach kann man beide zusammenbringen, dazu später mehr.

Zuerst kompilieren wir Lirc für den externen Empfänger:

./configure --with-driver=serial
make -j2
sudo make install

./configure --with-driver=imon

Anschließend müssen wir die Datei config.h manuell bearbeiten, damit hinterher auch das LCD funktioniert..

nano config.h

In der Datei suchen (mit STRG-W) nach der Zeile:

/* #undef LIRC_IMON_LCD */

Die Zeile einkommentieren und eine 1 dahinter schreiben, so dass Sie hinterher so aussieht:

#define LIRC_IMON_LCD 1

Anschließend kompilieren:

make -j2
sudo make install


Leider installiert der make install die Kernel-Module unter Ubuntu 9.04 an einen falschen Ort. Deswegen müssen wir diese noch manuell anpassen: Bei (Kernel 2.6.29.4 ist das nicht notwendig)

cd /lib/modules/2.6.28-11-generic/kernel/ubuntu/lirc/lirc_imon
sudo mv lirc_imon.ko lirc_imon.ko.old
sudo ln -s /lib/modules/2.6.28-11-generic/misc/lirc_imon.ko lirc_imon.ko
cd /lib/modules/2.6.28-11-generic/kernel/ubuntu/lirc/lirc_serial
sudo mv lirc_serial.ko lirc_serial.ko.old
sudo ln -s /lib/modules/2.6.28-11-generic/misc/lirc_serial.ko lirc_serial.ko
cd /lib/modules/2.6.28-11-generic/kernel/ubuntu/lirc/lirc_dev
sudo mv lirc_dev.ko lirc_dev.ko.old
sudo ln -s /lib/modules/2.6.28-11-generic/misc/lirc_dev.ko lirc_dev.ko

Jetzt laden wir die Module in den Kernel:

sudo setserial /dev/ttyS0 uart none
sudo modprobe lirc_imon
sudo modprobe lirc_serial
sudo depmod -ae

Wenn alles gut geht, sollte es unter /dev mehrere lirc und lcd Devices geben:

$ ls /dev/li*
/dev/lirc  /dev/lirc0  /dev/lirc1  /dev/lirc2  /dev/lircd  /dev/lircm
$ ls /dev/lc*
/dev/lcd0  /dev/lcd1

Mit dem Befehl dmesg können wir nachsehen was passiert ist:

$ dmesg
[ 1898.112683] lirc_dev: IR Remote Control driver registered, major 61
[ 1898.114662] lirc_imon: Driver for Soundgraph iMON MultiMedia IR/VFD, v0.3
[ 1898.114666] lirc_imon: Venky Raju <dev@venky.ws>
[ 1898.114696] lirc_imon: imon_probe: found IMON device
[ 1898.114702] lirc_dev: lirc_register_plugin: sample_rate: 0
[ 1898.114767] lirc_imon: imon_probe: Registered iMON plugin(minor:0)
[ 1898.114806] lirc_imon: imon_probe: iMON device on usb<3:3> initialized
[ 1898.114817] lirc_imon: imon_probe: found IMON device
[ 1898.114822] lirc_dev: lirc_register_plugin: sample_rate: 0
[ 1898.114853] lirc_imon: imon_probe: Registered iMON plugin(minor:1)
[ 1898.114890] lirc_imon: imon_probe: iMON device on usb<3:3> initialized
[ 1898.114919] usbcore: registered new interface driver lirc_imon
[ 1922.820064] lirc_serial: auto-detected active low receiver
[ 1922.820071] lirc_dev: lirc_register_plugin: sample_rate: 0

Konfiguration

Damit wir den setserial nicht bei jedem Boot absetzen müssen, tragen wir ihn in die /etc/serial.conf ein.

sudo nano /etc/serial.conf

Folgende Zeile am Ende einfügen, falls bereits eine Zeile drin steht die mit /dev/ttyS0 beginnt, diese mit # auskommentieren.

/dev/ttyS0 uart none

In der autoserial.conf deaktivieren wir noch den letzten Eintrag mit #.

sudo nano /var/lib/setserial/autoserial.conf

Damit die Module beim Systemstart automatisch geladen werden, editieren wir noch die /etc/modules:

sudo nano /etc/modules

Am Ende fügen wir folgende Zeilen ein:

lirc_imon
lirc_serial

Nun legen wir noch die Modul-Parameter fest:

sudo nano /etc/modprobe.conf

Folgende Zeilen einfügen:

alias char-major-61 lirc_serial
options lirc_serial irq=4 io=0x3f8
options lirc_imon is_lcd=1

Wenn Lirc 0.8.5 verwendet wird, muss die letzte Zeile weggelassen werden.

Anschließend die Kernel Abhängigkeiten festlegen ausführen:

sudo depmod -ae

Jetzt müssen wir noch die Reihenfolge beim Boot anpassen, dass der setserial abgesetzt wird bevor die Kernel-Module geladen werden:

cd /etc/rcS.d/
sudo mv S30etc-setserial S05etc-setserial

So, jetzt können wir einmal rebooten um zu testen ob auch alles funktioniert. Nach dem Reboot sollte es folgendermaßen aussehen:

$ ls /dev/lirc*
/dev/lirc0  /dev/lirc1  /dev/lirc2
$ ls /dev/lcd*
/dev/lcd0  /dev/lcd1

Die Devices lirc0 und lirc1 sind die Geräte die vom Soundgraph Modul kommen, wobei der Volume-Regler an der Gehäusefront auf lirc1 liegen sollte. Das Device lirc2 ist der serielle Empfänger.

Test

Mit mode2 kann man die Geräte testen, hier habe ich am Regler gedreht:

$ sudo mode2 -r -d /dev/lirc1
code: 0x00010000
code: 0x01000000

Hier auf der RC5-Fernbedienung gedrückt:

$ sudo mode2 -d /dev/lirc2
pulse 33
space 9410461
pulse 880
space 778
pulse 1760
space 1591
[...]

Auto-Startskript

Damit der lircd beim Booten automatisch gestartet wird legen wir ein init.d Skript an:

sudo nano /etc/init.d/lircd

Folgenden Inhalt kopieren wir in das Skript:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          lirc
# Required-Start:    $etc-setserial
# Required-Stop:     $etc-setserial
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts the lircd
### END INIT INFO

# Author: Stephan Häuslschmid

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="LIRC"
NAME=lircd
DAEMON=/usr/local/sbin/$NAME
DAEMON_ARGS0="--driver=default --pidfile=/var/run/lircd.0.pid --device=/dev/lirc0 --listen=8765"
DAEMON_ARGS1="--driver=default --pidfile=/var/run/lircd.1.pid --device=/dev/lirc1 --listen=8766"
DAEMON_ARGS2="--driver=default --pidfile=/var/run/lircd.2.pid --device=/dev/lirc2 --output=/dev/lircd --connect=localhost:8765 --connect=localhost:8766"
PIDFILE0=/var/run/$NAME.0.pid
PIDFILE1=/var/run/$NAME.1.pid
PIDFILE2=/var/run/$NAME.2.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Function that starts the daemon/service
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE0 --exec $DAEMON -- $DAEMON_ARGS0

        start-stop-daemon --start --quiet --pidfile $PIDFILE1 --exec $DAEMON -- $DAEMON_ARGS1

        start-stop-daemon --start --quiet --pidfile $PIDFILE2 --exec $DAEMON -- $DAEMON_ARGS2

        return 0

}

# Function that stops the daemon/service
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE0 --name $NAME
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE1 --name $NAME
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE2 --name $NAME

        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2

        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2

        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE0
        rm -f $PIDFILE1
        rm -f $PIDFILE2

        return "$RETVAL"
}

# Function that sends a SIGHUP to the daemon/service
do_reload() {
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE0 --name $NAME
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE1 --name $NAME
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE2 --name $NAME
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

:

Anschließend das Skript speichern, schließen und ausführbar machen:

sudo chmod 755 /etc/init.d/lircd

Lirc können wir nun mit dem folgenden Befehl starten bzw. stoppen:

sudo /etc/init.d/lircd start
sudo /etc/init.d/lircd stop

Damit das Skript in die Bootreihenfolge eingegliedert wird setzen wir noch den folgenden Befehl ab:

sudo update-rc.d lircd defaults

Fernbedienung anlernen

Beim Anlernen der Fernbedienung ist grundsätzlich wie im LIRC-Artikel beschrieben zu Verfahren. Man muss allerdings den irrecord Befehlt für jedes Device einmal absetzen um die versch. Geräte anzulernen. Die Dateien kann man dann anschließend zusammenkopieren.

cd
irrecord -d /dev/lirc1 frontpanel.lirc

Den Anweisungen am Bildschirm folgen...

irrecord -d /dev/lirc2 remote.lirc

Den Anweisungen am Bildschirm folgen...

cat frontpanel.lirc > lircd.conf
cat remote.lirc >> lircd.conf
rm frontpanel.lirc remote.lirc
sudo /etc/init.d/lircd stop
sudo mv lircd.conf /etc/
sudo /etc/init.d/lircd start

Das Device lirc0 liefert beim Antec Fusion Remote nur Werte vom MCE-IR-Empfänger. Da ich die MCE-Fernbedienung nicht nutze, habe ich hier nichts angelernt. Nun könnte man denken, dass man dann für das lirc0 Device keinen lircd starten müsste. Das sollte man aber trotzdem tun, da das Soundgraph Modul die Eigenheit hat sich aufzuhängen, sobald ein Empfänger etwas empfängt und kein passender lircd dazu gestartet ist.

Testen kann man im Anschluss mit:

irw

LCD

Installation

cd ~/src
wget http://internap.dl.sourceforge.net/sourceforge/lcdproc/lcdproc-0.5.2.tar.gz
wget http://codeka.com/blogs/imon/lcdproc-0.5.2-imonlcd-0.3.patch
tar xvfz lcdproc-0.5.2.tar.gz
rm lcdproc-0.5.2.tar.gz
cd lcdproc-0.5.2/
patch -p1 < ../lcdproc-0.5.2-imonlcd-0.3.patch

Anschließend müssen wir noch eine Datei bearbeiten:

nano server/drivers/imonlcd.c
       { '|', { 0x0, 0x0, 0x0, 0xFE, 0x0, 0x0 } },
       { '}', { 0x0, 0x82, 0x82, 0x6C, 0x10, 0x0 } },
       { '~', { 0x0, 0x20, 0x40, 0x20, 0x10, 0x20 } },
/*
       { 'Ö', { 0x0, 0x1C, 0xA2, 0x22, 0xA2, 0x1C } },
       { 'Ä', { 0x0, 0x04, 0xAA, 0x2A, 0xAA, 0x1E } },
       { 'Ü', { 0x0, 0x3C, 0x82, 0x02, 0x84, 0x3E } },
       { 'ö', { 0x0, 0x1C, 0xA2, 0x22, 0xA2, 0x1C } },
       { 'ä', { 0x0, 0x04, 0xAA, 0x2A, 0xAA, 0x1E } },
       { 'ü', { 0x0, 0x3C, 0x82, 0x02, 0x84, 0x3E } },
       { 'ß', { 0x0, 0x7E, 0x80, 0xA8, 0xA8, 0x50 } },
*/

Dort die Klammern /* und */ entfernen, sonst funktionieren später die Umlaute nicht.

Danach müssen wir noch die Render-Frequenz anpassen:

nano server/main.h
#define RENDER_FREQ 8

ändern auf

#define RENDER_FREQ 4

Anschließend können wir kompilieren:

aclocal && autoconf && automake
./configure --enable-drivers=imonlcd
make
sudo make install

Konfiguration

Im Anschluss müssen wir noch die Konfigurationsdateien anpassen:

sudo nano /usr/local/etc/LCDd.conf

Suchen:

Driver=curses

Ersetzen:

Driver=imonlcd

Suchen:

DriverPath=server/drivers/

Ersetzen:

DriverPath=/usr/local/lib/lcdproc/

Außerdem kann man wenn man möchte die Meldung ändern, die das Display anzeigt, wenn der LCDd heruntergefahren wurde. Da das Display beim Antec-Fusion leider nicht ausgeht wenn der PC aus ist habe ich folgende Nachricht eingefügt:

# GoodBye message: each entry represents a display line; default: builtin
#GoodBye="Thanks for using"
#GoodBye="   LCDproc!"
GoodBye="    HTPC ist"
GoodBye=" ausgeschaltet."

Am Ende anfügen:

[imonlcd]
Device=/dev/lcd0
Contrast=100

Die Einstellung für den Kontrast ist Geschmackssache, für mich ist 100 am angenehmsten. Für dunkle Gehäuse kann man bspw. auch 500 verwenden.

Test

Folgender Befehl sollte eine Ausgabe auf dem LCD Display erzeugen:

sudo LCDd -f -r 4

Auto-Startskript

Auch hier müssen wir wieder ein Autostartskript anlegen:

sudo nano /etc/init.d/lcdd

Den Inhalt in die Datei kopieren:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          lcdd
# Required-Start:    $etc-setserial
# Required-Stop:     $etc-setserial
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts the LCDd
### END INIT INFO

# Author: Stephan Häuslschmid

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Starts the LCDd"
NAME=LCDd
DAEMON=/usr/local/sbin/$NAME
DAEMON_ARGS="-i 0 -s 1"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Function that starts the daemon/service
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null  \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
}

# Function that stops the daemon/service
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        #start-stop-daemon --stop --quiet --retry=KILL/2 --pidfile $PIDFILE --name $NAME
        #RETVAL="$?"
        #[ "$RETVAL" = 2 ] && return 2
        #start-stop-daemon --stop --quiet --oknodo --retry=KILL/5 --exec $DAEMON
        #[ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        killall $NAME
        RETVAL="$?"

        rm -f $PIDFILE
        return "$RETVAL"
}

# Function that sends a SIGHUP to the daemon/service
do_reload() {
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

:

Anschließend speichern und schließen und die Rechte anpassen:

chmod 755 /etc/init.d/lcdd

Starten und stoppen können wir nun mit den folgenden Befehlen:

sudo /etc/init.d/lcdd start
sudo /etc/init.d/lcdd stop

Damit das Skript in die Bootreihenfolge eingegliedert wird, setzen wir noch den folgenden Befehl ab:

sudo update-rc.d lcdd defaults

Nun sollte das LCD und LIRC funktionieren. :-)

Links

Hier sind ein paar Links auf Anleitungen aus denen ich einige Informationen übernommen habe: