Aus Raspberry Pi Geek 05/2014

BeagleBone Black als Multimedia-Plattform (Seite 2)

Das Kernel-Modul tda998x implementiert sowohl den Audio-Codec-Treiber als auch den HDMI-Framer-Treiber. Die entsprechenden Quelltexte, tda998x_drv.c und tda998x_audio_drv.c, liegen im Verzeichnis drivers/drm/gpu/i2c der Kernel-Quellen. Der Audio-Codec nxptda – im Userspace taucht er als nxp-hdmi-hifi auf – stellt als Dummy-Treiber via /dev gerade genug Interface-Dateien bereit, dass Userspace-Programme darüber den Codec als ALSA-Gerät verwenden können.

Die entsprechenden Daten speist das ALSA-Gerät dann über den McASP-Treiber [3] (sound/soc/davinci/dacinci-mcasp.c) in den McASP0-Kanal als für den HDMI-Framer direkt verständliche Signale ein. Der Framer überarbeitet diese vor dem Versand gegebenenfalls noch einmal mittels eines internen Codecs.

Der HDMI-Framer-Treiber steuert über I2C direkt das Verhalten des TDA19988-HDMI-Framer-Chips. Er übermittelt dazu das genauer Format der Video- (Auflösung, Wiederholrate, etc.) und Audio-Daten (Sampling-Rate etc.) an den Chip. Daneben holt er auch den EDID-Block beim Display ab und bestimmt, wann der Framer-Chip das Übermitteln von Audio- und Video-Daten an das Display beginnt und beendet.

Konfiguration

Ein typisches Problem frischgebackener BeagleBone-Black-Besitzer stellt das Fehlen jeglicher Audio-Ausgabe beim Verwenden des HDMI-Anschlusses dar. Die Grafik funktioniert, aber die Anwendungen finden keine ALSA-Audiogerät. Woran liegt das?

Der Standard CEA-861 der Consumer Electronics Association definiert 64 Video-Modi, die den Transfer von Audio innerhalb des HDMI-Datenstroms erlauben. Die wichtigsten davon zeigt die Tabelle “Gängige CEA-Modi”. Solange Sie den Framebuffer nicht für einen dieser Modi konfigurieren, initialisiert sich der HDMI-Framer-Treiber nicht entsprechend und überträgt dann keinerlei Audio-Daten an das Display.

Gängige CEA-Modi

Auflösung

Wiederholrate

640×480

60 Hz

720×480

60 Hz

720×576

50 Hz

1280×720

50 / 60 Hz

1920×1080

50 / 60 Hz

In der Vorgabe verwendet das DRM-Subsystem des Kernels beim Initialisieren des Framebuffer-Treibers den höchstmöglichen CEA-Modus. Dazu prüft es zunächst das Vorliegen eines EDID-Blocks für das Display. Gibt es keinen, geht der Kernel von einer Auflösung von 1024 x 768 Pixeln bei 16 Bit Farbtiefe aus. Unglücklicherweise gibt es keinen entsprechenden CEA-Modus, weswegen die Lautsprecher stumm bleiben, falls beim Hochfahren des BeagleBone Black kein Display angeschlossenen war oder Sie ein Kabel verwenden, das die Übermittlung des EDID-Blocks verhindert.

Liegt ein EDID-Block vor, vergleicht der Kernel dessen Video-Modi mit jenen aus der Liste von CEA-Modi in der Datei drm_edid_modes.h und wählt denjenigen mit der höchsten Bildschirmauflösung für die Framebuffer-Initialisierung aus. Findet sich jedoch kein passender Modus, fällt wiederum die Audio-Übermittlung flach.

Im Zweifelsfall bietet es sich also an, manuell einen bestimmten Modus anzufordern, insbesondere beim Einsatz des BeagleBone Black als Multimedia-Appliance. Das gelingt über die Kommandozeilenoption des Kernels. Abbildung 3 zeigt die einzelnen Komponenten des dafür zuständigen Parameters video.

Abbildung 3: Die vier Komponenten der Kernel-Kommandozeilenoption »video«.

Abbildung 3: Die vier Komponenten der Kernel-Kommandozeilenoption »video«.

Für den HDMI-Output des BeagleBone Black ist der HDMI-A-1-Konnektor die richtige Adresse für Framebuffer-Daten. Als Nächstes folgen Auflösung und Wiederholrate des gewünschten Video-Modus. Bitte beachten Sie, dass es sich hier nur um eine Anforderung handelt. Selbst wenn das Display den gewünschten Modus problemlos darstellen kann – solange das Display keinen EDID-Block übermitteln kann, fällt der Framebuffer stets auf 1024 x 768 Pixel Auflösung zurück.

The U-Boot-Bootloader des BeagleBone Black hält die Kommandozeilenoptionen für den Kernel in der Datei uEnv.txt vor. Dessen konkreter Inhalt variiert je nach gewähltem Distributionsabbild, enthält aber immer die Umgebungsvariable optargs. Dieser fügen Sie die gewünschte video-Option hinzu.

Nehmen wir als Beispiel eine aktuelle Version von Angstrom Linux an, das der BeagleBone Black in seiner Onboard-eMMC mitbringt [4]. Fahren Sie den Mini-Rechner ohne Micro-SD-Karte (sodass er Angstrom bootet) und ohne am HDMI-Port angeschlossenes Display hoch. Nach dem Start melden Sie sich als root an und ermitteln via fbset die aktuelle Framebuffer-Auflösung.

Listing 1

 

root@beaglebone:~# fbset
mode 1024x768-0
endmode

Die Ausgabe aus Listing 1 zeigt die typische Standardauflösung von 1024 x 768 Pixeln. Schließen Sie nun einen Bildschirm an den HDMI-Port an und booten erneut, zeigt Fbset beim Aufruf die bestmögliche Auflösung an, die der Kernel aus den via EDID übermittelten Informationen entnehmen konnte.

Um jedes Mal in einen spezifischen Video-Modus zu booten, etwa den CEA-Modus mit 720 x 480 Pixeln und 60 Hz Wiederholrate, modifizieren Sie jetzt die Datei uEnv.txt. Weil Angstrom seine Boot-Partition nicht standardmäßig mountet, holen Sie dies zunächst von Hand nach.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben