Archiv für den Tag: 17. Juli 2008

HOWTO: Hauppauge HVR 900 DVB-T Tuner und verwandte Modelle unter Linux nutzen

Das ist die dritte Fassung der Anleitung.

Nutzer bis einschließlich Kernel 2.6.23.X richten sich bitte an der folgenden Anleitung:
http://konstantin.filtschew.de/blog/2006/11/30/…/

Nutzer ab Kernel 2.6.24.X benutzen bitte diese Anleitung.
Die laufende Kernel Version kann unter Linux mit dem Befehl „uname -r“ eingesehen werden.

Hintergrundwissen:
Die Treiberstruktur hat sich mit dem Wechsel auf Kernel 2.6.24 komplett geändert. Das aktuelle Modul basiert auf dem Userspace Modul System und erleichtert die Portierung von einer Kernel Version zur nächsten erheblich. Zusätzlich wird das extra runterladen und auswählen der Firmware erspart.

Erklärung zu dem Befehl „sudo“:
Sudo erlaubt es als normaler Benutzer Befehle mit root-Rechten (Administrator Rechten) auszuführen. Alle Zeilen, die mit „sudo“ beginnen, können auch unter „root“ ohne Sudo ausgeführt werden. Der Befehl „whoami“ hilft sich zu identifizieren. Wenn man als normaler Benutzer „whoami“ ausführt, so erhält man seinen aktuell angemeldeten Benutzernamen zurück. Führt man den Befehl so aus „sudo whoami“, so erscheint dort der Benutzername root. Ich werde dieses durchgehend in dieser Anleitung nutzen.

Folgende Pakete (unter Debian) werden für die Erstellung der Module benötigt:

  • make
  • build-essential # (Wird für Debian gebraucht)
  • libncurses5-dev
  • kernel-package #(Wird für Debian gebraucht)
  • gcc #(muss mit der Version übereinstimmen, mit der der Kernel erstellt wurde)
  • linux-source-2.6 #(die zum laufenden Kernel passende Quellen)
  • linux-headers-2.6 #(müssen ebenfalls zur Kernel Version passen)
  • mercurial #(dieses Paket wird benötigt, um die Quellen aus dem Repository zu holen)

Mit dem folgenden Befehl werden die benötigten Pakete auf einem Debian oder Ubuntu Linux System installiert:
[code]
user@debian:~$ sudo aptitude install make gcc linux-source-2.6 linux-header-2.6 mercurial libncurses5-dev kernel-package build-essential
[/code]
Linux löst die nötigen Abhängigkeiten selber auf und installiert die zusätzlich benötigen Pakete.

Um die laufende Kernel Version zu bestimmen, reicht der Befehl „uname -a“. Meine Ausgabe an einem Debian Lenny (testing) System:
[code]
user@debian:~$ uname -r
2.6.25-2-686
[/code]

Ubuntu Nutzer bekommen ab jetzt die erste Schwierigkeit, die sie bewältigen müssen. Der vorinstallierte Kernel in der aktuellen Ubuntut Hardy (Version 8.04) ist zum Vanilla Kernel (Kernel von www.kernel.org) verändert und bereitet Probleme. Die Ubuntu Entwickler haben haben in den Kernel die Alsa Verison 0.16 integriert, obwohl im Vanilla Kernel 0.15 verwendet wird. Damit entstehen Schwierigkeiten, wenn eigene Module erstellt werden müssen.
Der folgende Eintrag beschreibt das Problem genauer (auf Englisch):
https://bugs.launchpad.net/ubuntu/+bug/204578

Ich werde für Ubuntu Nutzer eine extra Anleitung verfassen, da es doch sehr viele treffen wird. Bitte richtet euch bis dahin an diesem sehr radikalen Skript. Bitte nicht einfach ausführen, da es zu großen Problemen führen kann!
http://mcentral.de/wiki/index.php5/Installation_Guide

Im nächsten Schritt muss untersucht werden, ob die Kernel Quellen installiert und richtig verlinkt sind. Dafür geht man in den Ordner „/usr/src“ und für dort „ls -l“ aus. Die Ausgabe müsste so ungefähr aussehen:
[code]
debian:/usr/src# ls -l
total 47412
lrwxrwxrwx 1 root src 19 2008-07-13 18:53 linux -> linux-source-2.6.25
drwxr-xr-x 4 root root 4096 2008-07-13 18:34 linux-headers-2.6.25-2-686
drwxr-xr-x 18 root root 4096 2008-07-13 18:34 linux-headers-2.6.25-2-common
drwxr-xr-x 3 root root 4096 2008-07-13 18:34 linux-kbuild-2.6.25
drwxr-xr-x 21 root root 4096 2008-06-27 01:49 linux-source-2.6.25
-rw-r–r– 1 root root 48478530 2008-06-27 03:27 linux-source-2.6.25.tar.bz2
[/code]
Die zweite Zeile der Ausgabe „linux -> linux-source-2.6.25“ zeigt, dass die von mir gewählten Quellen richtig verlinkt sind.
Fehlt die Zeile, so muss man sie mit dem folgenden Befehl verlinken (-s steht für symbolisch – so wie ein Alias):
[code]
user@debian:~$ sudo ln -s /usr/src/linux-source-2.6.25 /usr/src/linux
[/code]

Damit das build-Skript funktioniert, muss zusätzlich in dem Pfad /lib/modules/ die Quellen verlinkt werden

[code]
user@debian:~$ cd /lib/modules/2.6.25-2-686
user@debian:/lib/modules/2.6.25-2-686# ls -l
total 1760
lrwxrwxrwx 1 root root 35 2008-07-13 18:34 build -> /usr/src/linux-headers-2.6.25-2-686
drwxr-xr-x 2 root root 4096 2008-07-13 18:55 empia
drwxr-xr-x 9 root root 4096 2008-07-13 18:05 kernel
-rw-r–r– 1 root root 385573 2008-07-13 18:55 modules.alias
-rw-r–r– 1 root root 69 2008-07-13 18:55 modules.ccwmap
-rw-r–r– 1 root root 385485 2008-07-13 18:55 modules.dep
-rw-r–r– 1 root root 147 2008-07-13 18:55 modules.ieee1394map
-rw-r–r– 1 root root 451 2008-07-13 18:55 modules.inputmap
-rw-r–r– 1 root root 22301 2008-07-13 18:55 modules.isapnpmap
-rw-r–r– 1 root root 74 2008-07-13 18:55 modules.ofmap
-rw-r–r– 1 root root 291390 2008-07-13 18:55 modules.pcimap
-rw-r–r– 1 root root 1387 2008-07-13 18:55 modules.seriomap
-rw-r–r– 1 root root 172847 2008-07-13 18:55 modules.symbols
-rw-r–r– 1 root root 476400 2008-07-13 18:55 modules.usbmap
lrwxrwxrwx 1 root root 28 2008-07-13 18:54 source -> /usr/src/linux-source-2.6.25
[/code]
Die letzte Zeile „source -> /usr/src/linux-source-2.6.25“ sagt aus, dass die Quellen für diesen Kernel unter „/usr/src/linux-source-2.6.25“ liegen. Fehlt so ein Eintrag, so holt man dies mit dem folgenden Befehl nach:
[code]
user@debian:~$ sudo ln -s /usr/src/linux-source-2.6.25 /lib/modules/2.6.25-2-686/source
[/code]

Damit sollte jetzt alle für das Erstellen der Module vorhanden sein.

Im nächsten Schritt müssen die Quellen runtergeladen werden. Mercurial legt schon einen passenden Ordner an. Bitte den folgenden Befehl ausführen und schauen, ob alles funktioniert hat:
[code]
user@debian:~$ hg clone http://mcentral.de/hg/~mrec/em28xx-new
[/code]
Die Ausgabe des „hg clone ..“ Befehls wird etwas länger sein und deswegen habe ich sie aus der Beschreibung raus gelassen.

Im nächsten Schritt müssen die Module erstellt werden. Das geschieht momentan (das Skript ändert sich immer wieder) so:
[code]
user@debian:~$ sudo ./build.sh build
rm -rf Module.symvers;
make -C /lib/modules/`if [ -d /lib/modules/2.6.21.4-eeepc ]; then echo 2.6.21.4-
eeepc; else uname -r; fi`/build SUBDIRS=/root/temp/em28xx-new modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.25-2-686′
CC [M] /home/user/em28xx-new/em2880-dvb.o
CC [M] /home/user/em28xx-new/em28xx-video.o
CC [M] /home/user/em28xx-new/em28xx-i2c.o
….
LD [M] /root/temp/em28xx-new/xc5000/xc5000-tuner.ko
CC /root/temp/em28xx-new/zl10353/zl10353.mod.o
LD [M] /root/temp/em28xx-new/zl10353/zl10353.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.25-2-686′
[/code]
Ich habe die Ausgabe gekürzt, weil es dort nichts interessantes gibt. Warnungen können hier ruhig ignoriert werden. Treten Fehler auf, dann sollte man genauer nach der Meldung schauen. Meistens fehlt irgendwas und das steht in der Meldung meistens genau drin.

Ist das Erstellen der Module erfolgreich gewesen, so müssen im nächsten Schritt die Module installiert werden. Das Erfolgt mit dem Befehl:
[code]
user@debian:~$ sudo ./build.sh install
[/code]
Das dauert ein Moment und normalerweise erfolgt keine Ausgabe. Nur im Fehlerfall könnte hier noch was kommen. Meistens wird „sudo“ vergessen und das Skript hat keine Schreibrechte auf Systemordner.

Damit wäre die Installation hoffentlich vollendet und man !!!sollte!!! an dieser Stelle das System neustarten. Wenn irgendwelche DVB-Module schon geladen waren, so werden sie spätestens jetzt unter Umständen Ärger machen.

Nach dem Neustart sollten sie die Module mit den folgenden Befehlen fehlerfrei laden lassen:

[code]
user@debian:~$ sudo modprobe em28xx
user@debian:~$ sudo modprobe em28xx-dvb
user@debian:~$ sudo modprobe em28xx-audio
[/code]

Das „build.sh“ Skript bietet ebenfalls die Möglichkeit alle Module zu laden. Dies geschieht mit dem folgenden Befehl:
[code]
user@debian:~$ sudo ./build.sh load
[/code]
Damit kann der Neustart vermieden werden. Wer allerdings beim Laden der Module Probleme bekommt, sollte vorsorglich einen Neustart durchführen, um nicht unnötig Fehler zu produzieren, die durch bereits geladene Module entstehen können!

Wenn ich jetzt meinen Receiver einstecke, so sieht die Ausgabe wie folgt aus:
[code]
[ 1950.302760] usb 1-1: new high speed USB device using ehci_hcd and address 2
[ 1950.454688] usb 1-1: configuration #1 chosen from 1 choice
[ 1950.456720] em28xx new video device (2040:6500): interface 0, class 255
[ 1950.456783] em28xx: device is attached to a USB 2.0 bus
[ 1950.456834] em28xx #0: Alternate settings: 8
[ 1950.456881] em28xx #0: Alternate setting 0, max size= 0
[ 1950.456889] em28xx #0: Alternate setting 1, max size= 0
[ 1950.456892] em28xx #0: Alternate setting 2, max size= 1448
[ 1950.456894] em28xx #0: Alternate setting 3, max size= 2048
[ 1950.456896] em28xx #0: Alternate setting 4, max size= 2304
[ 1950.456898] em28xx #0: Alternate setting 5, max size= 2580
[ 1950.456900] em28xx #0: Alternate setting 6, max size= 2892
[ 1950.456902] em28xx #0: Alternate setting 7, max size= 3072
[ 1950.814288] trying to set disabled gpio? (00)
[ 1950.926465] attach_inform: tvp5150 detected.
[ 1950.931991] cx25843.c: starting probe for adapter em28xx #0 (0x1001f)
[ 1950.965050] tuner‘ 0-0061: chip found @ 0xc2 (em28xx #0)
[ 1950.965050] attach inform (default): detected I2C address c2
[ 1951.024446] attach_inform: eeprom detected.
[ 1951.121182] em28xx #0: i2c eeprom 00: 1a eb 67 95 40 20 00 65 50 12 5c 03 82 1e 6a 18
[ 1951.121182] em28xx #0: i2c eeprom 10: 00 00 24 57 66 07 00 00 60 00 00 00 02 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 20: 46 00 01 00 f0 10 02 00 b8 00 00 00 5b 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 30: 00 00 20 40 20 6e 02 20 10 01 01 01 00 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 60: 00 00 00 00 00 00 00 00 00 00 18 03 34 00 30 00
[ 1951.121182] em28xx #0: i2c eeprom 70: 32 00 36 00 38 00 39 00 38 00 38 00 37 00 38 00
[ 1951.121182] em28xx #0: i2c eeprom 80: 00 00 1e 03 57 00 69 00 6e 00 54 00 56 00 20 00
[ 1951.121182] em28xx #0: i2c eeprom 90: 48 00 56 00 52 00 2d 00 39 00 30 00 30 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom a0: 84 12 00 00 05 50 1a 7f d4 78 23 f0 fd d0 18 85
[ 1951.121182] em28xx #0: i2c eeprom b0: ff 00 00 00 04 84 0a 00 01 01 20 77 00 40 be 99
[ 1951.121183] em28xx #0: i2c eeprom c0: 05 f0 74 02 01 00 01 79 0c 00 00 00 00 00 00 00
[ 1951.121183] em28xx #0: i2c eeprom d0: 84 12 00 00 05 50 1a 7f d4 78 23 f0 fd d0 18 85
[ 1951.121183] em28xx #0: i2c eeprom e0: ff 00 00 00 04 84 0a 00 01 01 20 77 00 40 be 99
[ 1951.121183] em28xx #0: i2c eeprom f0: 05 f0 74 02 01 00 01 79 0c 00 00 00 00 00 00 00
[ 1951.121183] EEPROM ID= 0x9567eb1a
[ 1951.121183] Vendor/Product ID= 2040:6500
[ 1951.121183] AC97 audio (5 sample rates)
[ 1951.121183] 500mA max power
[ 1951.121183] Table at 0x24, strings=0x1e82, 0x186a, 0x0000
[ 1951.215248] tvp5150 0-005c: tvp5150am1 detected.
[ 1956.755148] successfully attached tuner
[ 1956.815279] em28xx #0: V4L2 VBI device registered as /dev/vbi0
[ 1956.858622] em28xx #0: V4L2 device registered as /dev/video0
[ 1956.858788] em2880-dvb.c: DVB Init
[ 1976.984939] analog tv open()
[ 1976.985010] modelock active!
[ 1976.992903] vbi open()
[ 1976.992935] modelock active!
[ 1957.188645] DVB: registering new adapter (em2880 DVB-T)
[ 1957.188645] DVB: registering frontend 0 (Zarlink ZL10353 DVB-T)…
[ 1957.190935] em28xx #0: Found Hauppauge WinTV HVR 900
[ 1957.192191] em28xx audio device (2040:6500): interface 1, class 1
[ 1957.192771] em28xx audio device (2040:6500): interface 2, class 1
[ 1957.193563] usb 1-1: New USB device found, idVendor=2040, idProduct=6500
[ 1957.193601] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=2
[ 1957.193604] usb 1-1: Product: WinTV HVR-900
[ 1957.193667] usb 1-1: SerialNumber: 4026898878
[ 1958.013115] usbcore: registered new interface driver snd-usb-audio
[/code]

Nach dem einstecken müssen die folgenden Devices in /dev vorhanden sein:

[code]
/dev/vbi0
/dev/video0
/dev/dvb/adpater0/demux0
/dev/dvb/adpater0/dvr0
/dev/dvb/adapter0/frontend0
[/code]

Weitere Hinweise:
Unter Umständen wird es nötig sein den Nutzer zu der Gruppe Video hinzuzufügen, weil er sonst keine Zugriffsrechte auf das Video Device bekommt. Dafür muss der folgende Befehl ausgeführt werden. (Die Variable $USER wird vom System gesetzt und ist der aktuell angemeldete Benutzer):
[code]
user@debian:~$ sudo adduser $USER video
[/code]

Wenn Schwierigkeiten nach der erfolgreichen Installation entstehen, dann bitte das System ohne eingesteckten Receiver hoch fahren, dann die Module per Hand laden (unter dmesg die Meldungen beachten) und erst dann den Receiver einstecken. Dadurch sind die Fehler besser sichtbar, weil sie nicht durcheinander in dmesg beim Booten eingestreut werden.

Falls jemand Trotzdem Schwierigkeiten hat, der kann mir Gerne ein Kommentar hinterlassen. Damit es für mich einfacher wird euch zu helfen, bitte ich euch die folgenden Informationen mir zu geben:
– Linux Version (z.B. Ubuntu Hardy 8.04, Debian Linux 4.0 (Etch))
– Kernel Version 2.6.25-2 (Der Befehl: „uname -r“ verrät es. Auch bitte angeben, ob es ein selbst erstellter Kernel ist oder vom Distributor)
– Sind die Linux Quellen Installiert? (Folgende Befehle helfen weiter „sudo ls -l /usr/src“ und „sudo ls -l /lib/modules/$(uname -r)/source“
– Ist was beim Erstellen scheif gegangen, so bitte ich um die komplette Ausgabe, falls ihr den Fehler nicht selber seht.
– Hat das Installieren der Module funktioniert, aber danach geht irgendwas schief, so bitte ich euch das System ohne Receiver zu starten, dann die Module zu laden und erst dann den Receiver einzustecken. Danach mir bitte die dmesg-Ausgabe ab der Stelle in der die Module geladen wurden geben.
– Bitte alle längeren Ausgaben wie von dmesg oder vom Erstellen des Treibers auf der Seite http://www.pastebin.com oder auf http://ubuntuusers.de/paste/ posten und hier nur den Link rein stellen, da es sonst zu unübersichtlich wird.

Ich hoffe damit möglichst vielen Nutzern zu helfen. Wer mir danke möchte, der möge es mit einem Kommentar tun. Spenden nehme ich gerne als Geschenke von meiner Amazon Wunschliste an.