Samstag, 29. Dezember 2012

OSCAM auf PogoPlug

Nun habe ich acht PogoPlugs zu Hause stehen - aber ein paar Erfahrungen woolen noch gesammelt werden, bevor ich sie an Freunde und Familie als Rundum-Sorglos-Pakete verschenken kann. Der USB-Port meines AppleTV(1) war nie sonderlich stabil, also warum ihn nicht entlasten indem ich den OSCAM Server mit den beiden Kartenlesern auf einen PogoPlug verfrachte. OSCAM verbindet meine beiden Sat-Receiver mit unserer HD+ und Sky-Abo-Karte.


Zum Glück habe ich bereits eine voll eingerichtete OpenWRT Build-Umgebung und irgendwo in den Verzeichnissen muss ja auch die Crosscompiler Toolchain liegen. Bei den ganzen Build- und Staging-Verzeichnissen musste ich ein bischen suchen, bis ich die funktionierenden Parameter gefunden hatte. Etwas hilfreich waren die Analogien im Streamboard Wiki für andere Architekturen.

So habe ich es letztendlich hinbekommen:

Zunächst werden die Environment Variablen gesetzt (OpenWRT liegt in meinem Home-Verzeichnis)

export STAGING_DIR=~/openwrt/attitude_adjustment/staging_dir
export TOOLCHAIN=~/openwrt/attitude_adjustment/staging_dir/toolchain-arm_v5te_gcc-4.6-linaro_uClibc-0.9.33.2_eabi
export PATH="$TOOLCHAIN/bin:/usr/local/bin:/usr/bin:/bin"

Dann werden die aktuellen OSCAM Sourcen ausgecheckt.

svn co http://www.streamboard.tv/svn/oscam/trunk oscam-svn
cd oscam-svn


Da ich die USB-Kartenleser benutze, benötige ich die USB-Library - evtl. hätte man auch die  in OpenWRT vorhandene Bibliothek verwenden können... Ich hab mich hier ans Wiki gehalten, da mein PogoPlug sowieso ausreichend Platz (Flash) hat.

wget http://downloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.9/libusb-1.0.9.tar.bz2
tar xfj libusb-1.0.9.tar.bz2
cd libusb-1.0.9
CC=arm-openwrt-linux-gcc ./configure --host=arm-openwrt-linux-uclibcgnueabi \
   --prefix=$TOOLCHAIN/arm-openwrt-linux/sys-root/usr/ --enable-shared=no

make
make install
cd ..

Nun geht's an das eigentliche OSCAM

./config.sh --disable all --enable \
   WEBIF \
   MODULE_NEWCAMD \
   CS_ANTICASC \
   IRDETO_GUESSING \
   MODULE_CAMD35 \
   MODULE_NEWCAMD \
   READER_NAGRA READER_IRDETO \
   CARDREADER_PHOENIX

make CROSS=$TOOLCHAIN/bin/arm-openwrt-linux- USE_LIBUSB=1 \
   USE_SSL=1 CONF_DIR=/etc EXTRA_FLAGS="\
   -I$STAGING_DIR/target-arm_v5te_uClibc-0.9.33.2_eabi/usr/include \
   -I$TOOLCHAIN/arm-openwrt-linux/sys-root/usr/include" \
   LIBUSB_LIB="$TOOLCHAIN/arm-openwrt-linux/sys-root/usr/lib/libusb-1.0.a \
   -L$STAGING_DIR/target-arm_v5te_uClibc-0.9.33.2_eabi/usr/lib"


Das fertige Binary sollte nun im Ordner "Distribution" liegen und muss nur noch auf den PogoPlug kopiert werden - fertig!

Wenn man mehrere Kartenleser einsetzt, sollte natürlich auch immer der richtige Leser der - in der OSCAM Konfiguration eingetragenen Karte - entsprechen. Dazu habe ich die Hotplug-Scripts von OpenWRT verbogen...

#/etc/hotplug.d/usb/99-cardreader

# ProductID der Reader
CARDREADER="403/6001/600"

# Seriennummern der Reader - Leerzeichen getrennt
READERSERIAL="AH01234A AH01234B"

case "$ACTION" in
        add)
                if [ $PRODUCT == $CARDREADER ] ; then
                        SERIAL=`cat /proc/bus/usb/devices | \
                          grep -A 8 "Dev#=.*${DEVICE##*0}" | \
                          grep "SerialNumber"`
                        SERIAL=${SERIAL##*SerialNumber=}

                        DEV=`ls -la /sys/bus/usb/devices/${DEVICENAME}/ | \
                          grep ttyUSB`
                        DEV=${DEV##* }

                        C=0
                        for I in $READERSERIAL ; do
                                if [ $I == $SERIAL ] ; then
                                        ln -s $DEV /dev/cardreader${C}
                                fi
                                let C=C+1
                        done
                fi
                ;;
        remove)
                if [ $PRODUCT == $CARDREADER ] ; then
                        for I in 0 1 2 3 ; do
                                if [ ! -e /dev/cardreader${I} -a \
                                       -h /dev/cardreader${I} ] ; then
                                        rm -f /dev/cardreader${I}
                                fi
                        done
                fi
                ;;
esac