Artikel als PDF Gesamtansicht

5 Inbetriebnahme des DVB-Sticks

Wie oben erwähnt ist mittlerweile eine größere Anzahl von DVB-Treibern im ALARM-Kernel enthalten. Ob der DVB-Stick erkannt wird, lässt sich der Ausgabe von dmesg entnehmen.

usb 1-1.4: new high speed USB device number 7 using orion-ehci
dvb-usb: found a 'WideView WT-220U PenType Receiver (Typhoon/Freecom)' in cold state, will try to load a firmware
dvb-usb: did not find the firmware file. (dvb-usb-wt220u-02.fw) Please see linux/Documentation/dvb/ for more details on firmware-problems. (-2)

In diesem Fall kann man gleich mit Abschnitt 5.2 fortfahren. Ist dagegen kein passender Treiber verfügbar, meldet dmesg lediglich ein unbekanntes USB-Gerät

usb 1-1.4: new high speed USB device number 7 using orion-ehci

Zur genaueren Identifizierung dienen Hersteller- und Produkt-ID laut lsusb (Ausgabe hier beschränkt auf das neue Gerät an Bus 1, Device 7):

[root@alarm ~]# lsusb -s 1:7
Bus 001 Device 007: ID 2040:1605 Hauppauge 

Es handelt sich hier um den Hauppauge WinTV HVR 930C, der im folgenden als konkretes Beispiel dienen soll. Er wird zwar seit Kernel 3.3 unterstützt15, Arch Linux ARM verwendete aufgrund von Problemen mit U-Boot bis Anfang 2014 jedoch per Voreinstellung Version 3.1 des Kernels. Erfreulicherweise können die aktuellen (und künftigen) Kerneltreiber für TV-/Videogeräte aber aus dem v4l-dvb Repository von linuxtv.org installiert werden.

Hinweis: Mit dem alternativen - im Kirkwood Image auch vorinstallierten - Kernelpaket linux-kirkwood ist unlängst auch ein aktueller Kernel verfügbar. Damit erübrigt sich bei diesem Stick eine Installation von v4l-dvb. Der Einsatz eines Kernels jenseits von Version 3.1 setzt bei älteren Installationen ggf. ein vorheriges Update des Bootloaders voraus. Auch linux-kirkwood kann mittels v4l-dvb um neuere oder noch nicht in den Kernel integrierte Treiber bereichert werden.

Im AUR befindet sich ein Paket, das sämtliche v4l-dvb Treiber installiert. Um die Auswahl auf die tatsächlich benötigten Treiber beschränken zu können, habe ich das PKGBUILD angepasst.

Vor dem Bau des Paketes ist als root einmalig folgender Befehl abzusetzen:

[root@alarm ~]# make -C /usr/src/linux-$(uname -r)/ menuconfig

Das erscheinende Menü beendet man sogleich über den Button <Exit>. Nach Aufruf von makepkg (als normaler User) wird man dann mit einem auf die Multimediatreiber reduzierten Menü konfrontiert. Sind die zu aktivierenden Optionen nicht ersichtlich, findet man im folgenden Abschnitt einige Hilfestellungen. Wer den Aufwand scheut und eine längere Kompilierzeit hinnimmt, verwendet einfach das unmodifizierte Paket aus dem AUR.

Hinweis: Nutzt man am DockStar weitere Videogeräte (z.B. eine Webcam), sollten im Zweifelsfall auch deren Module über die v4l-dvb-Treiber aktualisiert werden, da es andernfalls zu Versionskonflikten der Kernelmodule kommen kann.

Das Paket v4l-dvb-git muss nach jedem Kernelupdate erneut kompiliert und installiert werden. Dies kann bereits vor dem Booten des neuen Kernels geschehen, im PKGBUILD muss dazu lediglich die Variable _kernver explizit auf die neue Version gesetzt werden.

#_kernver="$(uname -r)"     # build for running kernel
_kernver="3.1.10-34-ARCH" # build for different kernel

5.1 Ermittlung des Treibers

Ist das benötigte Modul nicht bekannt, sucht man im Quellcode nach jenen Dateien, die unabhängig von Groß-/Kleinschreibung Hersteller- und Produkt-ID innerhalb einer Zeile enthalten.

[user@alarm v4l-dvb-git]$ cd src/media_build/
[user@alarm media_build]$ grep -R -i "2040.*1605"
linux/drivers/media/usb/em28xx/em28xx-cards.c:  { USB_DEVICE(0x2040, 0x1605),

Dem Pfad zur Quelldatei ist unschwer der Name des zugehörigen Moduls entnehmen, in diesem Beispiel em28xx. Gibt es keine Fundstelle, beschränkt man sich zunächst auf die Hersteller-ID und sucht in den gefundenen Dateien dann nach der Produkt-ID16. Anschließend durchforschen wir gezielt die Makefiles nach dem Modulnamen (Unterstrich ggf. durch Minuszeichen ersetzen) wobei uns nur Zeilen interessieren, in denen die Verbindung zu einer CONFIG-Variablen hergestellt wird:

[user@alarm media_build]$ find -type f -name Makefile | xargs grep "CONFIG.*em28xx"
./linux/drivers/media/usb/em28xx/Makefile:obj-$(CONFIG_VIDEO_EM28XX) += em28xx.o
./linux/drivers/media/usb/em28xx/Makefile:obj-$(CONFIG_VIDEO_EM28XX_ALSA) += em28xx-alsa.o
./linux/drivers/media/usb/em28xx/Makefile:obj-$(CONFIG_VIDEO_EM28XX_DVB) += em28xx-dvb.o
./linux/drivers/media/usb/em28xx/Makefile:obj-$(CONFIG_VIDEO_EM28XX_RC) += em28xx-rc.o
./linux/drivers/media/usb/Makefile:obj-$(CONFIG_VIDEO_EM28XX) += em28xx/

Wir müssen also für sorgen, dass die Variable CONFIG_VIDEO_EM28XX_DVB gesetzt wird. Im Konfigurationsdialog gelangen wir durch Eingabe eines Schrägstrichs (/) in eine Suchmaske und geben dort die Variable ein. Das Ergebnis liefert den gesuchten Prompt und beschreibt, wie man dorthin gelangt:

Symbol: VIDEO_EM28XX_DVB [=n]
Type  : tristate
Prompt: DVB/ATSC Support for em28xx based TV cards
  Defined at ./Kconfig:2000
  Depends on: MEDIA_SUPPORT [=n] && MEDIA_USB_SUPPORT [=n] && (MEDIA_CAMERA_SUPPORT [=n] || MEDIA_ANALOG_TV_SUPPORT [=n] || MEDIA_DIGITAL_TV_SUPPORT [=n]) && VIDEO_EM28XX [=n] && DVB_CORE [=n]
  Location:
    -> Multimedia support (MEDIA_SUPPORT [=n])
      -> Media USB Adapters (MEDIA_USB_SUPPORT [=n])
        -> Empia EM28xx USB video capture support (VIDEO_EM28XX [=n])

Folgt man dem angegebenen Pfad, sind einige Untermenüs nicht unmittelbar zugänglich. Ursächlich sind weitere nach Depends on aufgelistetete Abhängigkeiten. Die hier zusätzlich benötigten Optionen Analog TV support und Digital TV support sollten aber leicht zu identifizieren sein.

<M> Multimedia support  --->
  [*]   Analog TV support
  [*]   Digital TV support
  [*]   Remote Controller support
  <M>   Compile Remote Controller keymap moduless (NEW)
  [*]   Media USB Adapters  --->
    <M>   Empia EM28xx USB devices support
    <M>     Empia EM28xx analog TV, video capture and/or webcam support
    <M>     Empia EM28xx ALSA audio module
    <M>     DVB/ATSC Support for em28xx based TV cards
    <M>     EM28XX Remote Controller support (NEW)
  [*]   Autoselect ancillary drivers (tuners, sensors, i2c, frontends) (NEW)

Die Unterstützung für die Fernbedienung (vorletzte Zeile) wird nur dann angeboten, wenn im übergeordneten Menü Remote Controller support ausgewählt wurde. Via <Exit> beendet man alle Untermenüs und bestätigt mit <Yes> das Speichern der config-Datei. Ist der sich anschließende Kompiliervorgang erfolgreich, wird das Paket wie üblich mit pacman installiert.

Vor dem Anschließen des DVB-Sticks sollte man aufgrund der o.g. Modulversionsproblematik bereits verwendete TV-/Videogeräte und die zugehörigen Module ggf. entfernen17. Natürlich kann der DockStar stattdessen auch einfach neu gebootet werden.

5.2 Firmware

Wenn der Kernel den DVB-Stick unterstützt oder wie oben beschrieben ein passender Treiber nachinstalliert wurde, sollte dmesg nach dem (erneuten) Anschließen ausführliche Informationen zu dem Stick liefern. Dabei achte man auf Hinweise betreffs fehlender Firmwaredateien:

drxk: Could not load firmware file dvb-usb-hauppauge-hvr930c-drxk.fw.
drxk: Copy dvb-usb-hauppauge-hvr930c-drxk.fw to your hotplug directory!

Eine Internetsuche nach dem Dateinamen führt dann entweder direkt zu einem Download der Firmware oder wie in diesem Fall zu einer Anleitung wie diese aus dem Windows-Treiber zu extrahieren ist, siehe Abschnitt 1) im o.g. Link. Die Datei legt man dann im Verzeichnis /usr/lib/firmware/ ab. Der HVR-930C benötigt eine weitere Firmwaredatei, angefordert wird diese laut dmesg aber erst beim Senderscan (s.u.).

xc5000: waiting for firmware upload (dvb-fe-xc5000-1.6.114.fw)...
xc5000: firmware read 12401 bytes.
xc5000: firmware uploading...
xc5000: firmware upload complete...

Diese Datei ist offensichtlich schon vorhanden, sie gehört zum Paket linux-firmware, das als Abhängigkeit des Kernelpakets bereits installiert sein sollte.

Hinweis: Ende 2014 gelang es mir nach einem Reboot unter Kernel 3.1.10 nicht mehr, den HVR-930C mit den v4l-dvb Treibern in Betrieb zu nehmen, die vorhandene Firmware dvb-usb-hauppauge-hvr930c-drxk.fw konnte nicht geladen werden (siehe Fehlermeldung oben). Deshalb bin ich nun auf linux-kirkwood umgestiegen, der Stick arbeitet damit jedoch nicht zuverlässig, gelegentlich ist ein Ent- und Neuladen der DVB-Treiber erforderlich, siehe Abschnitt 6.1.

5.3 Sendersuche

Hiesige TV-Sender lassen sich mit dvbv5-scan aus dem Paket linuxtv-dvb-apps ermitteln. Das Programm benötigt eine Datei mit den lokal gültigen Frequenzen (initial-tuning-data-file). Dazu kann man das Paket dtv-scan-tables-git aus dem AUR installieren oder die passende Datei einfach direkt aus dem Repository herunterladen.

Um einen Sendersuchlauf mit dem älteren Programm scan durchführen zu können, muss die benötigte Frequenztabelle zuvor mit dvb-format-convert aus dem Paket v4l-utils in das DVBv3-Format umgewandelt werden. Die folgenden Beispiele beziehen sich auf Kabelfernsehen (DVB-C)18.

[root@alarm ~]# dvb-format-convert -I dvbv5 -O channel /usr/share/dvb/dvb-c/de-Kabel_Deutschland-Hannover initial-tuning-data-file
[root@alarm ~]# scan -x 0 -t 1 initial-tuning-data-file > channels.conf

Eine Alternative ist w_scan, das ohne Frequenzdateien auskommt, im Vergleich zu scan aber ein Vielfaches der Zeit benötigt.

[root@alarm ~]# w_scan -fc -cDE -X -E0 -R0 -O0 > channels.conf

Die linuxtv-dvb-apps bieten eine primitive Möglichkeit zur Aufnahme von Sendungen, dazu wird zunächst mit czap (bzw. tzap oder szap) im Hintergrund (z.B. via screen) ein Sender eingestellt

[root@alarm ~]# czap -c channels.conf -r "Das Erste"

Der Sendername muss exakt dem Format in der channels.conf entsprechen. Den Datenstrom leitet man dann einfach in eine Datei (Abbruch mit Strg+C).

[root@alarm ~]# cat /dev/dvb/adapter0/dvr0 > recording.ts

Komfortabler geht es mit dem VDR, mehr dazu in Abschnitt 6.

5.4 Fernbedienung

Der im HVR-930C integrierte IR-Empfänger wird in /proc/bus/input/devices als Eingabegerät (HID) aufgeführt (Ausgabe gekürzt)19:

I: Bus=0003 Vendor=2040 Product=1605 Version=0001
N: Name="em28xx IR (em28xx #0)"
H: Handlers=kbd event0 

Folglich stehen die Chancen gut, dass sich die Fernbedienung mit dem devinput-Treiber von LIRC in Betrieb nehmen lässt. Das benötigte Paket lirc-utils deckt eine Vielzahl von Fernbedienungen ab und setzt deshalb weitere Pakete voraus, die eigentlich nicht benötigt werden. Zur Kompilierzeit lässt sich LIRC aber durchaus auf einen einzelnen Treiber beschränken. Ich habe das PKGBUILD aus dem ABS entsprechend angepasst.

Die passende Konfigurationsdatei /etc/lirc/lircd.conf ist in diesem Paket bereits integriert. Wer lirc-utils nutzt, muss sie hingegen noch an die richtige Stelle kopieren:

[root@alarm ~]# cp /usr/share/lirc/remotes/devinput/lircd.conf.devinput /etc/lirc/lircd.conf

Zur Konfiguration wird ferner das Device des IR-Empfängers benötigt, laut /proc/bus/input/devices ist dies /dev/input/event0, langfristig wird man aber einen von udev erzeugten, eindeutigen Link auf das Device nutzen wollen:

#/etc/udev/rules.d/99-lirc.rules
SUBSYSTEM=="input", ATTRS{idVendor}=="2040", ATTRS{idProduct}=="1605", SYMLINK="input/ir"

Mit udevadm trigger --subsystem-match=input wird udev veranlasst, die Datei nachträglich auszuwerten und den Symlink zu erzeugen. Damit Device und Treiber vom LIRC-Daemon berücksichtigt werden, muss die Servicedatei angepasst werden - eine separate Konfigurationsdatei gibt es zur Zeit nicht, siehe Bugreport.

#/etc/systemd/system/lirc.service.d/device.conf
[Service]
ExecStart=
ExecStart=/usr/bin/lircd --driver=devinput --device=/dev/input/ir

Ein Aufruf von systemctl daemon-reload macht die Änderung wirksam. Bei Verwendung von lirc-utils-devinput sind devinput als Treiber und /dev/input/event0 als Device voreingestellt. so dass sich diese Anpassung ggf. erübrigt.

Nach Start des LIRC-Daemons mit systemctl start lirc.service findet man mit irw die Tastencodes heraus20. In einer lircrc-Datei können sie bestimmten Aktionen zugeordnet werden21. Betreffs der Steuerung des VDR siehe Abschnitt 6.

[root@alarm ~]# irw
0000000080010074 00 KEY_POWER devinput 

Die Codes lassen sich auch - unabhängig von LIRC - mit evtest ermitteln. Im Gegensatz zu irw listet es zunächst sämtliche Codes auf, die der IR-Empfänger erzeugen kann. Beim HVR-930C sind dies mehr als die mitgelieferte Fernbedienung auszulösen vermag.

Einrichtung des VDR Inbetriebnahme des DVB-Sticks

  1. Das gilt nicht für das Nachfolgemodell HVR-930C-HD.

  2. Hier ein Beispiel für meinen Freecom-Stick (14aa:0222):

    [user@alarm media_build]$ grep -R -l -i 14aa | xargs grep -l 0222
    linux/drivers/media/dvb-core/dvb-usb-ids.h

    In der gefundenen Datei werden die IDs offenbar zunächst durch symbolische Namen ersetzt, wobei die Produkt-ID doppelt vergeben ist.

    [user@alarm media_build]$ grep -i -e 14aa -e 0222 linux/drivers/media/dvb-core/dvb-usb-ids.h
    #define USB_VID_WIDEVIEW                        0x14aa
    #define USB_PID_WT220U_COLD                             0x0222
    #define USB_PID_PCTV_450E                               0x0222
    

    Also wiederholen wir die vorherige Suche, nun aber mit diesen Namen.

    [user@alarm media_build]$ grep -R -l USB_VID_WIDEVIEW | xargs grep -l -e USB_PID_WT220U_COLD -e USB_PID_PCTV_450E
    linux/drivers/media/dvb-core/dvb-usb-ids.h
    linux/drivers/media/usb/dvb-usb/dtt200u.c

    In den Makefiles findet man über den Dateinamen (ohne Endung) dann die CONFIG-Variable.

    [user@alarm media_build]$ find -type f -name Makefile | xargs grep "CONFIG.*dtt200u"
    ./linux/drivers/media/usb/dvb-usb/Makefile:obj-$(CONFIG_DVB_USB_DTT200U) += dvb-usb-dtt200u.o
  3. Andernfalls finden sich via dmesg z.B. solche Fehlermeldungen:

    usb 1-1.4: USB disconnect, device number 8
    usb 1-1.4: new high speed USB device number 9 using orion-ehci
    v4l2_common: disagrees about version of symbol v4l2_subdev_init
    v4l2_common: Unknown symbol v4l2_subdev_init (err -22)
    v4l2_common: disagrees about version of symbol v4l2_device_register_subdev
    v4l2_common: Unknown symbol v4l2_device_register_subdev (err -22)
    v4l2_common: disagrees about version of symbol v4l2_ctrl_fill
    v4l2_common: Unknown symbol v4l2_ctrl_fill (err -22)
  4. Durch den Wegfall der Grundverschlüsselung sind seit 2013 erfreulicherweise auch private Sender zumindest in SD unproblematisch zu empfangen. Die Zahl der in HD ausgestrahlten öffentlich-rechtlichen Sender ist Anfang 2014 auf ca. 15 gestiegen.

  5. Fehlt ein solcher Eintrag wird eventuell das im Abschnitt 5.1 ausgewählte Modul em28xx-rc nicht automatisch geladen. Das holen wir einfach mit modprobe em28xx-rc nach und überprüfen ggf. das Resultat mit dmesg:

    Registered IR keymap rc-hauppauge
    input: em28xx IR (em28xx #0) as /devices/platform/orion-ehci.0/usb1/1-1/1-1.4/rc/rc0/input0
    rc0: em28xx IR (em28xx #0) as /devices/platform/orion-ehci.0/usb1/1-1/1-1.4/rc/rc0
    Em28xx: Initialized (Em28xx Input Extension) extension

    Um sich das manuelle Laden des Moduls künftig zu ersparen, kann man es in eine Datei /etc/modules-load.d/em28xx-rc.conf eintragen. Oder man sorgt dafür, dass es immer dann geladen wird, wenn em28xx angefordert wird.

    #/etc/modprobe.d/em28xx.conf
    install em28xx /sbin/modprobe --ignore-install em28xx $CMDLINE_OPTS ; /sbin/modprobe em28xx-rc 

    Speziell für diesen Zweck gibt es neuerdings auch das Kommando softdep, siehe man modprobe.d.

  6. Bleibt das Betätigen von Tasten auf der Fernbedienung wirkungslos, wurde evtl. bei der Konfiguration von v4l-dvb die Option Compile Remote Controller keymap modules nicht berücksichtigt. Die keycode/scancode-Tabelle muss dann mit ir-keytable aus dem Paket v4l-utils manuell zugeordent werden.

    [root@alarm ~]# ir-keytable 
    Found /sys/class/rc/rc0/ (/dev/input/event0) with:
            Driver em28xx, table rc-empty
            Supported protocols: NEC RC-5 RC-6 
            Enabled protocols: 
            Name: em28xx IR (em2884 #0)
            bus: 3, vendor/product: 2040:1605, version: 0x0001
            Repeat delay = 500 ms, repeat period = 125 ms
    [root@alarm ~]# ir-keytable -w /usr/lib/udev/rc_keymaps/hauppauge
    Read hauppauge table
    Wrote 172 keycode(s) to driver
    Protocols changed to RC-5
  7. Beispielsweise könnte der Power-Knopf genutzt werden, um via irexec einen anderen Rechner per Wake-on-LAN zu booten:

    #/etc/lirc/lircrc
    begin
    button = KEY_POWER
    prog   = irexec
    repeat = 0
    config = wol 00:11:22:33:44:55
    end