Beruflich / Linux / Terratec Cinergy T USB XE Linux Treiber (af9015 und mc44s80x)

Sie benutzen einen Browser der von diesen Internetseiten nicht unterstützt wird. Daher kann es sein, dass nicht alles so funktioniert und aussieht wie es sollte.

Terratec Cinergy T USB XE Linux Treiber (af9015 und mc44s80x)

Ich hatte mir bereits vor einiger Zeit einen DVB-T Empfänger von TerraTec in Form eines USB Stick gekauft. Es ist ja bekannt, dass neue Hardware unter Linux mangels aktueller Treiber nicht immer gleich komplett unterstützt wird. Dieser USB Stick hat meine Geduld jedoch ganz schön strapaziert. Nun habe ich es endlich geschafft ihn mit einigen Tricks zum laufen zu bekommen.

Nachtrag: Mit dem Linux kernel in der Version 2.6.30 funktioniert der USB Stick nunmehr ohne weitere Anpassungen.

Als ich mir den DVB-T Empfänger gekauft hatte, war 2.6.26 die aktuelle Version des Linux kernels. In dieser Version war kein Treiber für die neue Version (af9015) des Empfängers vorhanden. Lediglich das Vorgängermodell (af9005) wurde unterstützt. Selbst nach einigen Recherchen im Internet mit einigen viel versprechenden Hinweisen, bin ich nicht weitergekommen. Die meisten Treiber, die nicht Bestandteil des aktuellen Kernels waren, habe ich nicht zum laufen bekommen. Auch mit der Version 2.6.27 ist mir das nicht gelungen. Selbst wenn die Einbindung des neuen Treibers funktioniert hat, scheiterte es im zweiten Schritt an der Einbindung des Tuners Freescale MC44S803 .

Integration des Tuner-Treibers in den Kernel

Nun ist vor kurzem Version 2.6.28 erschienen und ich habe einen weiteren Versuch gewagt. Diesmal mit Erfolg. Da das Ausprobieren und Testen sehr zeitaufwendig war, möchte ich an dieser Stelle meinen Lösungsweg darstellen. In Version 2.6.28 ist der Treiber af9015 Bestandteil des Kernels. Die Firmware für den Empfänger hatte ich bereits auf dem Computer. Falls jemand diese nicht hat, kann sie z.B. von http://www.otit.fi/~crope/v4l-dvb/af9015/dvb-fe-af9013.fw heruntergeladen werden (oder man sucht einfach mal ein bisschen im Internet und wird relativ schnell fündig). Das Modul wurde mit dem neuen Kernel korrekt geladen allerdings hat ein Blick in die Ausgabe von dmesg folgende Fehlermeldung erkennen lassen:

af9015: Freescale MC44S803 tuner found but no driver for that tuner

Bei meinen Recherchen im Internet bin ich auf eine alte Version von DVB Treibern für Video for Linux (v4l) gestoßen. Diese werden anscheinend nicht mehr weiterentwickelt, sind aber noch verfügbar. Sie stehen unter http://git.bocc.de/cgi-bin/gitweb.cgi?p=cinergy.git;a=summary zum Download (Verweis af snapshot) zur Verfügung. In diesem Treiberpaket sollte es einen Treiber für den Tuner geben. Ich habe mir also das Paket heruntergeladen und entpackt:

tar xfz /tmp/cinergy.git-HASH.tar.gz

In dem Paket befinden sich die folgenden Dateien, die für den Tuner benötigt werden:

cinergy.git/linux/drivers/media/dvb/frontends/mc44s80x_priv.h cinergy.git/linux/drivers/media/dvb/frontends/mc44s80x.c cinergy.git/linux/drivers/media/dvb/frontends/mc44s80x.h cinergy.git/linux/drivers/media/dvb/frontends/mc44s80x_reg.h

Der nächte Schritt besteht nun darin diese Dateien im aktuellen Kernel verfügbar zu machen. Dazu müssen die Dateien zunächst in das korrekte Kernel-Verzeichnis kopiert werden:

cp cinergy.git/linux/drivers/media/dvb/frontends/mc44s80* /usr/src/linux-2.6.28-gentoo/drivers/media/dvb/frontends/

Damit der neuen Treiber in der Kernel-Konfiguration auch angezeigt wird, müssen noch einige Dateien angepasst werden. Das ist zunächst einmal die Datei

/usr/src/linux-2.6.28-gentoo/drivers/media/dvb/frontends/Kconfig

Dort habe ich direkt unter dem bereits vorhandenen Eintrag

comment "DVB-T (terrestrial) frontends" depends on DVB_CORE

einen eigenen Eintrag eingefügt:

config DVB_MC44S80X tristate "Freescale MC44S80x based tuner" depends on DVB_CORE && I2C default m if DVB_FE_CUSTOMISE help DVB-T tuner module. Say Y when you want to support this frontend.

Dieser Eintrag lässt eine Konfigurationsoption in den Werkzeugen zum Anpassen des Kernels erscheinen (also z.B. bei make menuconfig oder make xconfig). Die neue Option befindet sich dann unter

Device Drivers -> Multimedia Devices -> DVB/ATSC Adapters -> Customise DVB Frontends

Die Möglichkeit den Treiber auszuwählen reicht alleine jedoch nicht aus. Wenn man den Treiber einbindet, muss er auch kompiliert werden. Damit das geschieht, muss die folgende Datei ebenfalls angepasst werden:

/usr/src/linux-2.6.28-gentoo/drivers/media/dvb/frontends/Makefile

Dort habe ich in einer neuen Zeile, dort wo bereits ähnliches Definitionen stehen, die folgende Anweisung hinzugefügt:

obj-$(CONFIG_DVB_MC44S80X) += mc44s80x.o

Da der neue Tuner von dem Treiber af9015 nicht direkt unterstützt wird, muss diese Unterstützung zunächst noch aktiviert werden. Dies geht relativ einfach, da eine Unterstützung für diesen Tuner bereits vorgesehen ist. Dazu müssen in der Datei

/usr/src/linux-2.6.28/drivers/media/dvb/dvb-usb/af9015.c

einige Anpassungen vorgenommen werden. Direkt am Anfang der Datei befindet sich die Anweisung:

#if 0 #include "mc44s80x.h" #endif

Diese Zeilen müssen durch die folgende ersetzt werden:

#include "mc44s80x.h"

Weiter unten in der Datei (in der Höhe von Zeile 1157 - einfach nach "mc44s80x" suchen) befinden sich die folgenden Zeilen:

case AF9013_TUNER_MC44S803: #if 0 ret = dvb_attach(mc44s80x_attach, adap->fe, i2c_adap) == NULL ? -ENODEV : 0; #else ret = -ENODEV; info("Freescale MC44S803 tuner found but no driver for that" \ "tuner. Look at the Linuxtv.org for tuner driver" \ "status."); #endif break;

Diese können wiederum durch die folgenden ersetzt werden:

case AF9013_TUNER_MC44S803: ret = dvb_attach(mc44s80x_attach, adap->fe, i2c_adap) == NULL ? -ENODEV : 0; break;

Damit ist der neue Tuner eingebunden und kann zusammen mit dem Treiber af9015 verwendet werden. Nachdem der Kernel neu kompiliert und die Module installiert wurden (make und make modules_install), ist das Modul für den Tuner verfügbar. Auf die beschriebene Weise geht es natürlich nur dann, wenn sowohl der af9015 Treiber als auch der Treiber für den Tuner mc44s80x als Module in den Kernel eingebunden werden. Andernfalls muss der Computer komplett neu gestartet werden.
Zuvor sollte man den DVB-T Empfänger aus dem USB Port entfernen und die alten Module mit

modprobe -r af9013 modprobe -r dvb_usb_af9015

entladen. Danach kann der Empfänger wieder an den Computer angeschlossen werden und sollte benutzbar sein - sollte. Bei mir tat sich jetzt noch das Problem auf, das der Treiber für den Tuner, meinen Tuner-Chip anscheinend nicht korrekt erkannt hat. Demnach wurde das Modul des Treibers nicht geladen. Na ja, aber was soll schon so eine ID. Chip ist Chip. Also entfernen wir die Prüfung einfach aus dem Modul. Das geht relativ einfach, indem in der Datei

/usr/src/linux-2.6.28-gentoo/drivers/media/dvb/frontends/mc44s80x.c

die Zeile (ca. Zeile 734 in der Funktion mc44s80x_get_devid)

id = MC44S80x_GETFIELD(REFAGC_ID, MAKEREG(buf));

durch folgende ausgetauscht wird:

id = MC44S803_ID;

Nachdem nun die Kernel-Module zunächst neu erzeugt, dann entladen und wieder geladen werden, hat es bei mir funktioniert. Ich hoffe weiterhin auf eine Integration des Tuner-Treibers in den Kernel.

Falls jemand einen einfacheren Weg kennt, werde ich an dieser Stelle mit Vergnügen einen Hinweis einfügen.

Alternative

Klaus Hahn hat mir in einer E-Mail eine Alternative beschrieben, mit der es ebenfalls möglich sein soll, den DVB-T USB Stick unter Linux zum laufen zu bekommen. Ich hatte zwar nicht die Möglichkeit das zu überprüfen, möchte diese Alternative hier jedoch ebenfalls veröffentlichen. Ich bin dankbar für jede Rückmeldung, um zu erfahren ob die aufgezeigten Lösungswege jemandem weiter geholfen haben oder nicht.

Herunterladen des Linux Treibers von TerraTec

cd /tmp wget ftp://ftp.terratec.net/Receiver/Cinergy_T_USB_XE/Update/Cinergy_T_USB_XE_MKII_Drv_Linux.zip unzip Cinergy_T_USB_XE_MKII_Drv_Linux.zip mv Cinergy\ T\ USB\ XE\ MKII/Fedora\ Core\ Release\ 6 dvb_cinergy cd dvb_cinergy/ cp /usr/src/linux-source-2.6.24/drivers/media/dvb/dvb-core/*.c . cp /usr/src/linux-source-2.6.24/drivers/media/dvb/dvb-core/*.h . cp /usr/src/linux-source-2.6.24/drivers/media/dvb/dvb-usb/*.c . cp /usr/src/linux-source-2.6.24/drivers/media/dvb/dvb-usb/*.h .

Eine Datei "af_patch" mit folgendem Inhalt erstellen:

--- backup/af901x-core.c 2007-10-08 03:59:56.000000000 +0200 +++ af901x-core.c 2009-01-08 21:25:08.756936667 +0100 -1,6 +1,8 #include "af901x.h" DEVICE_CONTEXT DC; +DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); + int af901x_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props, struct dvb_usb_device_description **desc, int *cold) -56,16 +58,13 deb_data("AF9015_download_firmware\n"); for (i = 0; i < af901x_device_count; i++) - if (dvb_usb_device_init(intf, &af901x_devices[i], THIS_MODULE, NULL) == 0) + if (dvb_usb_device_init(intf, &af901x_devices[i], THIS_MODULE, NULL, adapter_nr) == 0) return 0; return -ENODEV; } static struct usb_driver af901x_driver = { -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15) - .owner = THIS_MODULE, -#endif .name = "dvb_usb_af901x", .probe = af901x_probe, .disconnect = dvb_usb_device_exit,

Und schließlich den Patch anwenden und das ganze kompilieren:

patch < ./af_patch make su -c "make install"

Weiterführende Infomationen

Für diejenigen, die sich nicht gut mit dem kompilieren und installieren eines Linux-Kernels und dessen Module auskennen, sind folgende weiterführende Informationen im Internet verfügbar.

  • Derzeit 0 von 5 Sternen.
  • 1
  • 2
  • 3
  • 4
  • 5
Bewertung: 0/5 (Abgegebene Stimmen: 0)

Vielen Dank für die Bewertung!

Sie haben diesen Inhalt bereits bewertet. Sie können jeden Inhalt nur einmal bewerten!

Ihre Bewertung wurde geändert, vielen Dank für die Bewertung!