Zeus Yocto release for i.MX8M MINI

Published on March 2, 2020

We are pleased to announce a new Yocto release Zeus for our Nitrogen8M Mini SBC based on the i.MX8M MINI processor. Below you will find the download link for the image as well as detailed instructions for the build including a features set.

For the Impatient

You can download the Yocto image from here:

As usual, you'll need to register on our site and agree to the EULA because it contains NXP content. The image is a SD card image that can be restored using zcat and dd under Linux.

~$ zcat *boundary-image*.wic.gz | sudo dd of=/dev/sdX bs=1M
In addition, you can use the etcher utility to flash the SD Card or USB stick via Windows or Linux: balena-etcher

Build procedure

This image uses the zeus branch of our boundary-bsp-platform repository. To build the image, we recommend using a Docker Container so that you can build with a repeatable 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-imx8m && cd yocto-imx6x
~/yocto-imx6x$ repo init -u https://github.com/boundarydevices/boundary-bsp-platform -b zeus
~/yocto-imx6x$ repo sync
Setup the environment for building, in this example we will be building our boundary-wayland distro for nitrogen6x.
~/yocto-imx6x$ MACHINE=nitrogen6x DISTRO=boundary-wayland . setup-environment build
Now bitbake boundary-image-multimedia-full which is equivalent to fsl-image-multimedia-full with Boundary-specific packages such as BD-SDMAC support
~/yocto-imx6x/build$ bitbake boundary-image-multimedia-full
After some time this should build the same image as above. The image file will deploy to tmp/deploy/images/{MACHINE}/boundary-image-multimedia-full-{MACHINE}.wic.gz.

Features list

The image built above contains the following components:

  • GPU Vivante libraries 6.2.4p4.0
  • VPU Hantro libraries v1.11.0
  • GStreamer1.0 1.14.4 for i.MX
  • Weston 5.0.0 for i.MX
  • qcacld-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.

Display support

Please make sure your platform includes the latest U-Boot for i.MX8M MINI:

This version of U-Boot supports the display configuration, allowing to use any of the following displays:

GPU acceleration

In order to test the GPU, you can either use the standard Weston EGL programs or the ones provided by Vivante. Here are a few examples:

root@nitrogen6x:~# weston-simple-egl &
root@nitrogen6x:~# cd /opt/viv_samples/vdk/
root@nitrogen6x:/opt/viv_samples/vdk# ./tutorial7

Nitrogen8M GPU

VPU decoding

The i.MX6x processor can decode videos with a resolution up to 1080p. Here is an example using GPlay tool:

root@nitrogen6x:~# wget http://linode.boundarydevices.com/videos/Hobbit-1080p.mov
root@nitrogen6x:~# gplay-1.0 --video-sink=glimagesink Hobbit-1080p.mov

VPU encoding

The i.MX6x processor can encode videos with a resolution up to 1080p. Here is an example using gstreamer:

root@nitrogen6x:~# gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! 'video/x-raw,format=(string)YUY2, width=1920, height=1080, framerate=30/1' ! vpuenc_h264 ! filesin
k location=test.h264
Setting pipeline to PAUSED ...
====== VPUENC: 4.4.5 build on Apr[   39.759990] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
  1 2020 21:23:34. ======
        wrapper: 3.0.0 (VPUWRAPPER_ARM64_LINUX Build on Mar 28 2020 08:53:37)
        vpulib: 1.1.1
        firmware: 1.1[   39.777613] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
.1.43690
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, [   40.518172] ov5640_mipisubdev 5-003c: s_stream: 1
pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709, interlace-mode=(string)progressive
/GstPipeline:pipeline0/vpuenc_h264:vpuenc_h264-0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709, interlace-mode=(string)progressive
[   40.620867] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
[   40.629361] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
[   40.635818] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
[   40.643804] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
[   40.649791] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
[   40.657768] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
[   40.663741] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
/GstPipeline:pipeline0/vpuenc_h264:vpuenc_h264-0.GstPad:src: caps = video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)bt709
/GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)bt709
^Chandling interrupt.
Interrupt: Stopping pipeline ...
EOS on shutdown enabled -- Forcing EOS on the pipeline
Waiting [   69.642199] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
for EOS...
Got EOS from element [   69.650922] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
"pipeline0".
EOS received - stop[   69.662880] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
ping pipeline...
Execution ended[   69.669822] ov5640_mipisubdev 5-003c: s_stream: 0
 after 0:00:29.580964436
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

root@nitrogen6x:~# ls -alh
drwx------    3 root     root        4.0K Apr  1 22:59 .
drwxr-xr-x    3 root     root        4.0K Apr  1 21:25 ..
-rw-------    1 root     root        4.9K Apr  1 23:00 .ash_history
drwxr-xr-x    3 root     root        4.0K Apr  1 22:08 .cache
-rw-r--r--    1 root     root       34.6M Apr  1 22:59 test.h264

root@nitrogen6x:~# gst-launch-1.0 filesrc location=test.h264 typefind=true ! 'video/x-h264' ! h264parse ! vpudec ! glimagesink sync=true
Setting pipeline to PAUSED ...
====== VPUDEC: 4.4.5 build on Apr[   79.404937] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
  1 2020 21:23:34. ======
        wrapper: 3.0.0 (VPUWRAPPER_ARM64_LINUX Build on Mar 28 2020 08:53:37)
        vpulib: 1.1.1
        firmware: 1.1[   79.424233] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
.1.0
Pipeline is PREROLLING ...
Got context from element 'sink': gst.gl.GLDisplay=context, gst.gl.GLDisplay=(GstGLDisplay)"\(G[   79.443039] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
stGLDisplayWayland\)\ gldisplaywayland0";
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:29.[  108.609182] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
034084646
Setting pipeline to PA[  108.617333] check_voltage: voltage=855000 900000 950000 freq=650000000 VPUMIX_PD
USED ...
Setting pipeline to REA[  108.629178] imx_gpc_pd_power_off: voltage=850000 VPUMIX_PD
DY ...
Setting pipeline to NULL ...
Total showed frames (857), playing for (0:00:29.034898533), fps (29.516).
Freeing pipeline ...
root@nitrogen6x:~#

Camera input

Camera MIPI-CSI input can be checked using our OV5640 MIPI with GStreamer:

root@nitrogen6x:~# gst-launch-1.0 v4l2src device=/dev/video0 ! \
    video/x-raw,width=1280,height=720 ! glimagesink

nitrogen8m-camera

Ethernet

Once the eth0 interface is up, you can use iperf3 to check Ethernet performances:

root@nitrogen6x:~# iperf3 -c 192.168.1.60                                                                                                                         
Connecting to host 192.168.1.60, port 5201
[  5] local 192.168.1.13 port 32880 connected to 192.168.1.60 port 5201
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1.09 GBytes   938 Mbits/sec    0             sender
[  5]   0.00-10.04  sec  1.09 GBytes   932 Mbits/sec                  receiver

Wi-Fi

Same goes for the Wi-Fi that can be tested just as easily:

root@nitrogen6x:~# nmcli d wifi connect <network_name> password <password>
root@nitrogen6x:~# iw wlan0 link
Connected to a4:3e:51:08:54:f6 (on wlan0)
        SSID: Jabu_5GHz
        freq: 5240
        RX: 3243 bytes (31 packets)
        TX: 9117 bytes (48 packets)
        signal: -79 dBm
        tx bitrate: 15.0 MBit/s MCS 0 40MHz short GI
root@nitrogen6x:~# ping google.com -Iwlan0                                                                                                                       
PING google.com (216.58.198.206): 56 data bytes
64 bytes from 216.58.198.206: seq=0 ttl=55 time=3.470 ms
...

Bluetooth

For products with a Silex bluetooth module, you'll be able to connect using our handy silex-uart script with the following commands:

root@nitrogen6x:~# /usr/share/silex-uart/silex-uart.sh start
Starting silex-uart
rfkill on/off cycle.
silex found
root@nitrogen6x:~# hciconfig hci0 up
root@nitrogen6x:~# hcitool scan
Scanning ...
11:22:DE:AD:BE:EF    Some Device

CAN

CAN is supported on the Nitrogen8M Mini when using our DB_6x_CSI_EXP . You'll be able to bring up the interface using these commands:
root@nitrogen6x:~# ip link set can0 up type can bitrate 500000
root@nitrogen6x:~# ifconfig can0 up

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 support@boundarydevices.com