Ubuntu 12.04 Precise Pangolin
Folgender Beitrag soll eine Hilfestellung zur Lösung für das Problem geben, dass eine PCMCIA-DVB-T-Karte (mit Philips saa7134 Chip) nach dem Ubuntu-Start nicht korrekt geladen wird.
Das Laden der Treiber hatte bei den früheren Ubuntu-Versionen immer funktioniert. Seit den 9.x-Versionen bis aktuell funktioniert das automatische Laden der Firmware dieser TV-Karte meistens nicht mehr korrekt.
Fehlermeldung[1]:
dmesg
DVB: registering new adapter (saa7133[0]) DVB: registering adapter 0 frontend 0 (Philips TDA10046H DVB-T)... tda1004x: setting up plls for 48MHz sampling clock tda1004x: found firmware revision ea -- invalid
In diesem Fall kann man mit TV-Programmen nicht mehr auf die Karte zugreifen, Radioempfang o.ä. geht möglicherweise noch.
Die Ursache für die fehlerhafte Initialisierung könnte in einem zu frühen Laden der TV-Karten-Firmware begründet liegen. Kommt es zu diesem Fehler, wird anscheinend eine Blockade des Busses der Karte ausgelöst und die Firmware lässt sich in diesem Fall nicht laden - alle weiteren Aktionen über Laden und Entladen von Modulen sind dann zwecklos, die Karte reagiert nicht mehr (Erklärung des Firmware-Programmierers(?) ). Da hilft dann nur noch Abziehen und wieder Einstecken der Karte oder ein Neustart.
Beim Verwenden von Programmen, die auf die TV-Karte zugreifen, wird die Firmware in die Karte geladen. Einigen Beiträgen zufolge kann unter Verwendung von TV-Programmen unter Windows die Firmware ebenfalls in die Karte geladen werden (die Firmware bleibt dann auch nach dem Start von Ubuntu in der Karte erhalten). Nach dem Trennen der Stromversorgung muss die Firmware erneut geladen werden.
Zur TV-Karte werden folgende Informationen geliefert:
lspci
06:00.0 Multimedia controller: Philips Semiconductors SAA7131/SAA7133/SAA7135 Video Broadcast Decoder (rev d0)
dmesg
subsystem: 5168:3502, board: LifeView FlyDVB-T Hybrid Cardbus/MSI TV @nywhere A/D NB [card=94,insmod option]
Folgende Dateien werden bearbeitet:
/etc/modprobe.d/blacklist.conf
das Modulskript lade_tv-module.sh
/etc/rc.local
Der erste Schritt ist, die TV-Karten-Module zu blacklisten, damit diese beim Booten gar nicht erst geladen werden und die Blockade ausgelöst wird. Dazu wird die Datei /etc/modprobe.d/blacklist.conf in einem Editor [2] mit Root-Rechten [3] um folgende Einträge erweitert
... # TV-Karten-Treiber/Firmware: blacklist tda1004x blacklist saa7134 blacklist saa7134_dvb blacklist saa7134_alsa
Ziel der Vorgehensweise ist es, das Modulmanagement für die Karte dem System zu entziehen und dieses selbst zu steuern.
Das Skript herunterladen oder in einen Editor kopieren, und unter einem aussagekräftigen Namen abspeichert, z.B als lade_tv-module.sh. Zur Erläuterung der Funktion findet man ein paar Kommentierungen zu den einzelnen Aktionen im Skript.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | # -> starten ueber /etc/rc.local # # Anwendungsfall: # dmesg sollte nach Anwendung des Scripts (und eigentlich regulaer) # ausgeben: # > tda1004x: found firmware revision 29 -- ok # Ueber dieses Script koennen die (vorher geblacklisteten) Kartentreiber # nachgeladen werden. # # Lademoeglichkeiten: # # 1) Manchmal klappt das direkt ueber das Nachladen # des _dvb-Moduls (muss normalerweise vorher entladen werden, # sonst tut sich nichts). # Dies kann funktionieren, wenn man die Karte im Betrieb entfernt # und wieder eingesteckt hat. # 2) Wenn das nicht klappt, vorher das tda-Modul entladen, # neu laden und dann Schritt 1) versuchen. # # Ausgangslage: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # 1) "Geblacklistete" TV-Module (alles) # Dabei in # /etc/modprobe.d/blacklist.conf # eintragen: # # blacklist tda1004x # blacklist saa7134_dvb # # 2) zunächst keine Module über dieses Script laden # # Es sind mit lsmod keine tda- oder saa-Module sichtbar! # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CMD=/sbin/modprobe ins="$CMD -v" # Alias fuer "install" rem="$CMD -vr" # Alias fuer "remove" ROOT=root if [ $USER != $ROOT ] then echo "! Das Script kann nur unter \"$ROOT\" laufen" exit 1 fi echo "* Lade TV-Module:" echo " Lade Treiber 1/2 ..." # Laden des Moduls # saa7134 (quasi das Hauptmodul) # mit Optionen, das ist OK. # Kartennummer: aus http://wiki.ubuntuusers.de/saa7134 # 94 -> LifeView FlyDVB-T Hybrid Cardbus/MSI TV @nywhere A/D NB [5168:3306,5168:3502,5168:3307,4e42:3502] # Dieses zieht einige saa- sowie einige tda-Module # mit, jedoch nicht das wichtige Firmware-Modul tda1004x. # -> funktioniert soweit, Karte leuchtet (aktiviert). # Fuehrt zur Ausgabe von # saa7133[0]: subsystem: 5168:3502, board: LifeView FlyDVB-T Hybrid Cardbus/MSI TV @nywhere A/D NB [card=94,insmod option] # Das Modul laedt (u.a.) folgende weitere davon abhaengige Module: # saa7134_* $ins saa7134 card=94 # (Laden dauert einige Zeit) echo " ... " sleep 2 # Noch fehlendes Modul # tda1004x # laden (laedt die Firmware) echo " Lade Firmware ..." $ins tda1004x echo " ... " sleep 2 modul=saa7134_dvb echo " Lade Treiber 2/2 ..." # OK-Meldung wird noch nicht ausgegeben, # es muss das bereits geladene _dvb-Modul neu geladen werden: # Das Laufende entfernen und dieses neu laden: echo " Entferne geladenen Treiber ... " $rem $modul # Entfernen dauert etwas; hier ist sinnvoll, # etwas zusaetzliche Wartezeit zu geben, # damit das Neuladen der Treiber erfolgreich ist. echo " ... " sleep 2 echo " Lade Treiber neu ... " $ins $modul # => Nun sollte die Karte funktionieren. |
Wichtig sind die sleep
-Angaben nach den einzelnen Aktionen. Beim Versuch, diese herauszunehmen, trat das bekannte Problem wieder auf. Hier gibt es also vielleicht noch Optimierungspotenzial. An irgendeiner, ggf auch mehreren Stellen scheint es also so zu sein, dass das Problem aufgrund einer zu schnellen Abfolge der Aktionen begründet liegt. Wahrscheinlich genau das, was sonst ohne manuelle Eingriffe systemgesteuert zu diesem Problem führt.
Ausgabe des Skripts:
* Lade TV-Module: Lade Treiber 1/2 ... insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/tveeprom.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/videobuf-core.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/videobuf-dma-sg.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/v4l2-compat-ioctl32.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/v4l1-compat.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/videodev.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/v4l2-common.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/common/ir-common.ko install /sbin/modprobe --ignore-install saa7134 card=94 && { /sbin/modprobe --quiet --use-blacklist saa7134-alsa ; : ; } insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/saa7134/saa7134.ko card=94 insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/saa7134/saa7134-alsa.ko index=-2 Lade Firmware ... insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/dvb/frontends/tda1004x.ko Lade Treiber 2/2 ... Entferne geladenen Treiber ... rmmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/saa7134/saa7134-dvb.ko rmmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/videobuf-dvb.ko rmmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/dvb/dvb-core/dvb-core.ko Lade Treiber neu ... insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/dvb/dvb-core/dvb-core.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/videobuf-dvb.ko insmod /lib/modules/2.6.32-24-generic/kernel/drivers/media/video/saa7134/saa7134-dvb.ko
Hier folgt ein kürzeres Skript, das von dem oberen abgeleitet wurde und zum gleichen Ergebnis geführt hat. Das X
nach card=
ist durch die entsprechende Zahl für die verwendete TV-Karte zu ersetzen (siehe Liste).
Wenn es nicht automatisiert mit Hilfe der Datei rc.local gestartet wird (siehe unten Autostart für das Modulskript), muss es mittels sudo mit Superuser-Rechten ausgeführt werden.
1 2 3 4 5 6 7 | #!/bin/bash sleep 5 modprobe tda1004x modprobe saa7134 card=X modprobe saa7134_dvb modprobe saa7134_alsa |
Damit die Aktionen wieder automatisiert ablaufen können, braucht man für die Kommandos eine "Autostartrampe". Dazu bietet sich die Datei rc.local an. Diese ist standardmäßig leer. Hierzu kann man das Modulskript in /etc/rc.local eintragen [2] [3] (oberhalb von exit 0
) eintragen, z.B. als
# By default this script does nothing. /pfad/zum/Skript/lade_tv-module.sh exit 0
Wird damit nun das System gestartet, sollte man, wenn alles richtig funktioniert hat, folgende Ausgabe erhalten:
dmesg
... tda1004x: setting up plls for 48MHz sampling clock tda1004x: found firmware revision 29 -- ok
Diese Revision wurde am 27. April 2013 13:00 von frustschieber erstellt.