Hauppauge WinTV Nexus-S
Aus Gentoo Linux Wiki
Inhaltsverzeichnis |
[Bearbeiten] Installieren
Die nachfolgenden Ausführungen beziehen sich auf eine Nexus-S Model 564 Software Rev. 2.3. Sofern nicht anders angegeben müssen die nachfolgend beschriebenen Arbeiten als root ausgeführt werden.
[Bearbeiten] Kernel konfigurieren
Die WinTV Nexus S verwendet einen AV7110 Chipsatz mit STV0299 Frontend. Die benötigten DVB-Treiber sind in den Kernel-Versionen der 2.6er-Reihe bereits integriert. Voraussetzung für ein erfolgreiches Aktivieren der Treiber sind natürlich installierte Kernel-Quellen (Einzelheiten hierzu siehe Gentoo-Dokumentation).
Zunächst rufen Sie menuconfig auf:
cd /usr/src/linux make menuconfig
bzw. wenn Sie Genkernel verwenden (lesen Sie auch die Gentoo-Dokumentation zu Genkernel!):
cd /usr/src/linux genkernel --menuconfig all
Jetzt werden folgende Optionen gesetzt:
---> Device Drivers
---> Multimedia Devices
<*> Video for Linux
---> Digital Video Broadcasting Devices
[*] DVB for Linux
<*> DVB Core Support
<M> AV7110 Cards
<*> AV7110 OSD Support
---> Customise DVB Frontends
<M> ST STV0299 based
---> Input Device Support
<M> Event Interface
Die Option Input Device Support wird für einen Betrieb der Nexus-eigenen Fernbedienung benötigt. Falls Sie eine andere Fernbedienung benutzen wollen, lassen Sie diese Einstellung, wie sie ist (Der Input Layer wird u.U. auch von Maus, Tastatur und anderen Eingabegeräten verwendet).
Beenden Sie nun menuconfig und speichern Sie dabei Ihre Änderungen. Dann kompilieren und installieren Sie Ihren neuen Kernel wie in der Gentoo-Dokumentation beschrieben.
[Bearbeiten] Firmware installieren
Damit der DVB-Treiber richtig funktioniert, benötigt er noch ein Stück Firmware von linux-tv.org. Glücklicherweise gibt es für Gentoo bereits ein fertiges Paket, welches nur emerged werden muss. Das Paket enthält Firmware für eine ganze Reihe von Karten. Damit nur die benötigte Firmware installiert wird, teilen wir vorher emerge mit, welche Firmware wir wollen:
echo "DVB_CARDS=\"ttpci\"" >> /etc/make.conf
Achtung: Falls Sie mehr als eine DVB-Karte installiert haben, müssen Sie /etc/make.conf editieren und in der hoffentlich bereits vorhandenen Zeile DVB_CARDS="..." nur den Eintrag ttpci ergänzen (Trennung durch Leerzeichen). Wenn Sie unsicher sind, lassen Sie die Zeile ganz weg. In diesem Fall werden alle verfügbaren Firmware-Dateien emerged.
Nun können wir die Firmware emergen:
emerge linuxtv-dvb-firmware
Das DVB-Modul (der Treiber) heisst dvb_ttpci. Um sicherzustellen, dass es beim Booten geladen wird ergänzen wir die Datei /etc/modules.autoload.d/kernel-2.6 wie folgt:
echo "dvb_ttpci" >> /etc/modules.autoload.d/kernel-2.6
Nach einem Neustart sollte der Treiber nun automatisch laden. Ein Blick in dmesg verrät, ob bis hierher alles geklappt hat:
dmesg | more
Im Erfolgsfall sollten Sie in der Ausgabe nun Meldungen wie folgende sehen:
saa7146: found saa7146 @ mem d8836000 (revision 1, irq 18) (0x13c2,0x000e). DVB: registering new adapter (Technotrend/Hauppauge WinTV Nexus-S rev2.3). adapter has MAC addr = 00:d0:5c:24:fe:8b dvb-ttpci: gpioirq unknown type=0 len=0 dvb-ttpci: info @ card 0: firm f0240009, rtsl b0250018, vid 71010068, app 80002622 dvb-ttpci: firmware @ card 0 supports CI link layer interface dvb-ttpci: Crystal audio DAC @ card 0 detected saa7146_vv: saa7146 (0): registered device video0 [v4l2] saa7146_vv: saa7146 (0): registered device vbi0 [v4l2] DVB: registering frontend 0 (ST STV0299 DVB-S)... input: DVB on-card IR receiver as /class/input/input2 dvb-ttpci: found av7110-0.
Sollte kein Erfolg zu verzeichnen sein, weil die Ausgabe von dmesg etwa so aussieht:
saa7146: found saa7146 @ mem ce864000 (revision 1, irq 10) (0x13c2,0x0003). dvb-ttpci: could not load firmware, file not found: dvb-ttpci-01.fw dvb-ttpci: usually this should be in /usr/lib/hotplug/firmware or /lib/firmware dvb-ttpci: and can be downloaded from http://www.linuxtv.org/download/dvb/firmware/
dann sollte man kontrollieren, ob hotplug installiert und gestartet ist.
[Bearbeiten] DVB-Tools installieren
Linux-tv.org bietet ein paar nützliche DVB-Tools an, die wir nachfolgend benötigen:
emerge linuxtv-dvb-apps
[Bearbeiten] Kanäle suchen
Die hier beschriebenen Arbeiten setzen eine funktionierende Satelliten-Empfangsanlage mit angeschlossener Nexus-S voraus.
Als erstes müssen Sie in Erfahrung bringen, auf welche(n) Satelliten Ihre Anlage ausgerichtet ist und - im Falle einer Mehrsatellitenanlage - an welchen DiSEqC-Positionen diese eingespeist werden. Standardinstallationen arbeiten häufig mit Astra auf 19.2 Grad Ost und/oder mit Hotbird auf 13 Grad Ost.
Im Verzeichnis /usr/share/dvb/scan/dvb-s befinden sich Dateien mit den Frequenzen und Parametern der Info-Service-Transponder der einzelnen Satelliten (Tuning Data Files):
ls /usr/share/dvb/scan/dvb-s
Identifizieren und notieren Sie sich die Datei(en) für Ihre(n) Satelliten. Nachfolgend verwenden wir die Dateien für Astra und Hotbird. Ersetzen Sie die entsprechenden Angaben mit den Dateinamen ihrer Satelliten.
Machen Sie den nachfolgenden Kurztest mit "Ihrem" Satelliten bzw. bei Mehrsatellitenanlagen mit dem Satelliten an der ersten DiSEqC-Position. Falls die Nexus nicht die erste DVB-Karte in Ihrem System ist (/dev/dvb/adapter0), müssen Sie zusätzlich die Option -a /dev/dvb/adapterN/ setzen. Das N steht für die Ordnungsnummer der Karte in Ihrem System.
dvbscan /usr/share/dvb/scan/dvb-s/Astra-19.2E
Wenn dvbscan Kanäle findet, sind die Treiber korrekt installiert und Sie können den Test mit Strg-C abbrechen. Haben Sie mehr als einen Satelliten, wiederholen Sie den Test mit den restlichen Satelliten Ihrer Anlage. Dabei gibt die Option -s die jeweilige DiSEqC-Position an (Die Numerierung beginnt bei Null):
dvbscan -s 1 /usr/share/dvb/scan/dvb-s/Hotbird-13.0E
Je nachdem, welche TV-Software Sie einsetzen wollen, müssen Sie zur Speicherung der Kanalinformationen anders vorgehen. Folgen Sie den Anweisungen der jeweiligen HowTos und sehen Sie sich die Hilfe von dvbscan bezüglich Output-Formaten an (dvbscan --help).
[Bearbeiten] Fernbedienung konfigurieren
[Bearbeiten] Input Device bestimmen
Um die Fernbedienung in Betrieb zu nehmen, müssen Sie zunächst herausfinden, über welchen Event des Input-Layers diese ihre Daten schickt. Dazu untersuchen Sie die Datei /proc/bus/input/devices:
cat /proc/bus/input/devices
Wenn der Treiber richtig geladen ist, sollten Sie etwa folgende Ausgabe erhalten:
I: Bus=0000 Vendor=0000 Product=0000 Version=0000 N: Name="DVB on-card IR receiver" P: Phys= S: Sysfs=/class/input/input2 H: Handlers=kbd event2 B: EV=100003 B: KEY=fc812 a052041 0 0 0 0 0 4000 40002800 1e1680 0 0 ffc
Der Eintrag Handlers=kbd event2 sagt aus, dass die Fernbedienung über /dev/input/event2 angesprochen wird. Je nachdem, welche USB-Eingabegeräte (Tastatur, Maus, Joystick, etc.) sonst noch auf Ihrem System installiert sind, kann die Event-Nummer unterschiedlich ausfallen (z.B. event0, event1, ...). Merken Sie sich "Ihre" Event-Nummer und verwenden Sie nachfolgend diese anstelle der hier beispielhaft angegebenen Event-Nummer event2.
[Bearbeiten] Tastencodes auf Input Events mappen
Leider arbeitet die Fernbedienung der Nexus-S nicht ohne weiteres mit dem Input-Layer zusammen. Die DVB-Tools von Linux-tv.org enthalten hierfür ein Programm namens av7110_loadkeys. Dieses setzt die Tastencodes der Fernbedienung in Input-Events um. Es benötigt als Parameter eine Beschreibungsdatei der Fernbedienungs-Keycodes - Keymap genannt. Einige Keymaps werden gleich mitgeliefert. Für die Nexus-Fernbedienung verwenden wir die Datei hauppauge_grey.rc5. Portage packt Keymaps standardmäßig in das Verzeichnis /usr/share/dvb/av7110_loadkeys/. Da Hauppauge die beigelegten Fernbedienungen ständig weiterentwickelt, kann es sein, dass hauppauge_grey.rc5 nicht alle Tasten Ihrer Fernbedienung unterstützt. Um die Datei später anzupassen, kopieren wir sie in ein anderes Verzeichnis, welches wir (an beliebiger Stelle) anlegen:
mkdir /etc/dvb_ir cp /usr/share/dvb/av7110_loadkeys/hauppauge_grey.rc5 /etc/dvb_ir
Wir starten av7110_loadkeys zunächst mit unveränderter Keymap-Datei:
av7110_loadkeys /etc/dvb_ir/hauppauge_grey.rc5 > /proc/av7110_ir
Ein weiteres nützliches Tool aus der linux-tv-Sammlung(Paket media-tv/linuxtv-dvb-apps) ist evtest, das uns nun anzeigt, ob die Fernbedienung funktioniert (ersetzen Sie ggf. event2 wie oben beschrieben):
evtest /dev/input/event2
evtest überprüft nun die Fähigkeiten des Fernbedienungstreibers und gibt eine Liste der "verstandenen" Tastencodes aus. Wenn Sie jetzt Tasten auf Ihrer Fernbedienung drücken, sollte evtest dies ebenfalls entsprechend anzeigen, sofern die verwendete Keymap den betreffenden Tastencode enthält.
Anmerkung: In Version media-tv/linuxtv-dvb-apps-1.1.1.20070114 wurde evtest bei mir nicht mitinstalliert. (Habs dann händisch nachkompiliert)
[Bearbeiten] Anpassen der Keymap
Wie schon oben erwähnt, erkennt av7110_loadkeys leider nicht alle Tasten der neuesten grauen Hauppauge-Fernbedienung. Um alle Tasten zugänglich zu machen, müssen wir die Keymap anpassen. Der Aufbau dieser Textdatei ist sehr einfach. Jede Zeile besteht aus:
<Tastencode hexadezimal> <blank> <Bezeichner> also z.B. 0x3d KEY_POWER
Zuerst müssen Sie die Tastencodes der nicht reagierenden Tasten ermitteln. Starten Sie dazu evtest wie oben beschrieben. Probieren Sie nun der Reihe nach alle Tasten der Fernbedienung durch. Hier gibt es zwei mögliche Fehlerbilder:
- evtest zeigt keinen Event beim Drücken der Taste an
- evtest zeigt einen falschen (unerwünschten) Event beim Drücken der Taste an.
Notieren Sie sich in beiden Fällen die Tasten und/oder die angezeigten Events.
Als nächstes drücken Sie nochmal gezielt alle Tasten, auf die evtest nicht reagiert hat - und zwar in der gleichen Reihenfolge, in der Sie sie notiert haben.
Immer wenn av7110_loadkeys einen Keycode empfängt, der nicht zugeordnet werden kann, schreibt das Programm einen entsprechenden Log-Eintrag. (Falls nicht, empfiehlt der av7110_loadkeys-Autor ein #insmod dvb-ttpci.o av7110_ir_debug=1, um den Log-Output anzuschalten. Das war bei mir aber nicht nötig.)
Sehen Sie sich das Log-File an:
dmesg
An den Zeilenenden der Ausgabe finden Sie die gesuchten Tastencodes, deren Hexadezimalwerte Sie nun den nicht reagierenden Tasten zuordnen können. (Je nachdem, wie lange Sie eine Taste gedrückt hatten, können mehrere Meldungen mit dem gleichen Tastencode erscheinen. Sie müssen nur anhand der Reihenfolge die unterschiedlichen Tastencodes aus der Log-Datei den zuvor gedrückten Tasten zuordnen)
Beispielausgabe von dmesg:
av_7110_emit_key: unknown key 0x11!!
Nun benötigen wir nur noch die richtigen Bezeichner. av7110_loadkeys arbeitet mit einem fest eincodierten Satz an Bezeichnern. Zum Glück ist das Programm mit Bezeichnern bereits mehr als üppig bestückt. Die Datei /usr/include/linux/input.h enthält eine Liste aller definierten Bezeichner:
cat /usr/include/linux/input.h | grep KEY
Die Ausgabe besteht aus einer Reihe von #define-Statements, welche die Bezeichner und die zugehörigen Event-Keycodes festlegen. Wichtig für Sie sind nur die Bezeichnernamen, denn diese "versteht" av7110_loadkeys, ergo können diese zur Belegung der toten Fernbedienungstasten verwendet werden. Nun müssen Sie nur noch einen Editor Ihrer Wahl starten und die Keymap nach Ihren Bedürfnissen anpassen. (Die Anleitung zum hier verwendeten Editor nano finden Sie hier [[1]])
nano -w /etc/dvb_ir/hauppauge_grey.rc5
Hier tragen Sie die notierten Hexadezimalwerte der toten Tasten ein und ordnen jedem Eintrag einen Eventbezeichner aus input.h zu. Selbstverständlich können Sie auch die Eventbezeichner bereits definierter Tasten nach Ihren Wünschen umbiegen. Falls Sie unsicher sind, sehen Sie sich die anderen mitgelieferten Keymaps in /usr/share/dvb/av7110_loadkeys/ an. Nachdem Sie den Editor verlassen haben, setzen Sie die neue Keymap durch einen erneuten Aufruf von av7110_loadkeys in Kraft:
av7110_loadkeys /etc/dvb_ir/hauppauge_grey.rc5 > /proc/av7110_ir
Wenn Sie jetzt wieder evtest starten, sollten alle Tasten der Fernbedienung wie gewünscht funktionieren.
So sieht meine Fernbedienung aus. Sie lag einer Karte Model 564 Rev. 2.3 bei:
Die modifizierte Keymap-Datei für diese Fernbedienung sieht so aus:
0x3d KEY_POWER 0x3b KEY_GOTO 0x00 KEY_0 0x01 KEY_1 0x02 KEY_2 0x03 KEY_3 0x04 KEY_4 0x05 KEY_5 0x06 KEY_6 0x07 KEY_7 0x08 KEY_8 0x09 KEY_9 0x0A KEY_KPASTERISK 0x0E KEY_GRAVE 0x1f KEY_EXIT 0x0d KEY_MENU 0x0b KEY_RED 0x2e KEY_GREEN 0x38 KEY_YELLOW 0x29 KEY_BLUE 0x1b KEY_EPG 0x1c KEY_TV 0x18 KEY_VIDEO 0x19 KEY_AUDIO 0x1a KEY_CAMERA 0x16 KEY_LEFT 0x17 KEY_RIGHT 0x14 KEY_UP 0x15 KEY_DOWN 0x25 KEY_OK 0x10 KEY_VOLUMEUP 0x11 KEY_VOLUMEDOWN 0x20 KEY_CHANNELUP 0x21 KEY_CHANNELDOWN 0x12 KEY_BACK 0x0f KEY_MUTE 0x0c KEY_RADIO 0x32 KEY_REWIND 0x35 KEY_PLAY 0x34 KEY_FASTFORWARD 0x37 KEY_RECORD 0x36 KEY_STOP 0x30 KEY_PAUSE 0x24 KEY_PREVIOUS 0x1e KEY_NEXT
[Bearbeiten] Keymapping per Skript beim Booten aktivieren
In einem letzten Schritt müssen wir dafür sorgen, dass av7110_loadkeys beim Booten automatisch gestartet wird und unsere modifizierte Keymap in Kraft setzt. Das muss geschehen bevor ein Programm startet, welches die Fernbedienung ausliest wie z.B. der LIRC-Dämon (mehr zu LIRC nachfolgend). Dies geschieht am einfachsten über ein Init-Skript. Dabei können wir uns in den Mechanismus einklinken, der die Gentoo Dienste (Dämonen) steuert. Das Verzeichnis /etc/init.d enthält für jeden Dienst ein Skript mit Routinen zum Starten und Stoppen. Unser Keymapper ist zwar strenggenommen kein Dämon, aber er passt gut in das Steuerungsshema. Am einfachsten kopieren wir eine bestehende Skriptdatei, die wir dann bearbeiten:
cp /etc/init.d/local /etc/init.d/haupkeymap nano -w /etc/init.d/haupkeymap
Wir löschen alle nicht benötigten Zeilen und setzen unseren Aufruf in die Start-Routine ein. Das ganze sieht dann etwa so aus:
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
start() {
ebegin "Installing Hauppauge Remote Control Keymapping"
av7110_loadkeys /etc/dvb_ir/hauppauge_grey.rc5 > /proc/av7110_ir
eend $?
}
stop() {
ebegin "Hauppauge Remote Control Keymapping: nothing to do"
eend $?
}
Nun speichern und den Editor verlassen. Es folgt ein kurzer Test:
/etc/init.d/haupkeymap start * Installing Hauppauge Remote Control Keymapping ... [ ok ]
und
/etc/init.d/haupkeymap stop * Hauppauge Remote Control Keymapping: nothing to do ... [ ok ]
Jetzt binden wir unser Skript in den Initialisierungsprozess ein, indem wir den "Dienst" dem Runlevel boot hinzufügen:
rc-update add haupkeymap boot
Runlevel boot ist wichtig, damit der Keymapper vor anderen Diensten gestartet wird, die die Fernbedienung abfragen könnten. Derartige Dienste fügen wir später dem Runlevel default hinzu. Wir können einfach kontrollieren, ob die Reihenfolge stimmt:
rc-update -s
Jetzt wird eine Liste der Dienste und ihrer Runlevel ausgegeben. Wenn bis hierher alles stimmt folgt der ultimative Test:
reboot
Beim Hochfahren können wir beobachten, wie die Keymapper-Startmeldung ausgegeben wird. Wir loggen uns als root ein und starten evtest (wie gehabt bitte die Event-Nummer Ihres Systems einsetzen):
evtest /dev/input/event2
Jetzt sollte die Fernbedienung mit allen Tasten funktionieren.
[Bearbeiten] LIRC
Je nachdem, welche Media-Software Sie zum Betrieb der Karte verwenden wollen, müssen Sie lirc (Linux Infrared Remote Control) installieren. Eine Installation von lirc macht aber zumindest unter Test-Aspekten Sinn und ist deshalb nachfolgend beschrieben.
[Bearbeiten] Installieren
Damit lirc richtig übersetzt und eingebunden wird, ergänzen Sie zunächst die Datei /etc/make.conf um folgende Zeile:
echo "LIRC_DEVICES=\"devinput\"" >> /etc/make.conf
Jetzt können Sie lirc emergen.
emerge lirc
Überprüfen Sie den Eintrag für LIRCD_OPTS in /etc/conf.d/lircd
nano -w /etc/conf.d/lircd
So soll dieser Eintrag aussehen:
LIRCD_OPTS="-H dev/input -d /dev/input/event2"
Achtung: Vergessen Sie nicht, event2 durch "Ihre" Event-Nummer zu ersetzen (siehe oben).
Den lirc-Dämon lircd können Sie jetzt über /etc/init.d/lircd starten und stoppen
/etc/init.d/lircd start
bzw.
/etc/init.d/lircd stop
Damit der lirc-Dämon beim Booten automatisch geladen wird (nach dem Keymapper), fügen Sie mit rc-update dem Runlevel default das init-Skript hinzu.
rc-update add lircd default
[Bearbeiten] Testen
Zum Testen stoppen Sie zunächst den LIRC-Dämon:
/etc/init.d/lircd stop
Nun rufen Sie lircd als Programm direkt von der Konsole aus auf:
lircd -n -H dev/input -d /dev/input/event2
Nun wechseln Sie zu einer zweiten Konsole (z.B. Alt-F2) und loggen sich dort erneut als root ein. Starten Sie das Programm irw:
irw
Nun wechseln Sie zurück zur ersten Konsole (z.B. Alt-F1). Wenn Sie nun Tasten auf der Fernbedienung betätigen, sollte lircd die entsprechenden Input-Events erkennen und ausgeben.
[Bearbeiten] Zusammenarbeit mit VDR
In meiner Testinstallation hat VDR die Fernbedienung trotz fehlerfrei funktionierenden lircd nicht erkannt. Weder lirc noch VDR meldeten ein Problem. Die Ursache hierfür ist mir unklar. Ich habe die Fernbedienung dann doch zum Laufen gebracht, allerdings mit einer etwas unsauberen Methode:
Offenbar gibt lircd die Tastencodes der Fernbedienung als Keyboard-Events weiter. Wenn man in VDR die Unterstützung für Fernbedienungen ganz abschaltet (Zeile IR_CTRL="..." in /etc/conf.d/vdr auskommentieren - das ist die Default-Einstellung) kann man VDR im Anlernmodus die Fernbedienungs-Events als Tastatureingaben unterjubeln. Dazu muss man den Kommentar der Zeilen TERMINAL="8" und SWITCH_TO_TERMINAL="YES" entfernen, damit VDR auf Tastatureingaben reagiert. lircd muss ebenfalls laufen. Leider funktionieren nur einfache Tasten, die man auch auf der Tastatur drücken kann (Gründe unklar). Damit alle FB-Tasten funktionieren, muss man die Fernbedienungs-Keymap speziell anpassen. Man lässt z.B. die Zuordnung der Zifferntasten unverändert, ordnet aber den anderen Tasten der Reihe nach Buchstaben aus dem Alphabet zu, also 1. FB-Taste --> KEY_A, zweite FB-Taste --> KEY_B, etc. Wenn man dann die jeweilige FB-Taste drückt, ist es so, als hätte man die zugeordnete Buchstabentaste auf der Tastatur gedrückt. Diese Lösung ist zwar nicht schön, funktioniert aber in der Praxis ganz gut, da man ja auf der Fernbedienung die richtige Beschriftung sieht. Und VDR ist es egal, der nimmt jede Taste für jede Funktion. Falls jemand eine bessere Idee hat, bitte posten.
[Bearbeiten] Lösung :
Nach Änderung des VDR-Bootlevels von 'boot' auf 'default' funktionierts. Das Mapping muss unbedingt vor dem VDR starten.
rc-update del VDR
rc-update add VDR default
[Bearbeiten] Wie geht es weiter ?
Eine funktionierende DVB-Karte ist nur eine Komponente eines Media-Centers. Bevor Sie eine entsprechende Media-Software installieren, sollten Sie sicherstellen dass alle (oder zumindestens die benötigten) Komponenten und Dienste auf Ihrem System funktionieren:
- graphische Oberfläche (siehe [[2]])
- Soundkarte (siehe [[3]])
- USB Plug and Play (siehe udev)
- Ggf. Firewire Plug and Play (Anschluss von Kameras)
- Integration eines ggf. vorhandenen Kartenlesers
- Energiesparmodus, zeitgesteuertes Hoch- und Runterfahren (siehe [[4]] Kapitel 7 "Schlafzustände")
- Automounten / Hotplug von DVDs, CDs, Speichermedien, etc. (siehe [[5]])
- DVD-, VCD-, SVCD-Wiedergabe (siehe mplayer, xine, libdvdcss')
- DVD-Brennfunktionen (siehe cdrecord, growisofs)
Gängige "full-featured" Media-Software bieten
- VDR
- MythTV
- Freevo
