Offene Grafik für eingebettete Systeme · bezeichnet einen elektronischen Rechner oder auch...
Transcript of Offene Grafik für eingebettete Systeme · bezeichnet einen elektronischen Rechner oder auch...
Seite 1 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Offene Grafik für eingebettete Systeme
Michael Tretter
12. März 2017
Chemnitzer Linux-Tage 2017
Seite 2 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Inhalt
● Wofür brauche ich Grafik bei eingebetteten Systemen?
● Wieso möchte ich Open Source Treiber dafür verwenden?
● Woher bekomme ich Open Source Treiber?
● Wie kann ich damit etwas sinnvolles bauen?
Seite 3 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Was ist ein eingebettetes System?
„Der Ausdruck eingebettetes System (auch englisch embedded system) bezeichnet einen elektronischen Rechner oder auch Computer, der in einen technischen Kontext eingebunden (eingebettet) ist. [...]
Eingebettete Systeme verrichten – weitestgehend unsichtbar für den Benutzer – den Dienst in einer Vielzahl von Anwendungsbereichen und Geräten, beispielsweise in Geräten der Medizintechnik, Waschmaschinen, Flugzeugen, Kraftfahrzeugen, Kühlschränken, Fernsehern, DVD-Playern, Set-Top-Boxen, Routern, Mobiltelefonen oder allgemein in Geräten der Unterhaltungselektronik. […]“
Wikipedia (https://de.wikipedia.org/wiki/Eingebettetes_System)
Seite 4 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Beispiele 1: Automobil-Entertainment
By Catecardvd - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=32985304
Seite 5 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Beispiel 2: Interaktive Informationstafeln
By LG 전자 - 세계 명화가 LG 스마트 TV 속으로 , CC BY 2.0, https://commons.wikimedia.org/w/index.php?curid=17450806
Seite 6 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Beispiel 3: Eigenbau-Videoplayer
Seite 7 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
System on a Chip (SoC)?
Seite 8 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Besonderheiten bei eingebetteter Grafik
● Einzelne Anwendung auf dem Display
● Grafik nur (unwichtiger) Teilaspekt des Produkts
● Möglicherweise hohe Stückzahl und lange Lebensdauer
● Möglicherweise Echtzeit-Anforderungen
● Eingeschränkte Hardware-Ressourcen
● GPU und Display Controller getrennt
● Unterschiedliche Hersteller für Board, SoC und GPU
Seite 9 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Grafik-Hardware: IP-Cores
● Broadcom VideoCore IV (BCM2835, Raspberry Pi)
● ARM Mali (Samsung Exynos, Galaxy S6)
● Qualcomm Adreno (Snapdragon, Google Pixel)
● Imagination Technologies PowerVR (Renesas R-Car, iPhone)
● Vivante Vega (Freescale i.MX, Samsung Galaxy Tab 4)
Seite 10 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Übliches Paket vom Chip-Hersteller
● Hardware-Lieferant liefert Board und Board Support Package
● Linux-Userland mit Binärtreibern
● Gepatchter Linux-Kernel
● Üblicherweise als Yocto, Debian, buildroot, ...
Board/SoCBoard/SoC
Linux-KernelLinux-Kernel
UserlandUserland
Kernel-TreiberKernel-Treiber
AnwendungAnwendung
BinärtreiberBinärtreiber
GrafikGrafikIP-CoreIP-Core
Seite 11 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Probleme mit Binärtreibern
● Debugging und Tracing von Problemen ist schwer bis unmöglich
● Anpassung und Optimierung für Anwendungsfall unmöglich
● Software bei Produktveröffentlichung schon veraltet
● Wartungsprobleme wegen Abhängigkeit von Kernelversion und Treiber
● Selbstständige Softwareupdates ohne Herstellersupport unmöglich
● Ende des Supports der Hardware führt zu Stillstand bei der Software
Seite 12 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Projekte für quell-offene Treiber
● Mali Lima→
● Adreno Freedreno→
● Vivante etnaviv→
● vc4 (veröffentlicht von Broadcom)
● PowerVR ???→
Seite 13 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Hintergrund: etnaviv
● Open Source Treiber für Vivante GPU
● Mehrere Jahre Reverse-Engineering- und Entwicklungszeit
● Upstream: Mesa (>= 17.0.0), Kernel (>= 4.9) und libdrm (>= 2.4.71)
● Unterstützt Qt, X und Wayland
Seite 14 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
UserlandUserland
HardwareHardware
KernelKernel
Linux Grafikstack
GC 3000GC 3000 IPU/DisplayIPU/Display
imx-drmimx-drmetnavivetnaviv
mesamesa
AnwendungAnwendung
libdrmlibdrm
Seite 15 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Mesa
● Open Source Implementierung von OpenGL, EGL, OpenVG, ...
● Beinhaltet verschiedene Hardware- und Software-Treiber
● Auch auf Desktop-Systemen verwendet
Seite 16 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
winsyswinsys
pipe driverpipe driver
state-trackerstate-tracker
etnaviv und Mesa
mesa-stmesa-st dri2dri2
etnavivetnaviv
winsyswinsysimx-drmimx-drm
winsyswinsysetnavivetnaviv
AnwendungAnwendung
KernelKernel
Seite 17 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Verschnaufpause
● Was kann ich denn jetzt praktisch anfangen?
● Mach mal ein Beispiel, wie das benutzt wird!
Seite 18 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Features
● Interaktive Benutzeroberfläche
● Video-Vorschau
● Vollbild-Wiedergabe
● OpenGL-Beschleunigung
Seite 19 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
NXP/Freescale i.MX6
● ARM Cortex A9
● Vivante GC2000/GC3000
● Chips&Media Coda 960
● Image Processing Unit
● Kameraeingänge
● Nitrogen
● HummingBoard
● Wandboard
Seite 20 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
i.MX6i.MX6
Systemarchitektur
H264H264VideoVideo
VideoVideoDecodingDecoding GUIGUI
Chips&MediaChips&MediaCoda 960Coda 960
VivanteVivanteGC 3000GC 3000
DriverDriver OpenGLOpenGLDriverDriver
DisplayDisplay
Seite 21 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Benutzeroberfläche: QML
● Deklarative Sprache um Benutzeroberflächen zu spezifizieren und programmieren
● QML benutzt OpenGL
● 150 Zeilen QML für die Beispielanwendung
● 200 Zeilen C++ um die Video-Pipeline zu steuern
Seite 22 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
QML BeispielcodeComponent { id: videoDelegate Item { id: cell width: GridView.view.cellWidth height: GridView.view.cellHeight z: video.width > width ? 1 : 0 VideoOutput { id: video source: gstsink state: "default" MouseArea { anchors.fill: parent onClicked: {self.toggleCurrent(video)} } states: [ State { name: "default" ParentChange {target: video; parent: cell x: 10; y: 10; width: cell.width – 20; height: cell.height - 20} }, State { name: "fullscreen" ParentChange {target: video; parent: self x: 0; y: 0; width: self.width; height: self.height} } ] transitions: Transition { ParentAnimation { NumberAnimation { properties: "x,y,width,height"; duration: self.anim } } } } GSTSink { id: gstsink } GSTPipeline { sink: gstsink; file: fileName; customPipeline: pipeline } }}
Seite 23 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Video Pipeline: Gstreamer
● Framework zur Verarbeitung von Multimedia-Datenströmen
filesrcfilesrc <h264dec><h264dec> gst-video-itemgst-video-item
● Zero-copy von Gstreamer nach QML durch gst-video-item
● Pipeline kann automatisch von playbin erzeugt werden
● Beispielanwendung verwendet einfach den Dateinamen
Seite 24 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Video Decoding: CODA
● i.MX6 verfügt über Chips&Media Coda 960 (VPU)
● Linux-Treiber im mainline Kernel (VIDEO_CODA)
● V4L2 mem2mem device /dev/videoX→
● Gstreamer-Element: v4l2videoXdec
● Coda benötigt Firmware Immer noch closed source→
Seite 25 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Gesamtsystem
i.MX6i.MX6
H264H264VideoVideo
Chips&MediaChips&MediaCoda 960Coda 960
VivanteVivanteGC 3000GC 3000
V4L2V4L2CODACODA
mesamesaetnavivetnaviv
DisplayDisplay
Seite 26 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Demo
Seite 27 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Zusammenfassung
● Eingebettete Systeme mit Grafik
● Probleme für Wartung und Entwicklung durch Binärtreiber
● Projekte zur Entwicklung von Open Source SoC-Grafiktreibern
● etnaviv: Reverse-Engineered Treiber für Vivante GPUs
● Beispielsystem: Video-Wiedergabe mit QML und Gstreamer
Seite 28 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Jobs bei Pengutronix
● Grafikentwickler gesucht
● http://www.pengutronix.de/jobs
Seite 29 - © Pengutronix - http://www.pengutronix.de – 12. März 2017
Danke für eure Aufmerksamkeit
● QML - https://www.qt.io/qt-quick
● mesa - http://www.mesa3d.org
● GStreamer - https://gstreamer.freedesktop.org
● Etnaviv - https://github.com/etnaviv/etna_viv