DVB-C-Stick per OpenWRT am Router

  • Hallo,


    hat jemand Erfahrung mit Openwrt? Ich will einen Hauppauge WinTV 930c DVB-C-Stick an's laufen bringen. Firmware habe ich schon runtergeladen und in /lib/firmware kopiert. Problem sind jetzt die Kernel-Module. Laut linuxtv-wiki braucht der Stick nur drei Stück:


    Quote

    Components used
    Xceive XC5000 (RF tuner and analog IF demodulator)
    Emtec EM28XX (DVB Frontend)
    Micronas drxk (3-in-1 Demodulator for DVB-C, DVB-T and analogue TV)

    sie heißen dementsprechend

    Code
    1. xc5000.ko
    2. drxk.ko
    3. em28xx.ko


    Auch die hab ich mittlerweile passend für den router gefunden. Leiter tut sich aber nicht viel. Das Problem ist glaube ich das em28xx-Modul.
    Das ist laut Ubuntu-Seite vom Herausgeber eingestellt worden und unterstützt 'ne ganze Menge Karten. Dementsprechend hat es einige
    Abhängigkeiten von anderen Modulen und die wiederrum von anderen. Immer wenn modprobe sich also beschwerte und weitere Module verlangte hab ich die
    natürlich runtergeladen . Ich glaube aber, dass trotzdem noch was fehlt. Möchte ich zum Beispiel em28xx-dvb oder em28xx-alsa laden bleibt die Kommandozeile einfach hängen.
    Ich muss dann mit Strg+C den Ladevorgang abbrechen. Lade ich em28xx kommt "segmentation fault", das Modul gilt danach aber trotzdem als geladen und lässt sich nicht wieder entladen.


    dmesg gibt daraufhin sowas hier aus:



    Da ist also plötzlich Leben in der Bude. /dev/dvb wird aber dennoch nicht angelegt. Ich hab mich natürlich vor dem Kauf des Sticks informiert: Ich hab den älteren WinTV HVR 930C (ohne HD), der eigentlich seit Kernel-Version 3.3 läuft. Vermutlich haben sie aus Platzgründen bei OpenWRT alle "unnötigen" Module für ihren Spezial-Kernel entfernt.


    Am einfachsten wäre es sicher , video4linux zu benutzen. Leider ist das bei openwrt nicht in den Paketquellen und Kompilieren ist nicht möglich.
    Video4Linux hängt von Programmen ab, die ebenfalls nicht per Paketmanager installiert werden können. Aus dem Forum weiß ich, dass sie das dort
    wohl per Cross-Compiling erzeugen. Das ist mir aber zu hoch. Bin froh wenn ich schon normal was kompiliert kriege.
    Bibliotheken wie libv4l oder v4l-utils sind aber verfügbar (wozu auch immer die gut sind).
    Daher ist meine Hoffnung, dass ich doch noch rausbekommen kann, was dem em28xx-Treiber fehlt, um es von Hand reinzukopieren.
    Das kann doch nicht viel sein...



    Hab parallel zu diesem Threat auch noch in's OpenWRT-Forum gepostet. Aber die Leute da geben sich wortkarg.

  • Na hier sind die Leute wohl auch nicht gesprächiger.
    Ich bin aber etwas weitergekommen: Wie es aussieht ist dieses Cross-Compiling für OpenWRT wohl stark vereinfacht worden. Hat man alle notwendigen Tools installiert (u.A. git, svn und einiges mehr) und die Pfad-Variable angepasst, läuft die ganze Konfiguration über zwei Menüs. Da gibt es bereits Voreinstellungen für ganz viele Router und endlose Listen mit Komponenten, die man Image und Kernel hinzufügen kann. Der eigentliche Cross-Compiling vorgang ist automatisiert. Leider hebe ich jetzt einen Compile-Error wegen einem Paket, das gar nicht nötig ist. Weil das Menü auch Abhängigkeiten auflöst, kommt dieses Paket irgendwie immer mit 'rein. Weiß noch nicht woran es liegt...


    Wichtig ist auf jeden Fall, dass dem Kernel diese Multimedia-Module hinzugefügt werden. Da ist der em28xx-Treiber zwar nicht bei. Dafür aber die beiden anderen. Laut Menü soll der Kernel am Ende TV-Karten automatisch erkennen und die passenden Module laden.

  • Sooo, bin um Einiges weitergekommen.


    Dass mit dem Cross-Compiling war ziemlicher Blödsinn, weil es fast unmöglich ist, die Zielgröße für das Flash-Image auf unter 4MB zu drücken. Selbst wenn man alles Unwichtige abschaltet und als Modul auslagert (für später auf'n Stick) kam ich von 9MB auf gerade mal 8MB. Einen Vorteil hatte das Cross-Compiling aber: Ich hab ein neues TVHeadend3.4-Paket bekommen, das später noch nützlich wurde. Anders als Kernel-Pakete sind normale Software-Pakete nämlich nicht vom Kernel abhängig.



    Erstmal müssen alle Dateien von hier nach

    Quote

    /lib/modules/3.10.49

    Das geht nur, wenn man vorher extroot installiert hat, also das Dateisystems eines Sticks über dem Root-Dateisystem liegt. Der Speicherplatz des internen Flash-Chips ist mit 4MB nämlich viel zu klein. Extroot wird mit einem einfachen Befehl in der

    Quote

    /etc/config/fstab

    eingeschaltet. Wie das geht, steht genau im Wiki: Hier und hier (konkret am Beispiel). Man muss irgendwie block-mount installieren und einen ganz "normalen" Eintrag in die fstab machen.


    Jedenfalls musste danach noch die Firmware des DVB-C-Sticks (2 Dateien) in

    Quote

    /lib/firmware

    kopiert werden (gibt's zum Download im Internet). Außerdem sicherheitshalber alles was mit v4l zu tun hat. v4l selbst gibt's nicht in den Paketquellen, aber einige Tools und Treiber.
    Die beiden angeblich wichtigen Kernel-Pakete

    Quote

    kmod-video-core und kmod-input-core

    sind zwar in den Paketquellen, aber dummerweise inkompatibel mit dem offiziellen Openwrt Barrier-Braker. Da haben die Entwickler wohl Mist gebaut. Normalerweise werden bei jedem Cross-Compile-Vorgang auch alle passenden Kernelmodule rausgehauen. Die passen dann immer nur zu dem Kernel von genau diesem Cross-Compile-Vorgang. Deshalb kann man die auch nicht selbst nach-kompilieren. Bislang bin ich aber ohne diese beiden Module ausgekommen.


    Die Kernel-Module, die per modprobe für den TVB-C-Stick geladen werden mussten waren:

    Quote

    drxk.ko
    xc5000.ko
    em28xx-dvb

    Beim Laden werden automatisch auch alle anderen Pakete geladen, die benötigt werden. Deshalb musste der ganze Ordner media von der Webseite zuvor heruntergeladen werden.



    Jetzt kommt der spannende Teil: TVHeadend liegt mir hier in drei Versionen vor, die alle drei schlimme Bugs haben, aber in Kombination funktionieren:


    1.) TVHeadend 3.2: Keine Ahnung wo ich das her habe. Das kann jedenfalls die Muxes finden. Das Programm verfügt über Listen ganz vieler Kabelanbieter auf der ganzen Welt. In Version 3.4 ist diese Funktion defekt. Leider versagt Version 3.2 aber beim Suchen nach Services und Sendern. Außerdem hat es viele Fehler bei der Darstellung der Weboberfläche. Deshalb muss es nach dem Finden aller Muxes mit

    Quote

    opkg remove tvheadend

    wieder entfernt werden. Die Einstellungen unter

    Quote

    /root/.hts

    werden dadurch nicht mitgelöscht.


    Dann kommt die selbst-kompilierte 3.4er-Version drauf. Anders als bei der offiziellen 3.4er-version fehlt dort nicht der Tab "DVB-Inputs" in den Einstellungen der Weboberfläche. Damit lassen sich jetzt also Services und Sender finden. Das Finden der Sender wird nach dem Suchdurchlauf für die Services mit dem Button "Map DVB Services to channels..." manuell angestoßen. Tja und dann gibt's auch irgendwann TV.


    Wichtig ist noch zu erwähnen, dass die Datei

    Quote

    /etc/init.d/tvheadend

    abgeändert werden muss. TVHeadend kann unter openwrt keinen Benutzer hts anlegen, weil es nur einen Nutzer gibt, nämlich root. Folglich lautet die Zeile zum Starten des TV-Headend-Service:

    Quote

    tvheadend -f -u root -g root

    -f lädt TVHeadend im Hintergrund (ein sogenannter "fork"), -u ist der Nutzername und -g der Gruppennname. Auch die Option -c /etc/tvheadend, die in der Voreinstellung hinter dem Befehl hängt, kann weg. Schließlich sollen die Einstellungen ganz normal aus dem Nutzerordner (bei openwrt also /root/) gelesen (und auch dorthin geschrieben) werden.


    Auch wichtig ist die Einrichtung einer Swap-Partition, weil der Speicher mit 32MB schlicht zu klein ist. Dafür muss das Paket zram-swap installiert werden.

    Quote

    swapon /dev/sdaXY

    schaltet swap manuell ein. Automamtisch soll es wohl mit /etc/config/fstab gehen. Das hat bei mir aber nicht geklappt. Daher habe ich dem Upstart-Script über die Luci-Oberfläche von Openwrt einfach den swapon-Befehl hinzugefügt.


    Mein Problem jetzt: Die Performance ist unbefriedigend. Grund ist wahrscheinlich die Speicherauslastung. Die CPU-Werte sind während der TV-Wiedergabe in Ordnung. Hab Swappiness schon auf 90 gestellt (/proc/sys/vm/swappiness ...glaub ich) und einen schnellen USB-Stick benutzt. Außerdem hab ich einen Hub angeschlossen, der 'ne externe Stromversorgung hat.


    Trotzdem hakt das Bild sehr und TVHeadend gibt sehr viele Fehlermeldungen raus:

    Quote

    Continuity counter error

    erscheint unzählige male im Log. Die Speicherauslastung liegt laut Luci-Weboberfläche dabei immer bei über 200%. Mit

    Quote

    free -m

    kann ich sehen, dass auch fleißig Swap benutzt wird. Der Stick hat Schreibraten zwischen 6MB/s und 20MB/s - das sollte also für ein flüssiges Bild reichen. Hab's mit rsync getestet.


    Hat jemand Ideen, wie ich die Performance weiter steigern kann? Hintergrund-Sender-Suche und ähnliches hab ich schon abgeschaltet.


    Außerdem funktioniert das automatische Laden der drei Kernel-Module beim Booten nicht. Nur zwei werden geladen. Das dritte muss ich immer manuell nachladen und danach TVHeadend neu starten, weil es den Stick sonst nicht findet. Hab's mit

    Quote

    modprobe em28xx-dvb

    im Upstart-Script unter Luci versucht. Leider kein Erfolg. Auch hab ich den Bugfix angewandt, der hier zu finden ist. Eigentlich gilt das Problem schon als behoben, doch vor der aktuellen Openwrt-Version 14.07, wurde bekannt, dass der Pfad für die Kernel-Module in

    Quote

    /lib/functions.sh

    falsch ist (auf der verlinkten Seite befindet sich functions.sh noch in einem anderen Ordner). Durch den Bugfix laden jetzt die beiden anderen Module automatisch, das dritte fehlt aber immernoch :-(

  • Hi,
    die Idee finde ich super! Bei mir steht auch noch ein Netgear WNDR3700, 600Mhz, 128mb Ram.
    Würde mich mal interessieren ob da wohl VDR drauf läuft? Allerdings ist der interne Speicher immer sehr begrenzt.

  • Danke. Hab mir schon gedacht, dass ich hier ein bißchen an-ecke wegen dem TVHeadend. Aber das hat nunmal die meiste Client-Software (meines Wissens). Außerdem ist das vergleichsweise einfach einzurichten. Das TVHeadend-eigene HTSP-Protokoll kann per VLC-Plugin, XBMC, Showtime und TVHClient empfangen werden. Es läuft also auf PC, PS3 und Iphone (!). Bin für eine VDR-Lösung natürlich grundsätzlich offen. Es ist allerdings nicht in den Paketquellen und würde ein erneutes Cross-Compiling nötig machen. Damit tu ich mich schwer...und eingerichtet werden muss das dann auch noch.
    Wie sieht es denn bei VDR mit Client-Software aus? Gibt's da auch 'ne Iphone-App? Die ist eigentlich das Wichtigste für mich. Leider kann dieser TVHClient nämlich nicht "zappen", also einfach die Sender durchschalten. Man muss jeden Stream aus einer Liste wählen und dann extra die Wiedergabe starten. Das Telefon als Fernseher - ganz ohne Gebühren und Datensammelei...geil!


    Jetzt im Moment läuft der Stick gerade wieder nicht. Bekomme mit dmesg dabei folgende Meldung:



    Das ist das Ende von einer sehr langen dmesg-Ausgabe. Wenn ich das richtig verstehe, gibt's da ein Problem mit der xc5000-Firmware...nur welches?
    TVHeadend spielt dabei den Stream angeblich ab - ich empfang nur auf dem PC nichts. Dabei geht im Router auch die Speichernutzung hoch. Was jetzt die Fehlermeldung heißt, verrät Google mir nicht. "urb" könnte aber wohl was mit USB zu tun haben. Ich habe den Stick ausgestöpselt und in einen anderen Port des Hubs wieder eingestöpselt. Vielleicht hat es etwas damit zu tun?!


    Edit:


    Nee...doch nicht. Hab neu gebootet und die Ausgabe bleibt die selbe.


    Ich hatte noch vergessen zu erwähnen, dass ich vor diesem Ausfall noch das hier ausprobiert habe: Angeblich gibt'S bei TVHeadend ein bekanntes Puffer-Problem, das sich per Netzwerk(!)-Einstellung lösen lässt:

    Weil der Router nur 32 MB RAM hat, hab ich die Zahlen mal auf 10MB (also 10485760) geändert.


    Edit:


    Hab grad mal

    Code
    1. modprobe videobuf-dvb

    eingegeben und siehe da: TV funktioniert plötzlich wieder. Gut möglich, dass ich das auch vorher aufgerufen hatte. Hab soviele Module schon durchprobiert, da war das bestimmt schon 'n paar mal dabei. Natürlich ist das Fernsehn immernoch sehr ruckelig - auch mit dem neuen /etc/sysctl.conf-Eintrag. Kann mir vielleicht jetzt aber doch jemand weiterhelfen. Gibt's da vielleicht noch mehr so Wundermodule?

  • Mmm..ob der Stick will oder nicht, scheint doch eher zufällig zu sein.


    Ich komm aber irgendwie nicht weiter. Zwar tut er jetzt generell öfter. Die Wiederhabe bleibt aber miserabel stotternd. Dabei ist immer der Speicher voll ausgelastet und Swap schwer in Benutzung. An der Kommandozeile regnet es Framedrop-Meldungen.


    Hat jemand 'ne Ahnung wie ich das Problem eingrenzen kann? Normal sollte der Speicher doch gar nicht beansprucht werden, weil der Mpeg-Stream doch direkt vom TV-Kabel in's Netzwerk durchgestellt wird. Wenn ich von 'nem normalen PC streame beansprucht das den Router doch auch nicht.