Yocto Dunfell Release for i.MX8 Platforms

Published on July 28, 2020

We are pleased to announce a new Yocto release Dunfell for our Nitrogen8 family of SBCs and SOMs based on i.MX8 processors. This release includes our latest 5.4 kernel. Below you will find download links for the images as well as detailed instructions for building including a features set.

For the Impatient

You can download the Yocto images from here: Update 20200829 changelog:
  • Various updates to Uboot
Update 20201102 changelog:
  • Updated kernel to version 5.4.70
  • Added some useful tools to boundary-image-multimedia-full
As usual, you'll need to register on our site and agree to the EULA because it contains NXP content.

How to Burn

You can program the SW to eMMC using the instructions below: programming-emmc-on-i-mx-platforms You can also program the SW to SD Card or USB Stick via zcat and dd under Linux: ~$ zcat *boundary-image*.wic.gz | sudo dd of=/dev/sdX bs=1M In addition, you can use the balenaEtcher utility to flash the eMMC, SD Card or USB stick via Windows or Linux: balenaEtcher

Build procedure

This image uses the dunfell 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-dunfell && cd yocto-dunfell ~/yocto-dunfell$ repo init -u https://github.com/boundarydevices/boundary-bsp-platform -b dunfell ~/yocto-dunfell$ repo sync Next, setup the environment for building. For this image we will be building our boundary-wayland distro for the target machine ~/yocto-dunfell$ MACHINE=<MACHINE> DISTRO=boundary-wayland . setup-environment build Now bitbake boundary-image-multimedia-full which is equivalent to fsl-image-multimedia-full with Boundary-specific packages added such as BD-SDMAC support. ~/yocto-dunfell/build$ bitbake boundary-image-multimedia-full After some time this should build the same image as above, with the layers being at commits as per the time when repo sync was executed. If you are interested in each project revision at the time of the build, you can find a frozen manifest for those images here. 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:
  • Weston 8.0.0 for i.MX
  • GStreamer1.0 1.16 for i.MX
  • GPU Vivante libraries 6.4.0p2.0
  • VPU Hantro libraries v1.16.0
  • qcacld-lea-2.0 Wi-Fi driver for BD-SDMAC
  • BlueZ 5.54 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: 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@<MACHINE>:~# weston-simple-egl & root@<MACHINE>:~# cd /opt/viv_samples/vdk/ root@<MACHINE>:/opt/viv_samples/vdk# ./tutorial7

Nitrogen8M GPU

Camera input

Camera MIPI-CSI input can be checked using our OV5640 MIPI with GStreamer: root@<MACHINE>:~# gst-launch-1.0 v4l2src device=/dev/video0 ! \ video/x-raw,width=1280,height=720 ! waylandsink

nitrogen8m-camera

Ethernet

Once the eth0 interface is up, you can use iperf3 to check Ethernet performances: root@<MACHINE>:~# 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@<MACHINE>:~# nmcli d wifi connect <network_name> password <password> root@<MACHINE>:~# 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@<MACHINE>:~# 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@<MACHINE>:~# /usr/share/silex-uart/silex-uart.sh start Starting silex-uart rfkill on/off cycle. silex found root@<MACHINE>:~# hciconfig hci0 up root@<MACHINE>:~# hcitool scan Scanning ... 11:22:DE:AD:BE:EF    Some Device

VPU decoding

If your platform supports VPU decoding, here is an example on how to test it using the gplay tool: root@<MACHINE>:~# wget http://linode.boundarydevices.com/videos/Hobbit-1080p.mov root@<MACHINE>:~# gst-launch-1.0 playbin uri=file:///home/root/Hobbit-1080p.mov video-sink=autovideosink

VPU encoding

If your platform supports VPU encoding, here is an example on how to test it using gstreamer: root@<MACHINE>:~# 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@<MACHINE>:~# 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@<MACHINE>:~# gst-launch-1.0 filesrc location=test.h264 typefind=true ! 'video/x-h264' ! h264parse ! vpudec ! waylandsink 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@<MACHINE>:~#

CAN

CAN is supported when using our DB_8MM_CSI_EXP . You'll be able to bring up the interface using this following command: root@<MACHINE>:~# ip link set can0 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 support@boundarydevices.com