For a while now, we have tried to get PELUX with the Qt Automotive Suite onto a Raspberry Pi 3, to be able to show the same flavours of PELUX on both the Intel NUC and the Pi. After some hacking - it turns out it wasn’t all that hard.

Starting out

First, we just set MACHINE to “raspberrypi3” and built our PELUX image in Yocto. We had one issue in that the graphics stack on the Pi doesn’t support GBM when we use the broadcom proprietary drivers. This meant we had disable GBM when building Qt. After that - everything built super fine, the Pi booted fine, but QtApplicationManager would just hang and we got no graphics output.

Our Munich office contains the maintainers for QtApplicationManager, so after getting some help from them, we were able to run everything. However, this was only in single-process mode. As it turns out, QtWayland wasn’t working as nicely as we thought.

Wayland

Wayland is a display protocol. Think of it as X11, but much better. QtApplicationManager serves as a Wayland compositor, which means that when we run apps inside the UI that is run with QtApplicationManager, these apps are actual processes that render on their own. The results are then composited by QtApplicationManager, so that the app is only shown when in focus, it can only be rendered in its own area, and so on.

We need Wayland (and specifically, QtWayland) support to handle this properly.

Building QtWayland

It may sound like something obvious, but QtWayland has to be compiled with specific support for the Raspberry Pi graphics drivers. For most things, the recipes in Yocto would handle this, but the QtWayland recipe did not. Simply adding an option to the recipe solved the issue and we could see that we got the right drivers deployed on target. But we still got no graphics output!

Starting Neptune UI

Neptune UI is the reference UI for Qt Automotive Suite, and is run with the QtApplicationManager to leverage the power of Wayland compositing and apps. It seemed however, that when we started QtApplicationManager, the system chose the wrong Wayland driver for us, since we had more than one driver deployed on our target (I think it was the general wayland-egl driver), so we had to set QT_HARDWARE_INTEGRATION=brcm in our environment to make it choose the Broadcom driver.

Video memory

Voilá, Neptune booted and showed - but we quickly ran out of video memory, since the default setting for GPU memory on the Pi is 64MB. This was easy to fix in the config.txt file in the /boot partition, and a setting of 512MB to GPU, leaving another 512MB to the CPU, did the trick. In the end, we got a smoothly running Neptune UI in the QtApplicationManager on the Raspberry Pi 3. Success!

Future work

We now have PELUX + QtAuto on the Pi with the Broadcom drivers. However, there has been lots of development of open source drivers for the Pi graphics chip. The Yocto support for this also requires one to set the Pi in 64-bit mode, so an interesting continuation of this would be to do the same with the OSS driver!