Nitrogen8MP Yocto Zeus release

Published on December 22, 2020

We are pleased to release a Yocto Zeus image for our Nitrogen8MP SOM! This release is based upon NXP Beta 2 5.4.47_2.2.0 release.

For the Impatient

You can download the Yocto image for Nitrogen8MP here: You can program the SW to eMMC using the instructions below: You can also program the SW to SD Card or USB Stick via zcat and dd under Linux: ~$ zcat *nitrogen8mp.wic.gz | sudo dd of=/dev/sdX bs=1M In addition, you can use the Balena Etcher utility to flash the eMMC, SD Card or USB stick via Windows or Linux:

Why Zeus?

If you're familiar with our previous releases, you might have noticed we already released Dunfell for our other platforms, which is newer than Zeus. The reasoning is that we usually use the community BSP which offers newer branches support, more bugfixes and so on. However the community BSP doesn't include all the components to fully leverage the i.MX 8M Plus yet (NPU, ISP, DSP etc). That is why we released this version of Yocto based on NXP's version.

We will however continue to work closely with the community to integrate the missing packages and offer a Gatesgarth branch soon!

Build procedure

This image uses the Zeus boundary-imx-5.4.47-2.2.0 branch of our boundary-bsp-platform repository. To build the image, we recommend using a Docker Container so that you can build with a reproducible and stable build environment. Otherwise, you’ll need these packages installed as well as this repo tool that can be installed like this: ~$ sudo apt-get install repo Then create your build directory and initialize everything. ~$ mkdir ~/yocto-8mp && cd yocto-8mp ~/yocto-8mp$ repo init -u \ -b boundary-imx-5.4.47-2.2.0 ~/yocto-8mp$ repo sync Next, setup the environment for building: ~/yocto-8mp$ DISTRO=fsl-imx-xwayland-boundary MACHINE=nitrogen8mp \ source -b build Now bitbake imx-image-full which includes Boundary-specific packages such as BD-SDMAC drivers and firmware. ~/yocto-8mp/build$ bitbake imx-image-full The image file will deploy to tmp/deploy/images/nitrogen8mp/imx-image-full-nitrogen8mp.wic.gz.

Features list

The image built above contains the following components:
  • Linux kernel 5.4.x_2.2.0
  • U-Boot 2020.10
  • Weston 8.0.0 for i.MX
  • GStreamer 1.16.2 for i.MX
  • GPU Vivante libraries 6.4.3p0.0
  • VPU Hantro libraries v1.19.0
  • ISP VVCAM v4.2.2.2
  • Qt 5.15
  • qcacld-lea-2.0 Wi-Fi driver for BD-SDMAC
  • BlueZ 5.50 with support for BD-SDMAC
The next sub-sections will describe how to test most features.

Basler camera input

This build fully supports the Basler daA3840 8MP camera from Basler which is part of our Evaluation Kit: The isp-vvcam driver and imx8-isp service are loaded automatically when the camera is detected. From there a simple GStreamer pipeline will allow you to see the stream: root@nitrogen8mp:~# gst-launch-1.0 -v v4l2src device=/dev/video0 ! waylandsink ... [ 352.348796] wdr3 res: 1920 1080 [ 352.352471] enter isp_mi_start [ 357.581179] ###### 62.42 fps ###### [ 362.771924] ###### 62.42 fps ######

eIQ / NPU support

NPU support is fully integrated into this build with TensorFlowLite and ARMNN support of the NPU. We recommend newcomers try the PyEIQ framework which provides many examples to test the Neural Processing Unit: Installing eIQ is very simple as you can see below: root@nitrogen8mp:~# pip3 install eiq You can then run any demo listed below root@nitrogen8mp:~# pyeiq --run object_detection_tflite root@nitrogen8mp:~# pyeiq --run switch_video

GPU acceleration

As usual, in order to test the GPU you can use the example apps provided by Vivante: root@nitrogen8mp:~# /opt/imx-gpu-sdk/GLES2/Blur/GLES2.Blur_Wayland -d


Once the eth0 or eth1 interface is up, you can use iperf3 to check Ethernet performance: root@nitrogen8mp:~# iperf3 -c Connecting to host, port 5201 [ 5] local port 48554 connected to port 5201 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 1.10 GBytes 943 Mbits/sec 0 sender [ 5] 0.00-10.00 sec 1.10 GBytes 941 Mbits/sec receiver


Same goes for the Wi-Fi that can be tested just as easily with connman: root@nitrogen8mp:~# connmanctl connmanctl> enable wifi Enabled wifi connmanctl> agent on Agent registered connmanctl> scan wifi Scan completed for wifi connmanctl> services *AO Wired ethernet_0019b80891ba_cable Jabu_5GHz wifi_e24f43c97518_4a6162755f3547487a_managed_psk Jabu_5GHz wifi_e04f43447518_4a6162755f3547487a_managed_psk connmanctl> connect wifi_e04f43447518_4a6162755f3547487a_managed_psk Agent RequestInput wifi_e04f43447518_4a6162755f3547487a_managed_psk Passphrase = [ Type=psk, Requirement=mandatory, Alternates=[ WPS ] ] WPS = [ Type=wpspin, Requirement=alternate ] Passphrase? XXXXXXX connmanctl> [ 1345.330332] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready Connected wifi_e04f43447518_4a6162755f3547487a_managed_psk connmanctl> exit root@nitrogen8mp:~# ping -I wlan0 PING (2a00:1450:4007:80a::200e)) from 2a01:cb00:f9f:e00:e24f:43ff:fe44:7518 wlan0: 56 data bytes 64 bytes from (2a00:1450:4007:80a::200e): icmp_seq=1 ttl=115 time=9.12 ms 64 bytes from (2a00:1450:4007:80a::200e): icmp_seq=2 ttl=115 time=9.32 ms ...


Here is the procedure to get BT5.0 working with our BD-SDMAC module: root@nitrogen8mp:~# connmanctl enable bluetooth Enabled bluetooth root@nitrogen8mp:~# hciattach -t 30 /dev/ttymxc0 qca 3000000 ... Device setup complete root@nitrogen8mp:~# hciconfig hci0 up root@nitrogen8mp:~# hcitool scan Scanning ... 94:E6:F7:F3:17:F3 p1g2

VPU decoding

If your platform supports VPU decoding, here is an example on how to test it using the gplay tool: root@nitrogen8mp:~# wget root@nitrogen8mp:~# gplay-1.0

VPU encoding

Here is a simple example that shows how to encode a video stream from the camera into H.264 using the VPU encoder: root@nitrogen8mp:~# gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! 'video/x-raw,width=1920,height=1080' \ ! vpuenc_h264 ! filesink location=test.h264 ^C root@nitrogen8mp:~# gst-launch-1.0 filesrc location=test.h264 typefind=true ! 'video/x-h264' ! \ h264parse ! vpudec ! waylandsink


The Nitrogen8MP platform comes with 2 CAN ports. You'll be able to bring up the interfaces using this following command: root@nitrogen8mp:~# ip link set can0 up type can bitrate 500000 root@nitrogen8mp:~# ip link set can1 up type can bitrate 500000
From this point, you can use commands such as cansend and candump to send or display messages on the bus respectively.   If you have any issues, please email