Archiv/saa7134/Module korrekt laden

Archivierte Anleitung

Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Ein Terminal öffnen

  2. Einen Editor öffnen

  3. Root-Rechte

  4. Umgang mit Kernelmodulen (Treibern)

Inhaltsverzeichnis
  1. Problembeschreibung
  2. TV-Karten-Info
  3. Vorgehensweise
    1. Blacklisting
  4. Modulskript
    1. kurzes Modulskript
    2. Autostart für das Modulskript
  5. Kontrolle

Folgender Beitrag soll eine Hilfestellung zur Lösung für das Problem geben, dass eine PCMCIA-DVB-T-Karte (mit Philips Archiv/saa7134 Chip) nach dem Ubuntu-Start nicht korrekt geladen wird.

Problembeschreibung

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.

TV-Karten-Info

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]

Vorgehensweise

Folgende Dateien werden bearbeitet:

Blacklisting

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.

Modulskript

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.

Hinweis:

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

kurzes Modulskript

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

Autostart für das Modulskript

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

Kontrolle

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