November 19, 2018

Yocto release for i.MX 8MQ

YoctoWe’ve received many requests for Yocto support on our Nitrogen8M SBC. Although this Yocto release isn’t tied to a specific version (Thud 2.6 not released yet), we believe it is still beneficial to release details on building a Yocto image for NXP’s i.MX 8MQ application 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

For Windows users, please use Alex Page’s USB Image Tool.

What took so long?

Boundary Devices, in its quest to provide the best software support possible, believes in the community BSP for i.MX platforms. This latter offers a more flexible, clean and up-to-date BSP with all NXP-specific packages.

However, updating the code base to properly support the different i.MX8 families took longer than expected.

As you can see by our participation to the different repositories, Boundary Devices made to sure to help integrating/reviewing new packages/patches.

The BSP is now in a state that we feel comfortable with! But note that it is right now using the master branch.

This branch is moving fast to include all the latest features/fixes but the drawback is that it isn’t as stable as one specific version.

So this release is basically to get everyone started on Yocto with i.MX8MQ but we’ll recommend only shipping products with the Thud version once it is released.

Note that since our platform is included in master, it will automatically be supported in Thud!

Build procedure

This image uses the master branch of our boundary-bsp-platform repository. 

This is mostly a clone of fsl-community-bsp-platform with meta-boundary added in.

To build the image, 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-imx8m
~/yocto-imx8m$ repo init -u -b master
~/yocto-imx8m$ repo sync

Setup the environment for building, in this example we will be building our boundary-wayland distro for nitrogen8m.

~/yocto-imx8m$ MACHINE=nitrogen8m 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-imx8m/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.4p1.8
  • VPU Hantro libraries v1.8.0
  • GStreamer1.0 1.14.0 for i.MX
  • Weston 4.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:

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

Note that we’ve noticed that the NXP HDMI driver is picky when it comes to custom display timings (sometimes refuses to set the clock).

So if you are experiencing any issue with HDMI, please try entering the following commands in U-Boot in order to force the use of standard timings:

=> setenv cmd_custom 'setenv bootargs $bootargs drm_kms_helper.edid_firmware=HDMI-A-1:edid/1280x720.bin'
=> saveenv

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@nitrogen8m:~# weston-simple-egl &
root@nitrogen8m:~# cd /opt/viv_samples/vdk/
root@nitrogen8m:/opt/viv_samples/vdk# ./tutorial7

Nitrogen8M GPUVPU decoding

The i.MX8MQ processor can decode videos with a resolution up to 4K so here is an example using GPlay tool:

root@nitrogen8m:~# wget
root@nitrogen8m:~# gplay-1.0 SKYFALL-4K.mp4

nitrogen8m-vpuCamera input

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

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



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

root@nitrogen8m:~# ifup eth0
root@nitrogen8m:~# iperf3 -c                                                                                                                         
Connecting to host, port 5201
[  5] local port 32880 connected to 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


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

root@nitrogen8m:~# wpa_passphrase <network> <passphrase> >> /etc/wpa_suplicant.conf
root@nitrogen8m:~# ifup wlan0
root@nitrogen8m:~# 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@nitrogen8m:~# ping -Iwlan0                                                                                                                       
PING ( 56 data bytes
64 bytes from seq=0 ttl=55 time=3.470 ms


For products with Bluetooth, you’ll be able to connect using these commands:

root@nitrogen8m:~# echo 0 > /sys/class/rfkill/rfkill0/state
root@nitrogen8m:~# echo 1 > /sys/class/rfkill/rfkill0/state 
root@nitrogen8m:~# hciattach /dev/ttymxc2 qca 3000000 -t30 flow
Current Product ID           : 0x00000008
Current Patch Version           : 0x0111
Current ROM Build Version       : 0x0302
Current SOC Version             : 0x00000023
qca_soc_init: Rome Version (0x03020023)
TLV Type               : 0x1
Length                 : 33060 bytes
Total Length           : 32804 bytes
Patch Data Length      : 32780 bytes
Signing Format Version : 0x1
Signature Algorithm    : 0x2
Event Handling         : 0x3
Reserved               : 0x0
Product ID             : 0x0008
Rom Build Version      : 0x0302
Patch Version          : 0x0114
Reserved               : 0x8000
Patch Entry Address    : 0x19b08
TLV Type               : 0x2
Length                 : 1992 bytes
Failed to open /etc/bluetooth/firmware.conf
Ignoring invalid deep sleep config value
Failed to open /etc/bluetooth/firmware.conf
Device setup complete
root@nitrogen8m:~# echo 1 > /sys/class/rfkill/rfkill2/state 
root@nitrogen8m:~# hciconfig hci0 up
root@nitrogen8m:~# hcitool scan
Scanning ...
11:22:DE:AD:BE:EF    Some Device

As usual, feel free to leave a comment below to share your experience.