Heute: Pengutronix e. K.

In unserem neuen Presseformat Blog geben wir unseren Sponsoren die Gelegenheit, ihre Arbeit im Open-Source-Bereich selbst vorzustellen.

Unser Open-Source-Projekt: Der Linux Kernel

Das Open-Source-Projekt, das uns bei Pengutronix wirklich am Herzen liegt, ist der Linux Kernel. Unsere Kunden sind Hersteller von Embedded-Geräten, also Geräten, die aus einem Hardware-Anteil und einem Software-Anteil bestehen. Damit dieses Zusammenspiel immer so fluffig und performant wie möglich ist, bedarf es so richtig guter Gerätetreiber. Ein aktuelles Beispiel für einen solchen Treiber ist der frisch von unserem Kollegen Michael Tretter in den Linux-Hauptzweig eingebrachte ZynqMP VCU-Treiber, der Videokompression auf einigen Xilinx-Prozessoren besonders flott und fluffig macht.

Die Aufgabe

Einige unserer Kunden stellen Geräte her, in denen Videostreams eine zentrale Rolle spielen. Bei solchen Videostreams müssen viele Daten von A (zum Beispiel einer Kamera) nach B (zum Beispiel ein Kontrollmonitor) bewegt werden, und wenn A und B z. B. durch ein Netzwerk oder sogar das Internet voneinander getrennt sind, geht das nicht ohne Kompression. Den Prozess der Komprimierung bezeichnet man auch als Videoencoding und eine entsprechende Einheit auch als Encoder. Gängige Video-Kompressionsformate zum Streaming oder Abspeichern von Videos sind z. B. H.264 oder H.265.

Videoencoding ist ein sehr rechenaufwändiger Prozess. Wenn es um Videostreams in HD-Qualität oder sogar noch größerer Auflösung geht, ist das Encoding gar nicht mehr auf den kleinen Embedded-CPUs zu leisten. Deshalb sind Videoencoder oftmals nicht in Software, sondern als dedizierte Hardwareeinheiten auf dem Chip implementiert.

Einer unserer Kunden setzt eine Hardwareplattform auf Basis eines Xilinx ZynqMP ein, die eine VCU Videoencoder-Einheit enthält. Eine Besonderheit dieser Xilinx-Hardwareplattform, und der Grund, aus dem sie für dieses Design ausgewählt wurde, ist, dass auf demselben Chip wie die CPU auch eine große Menge programmierbarer Logikgatter verfügbar ist, ein sogenannter FPGA. Da die Auswahl der Hardwareplattform somit festgelegt war, wurde Pengutronix beauftragt, einen Hardwaretreiber für die VCU-Einheit zu schreiben und so weit zu polieren, dass sie in den Mainline-Kernel aufgenommen werden konnte.

Mainline- und Downstream-Kernel

Für viele Hardware-Komponenten gibt es von den Herstellern bereits Treiber. Ein verbreitetes Vorgehen bei der Entwicklung dieser Treiber ist es, dass die Hardware-Hersteller eine Abspaltung des öffentlichen Linux-Kernels erstellen und daran alle nötigen Änderungen vornehmen. Bei diesen abgespalteten Kerneln spricht man von Downstream-Kerneln, weil der Code bisher nur von der Quelle (dem Linux-Hauptzweig) weg geflossen ist. Der zweite Schritt, das "Mainlining" oder "Upstreaming" der Änderungen, also das zurückführen in den Haupt-Entwicklungszweig, bleibt leider oft aus. Als Folge dessen verbleiben diese Downstream-Kernel oftmals, wenn sie nach einigen Jahren für die Hersteller uninteressant geworden sind, da durch neuere Geräte mehr Einnahmen erzeugt werden können, auf sehr alten Softwareversionen und sind auch nicht mehr leicht zu aktualisieren.

Für unsere Industriekunden, die Geräte über viele Jahre im Feld aktuell halten wollen, ist das ein großes Problem. Deshalb setzt Pengutronix sich das Ziel: "Mainline first" und bringt neue Treiber wann immer möglich in den Linux Mainline-Zweig ein.

Der VCU-Treiber

Zur Entwicklung des VCU-Mainline-Treibers hat Michael natürlich zuerst die öffentlichen Informationen, wie die ausführliche Dokumentation von Xilinx und eine verfügbare Beispiel-Implementierung, gelesen. Damit war die Arbeit allerdings noch nicht getan, da die VCU über die dokumentierten Schnittstellen hinaus auch nicht dokumentierte Schnittstellen besitzt. Um auch diese korrekt anzusprechen, bedurfte es dann etwas Reverse-Engineering.

Dafür hat Michael ein System so vorbereitet, dass es ausführliche Log-Ausgaben der über diese Schnittstelle zur VCU ausgetauschten Daten anlegt. Anschließend hat er dieses System solange mit verschiedenen Eingabewerten gefüttert, bis er sich sicher war, die Schnittstelle verstanden zu haben und sie in seinem eigenen Treiber korrekt ansprechen zu können. Von der Implementierung über das Testen hat dieser Prozess etwa 3 bis 4 Monate gedauert.

Blick auf die VCU-Einheit des Xilinx ZynqMP in unserem Lab
Blick auf die VCU-Einheit des Xilinx ZynqMP in unserem Lab

Über die Details der Implementierung hat Michael auf der FOSDEM einen Vortrag gehalten.

Am 9. Januar 2019 hat Michael dann eine erste Patch-Serie an die Mailingliste des Linux-Kernels geschickt (media und devicetree-Subsystem) und um Feedback gebeten. Für den Kernel gibt es sehr hohe Qualitätsstandards und Anforderungen an die APIs. Das ist auch einer der Gründe, aus denen sich Hardware-Hersteller oft den Mehraufwand des Mainlinings sparen. Die Linux-API des Treibers, den Michael für den Linux Mainline-Kernel geschrieben hat, musste nun an genau diese Qualitätsstandards angepasst werden, und schließlich ist der Treiber von Linus Torvalds in den Mainline Linux Kernel v5.12 gemerged und im April 2021 veröffentlicht worden.

Seitdem kann der Treiber von allen verwendet werden und bleibt durch das Mainlining automatisch immer mit den aktuellsten Versionen des Kernels kompatibel.

Treiber sind für keinen unserer Kunden ein Alleinstellungsmerkmal, sondern Dinge, die einfach funktionieren sollen. Durch das Upstreamen von Treibern, wie den beschriebenen, und das Verwenden eines aktuellen Linux-Kernels werden die Kosten geteilt.