U-Boot v2022.04 for i.MX platforms

Published on November 9, 2022

Boundary Devices is pleased to release U-Boot v2022.04 with support for all our i.MX-based SBCs and SOMs.

For the impatient

Our build server automatically generates and uploads all the latest binaries to this address: The README file contains the exact commit ID for these build images. For those not sure about what to download, you can check the current configuration from the U-Boot prompt: => printenv uboot_defconfig You can then follow the flashing procedure section to flash the latest binary.

What’s new?

Binman support

One big change in U-Boot v2022.04 is the use of binman, a new mechanism for building images, from simple SPL + U-Boot combinations, to more complex arrangements with many parts. Its usage will be transparent to most of you but know that it exists, it is the tool that now puts together the flash.bin binary needed by the i.MX 8 processors. You might wonder why it has changed? Basically the U-Boot community wants to avoid multiple image-building code for each processor that exists. NXP provides the imx-mkimage tool to create the final image but using binman gets rid of that extraneous tool and complies with mainline requirements. If you're interested in the subject, we recommend reading the tool README documentation. Here is an example of the binman layout declaration for i.MX 8M Plus processors: As binman changes the way the binaries are generated, our HAB scripts have been updated to work like before (and therefore be transparent for the user as well).

Display configuration support

Like previous U-Boot version, it supports all the different display interfaces: LVDS, MIPI, LCD, HDMI. If you use one of our displays, it should always be auto-detected. You can list all the supported displays from the prompt: => fbpanel Here is an example of how to manually set up the board for use with our BD070LIC3 MIPI display. => setenv fb_mipi tm070jdhg30 => savee => reset

Miscellaneous improvements

Although no exhaustive list of changes is available between v2020.10 and v2022.04, we know many drivers have been improved. For instance USB3.0 for i.MX 8M Plus processors is now working properly, allowing much faster transfers for fastboot flashing for instance.

Build instructions

Getting the source code

First, clone our U-Boot git repository. This is the branch you'll need to compile and install to work with the new kernel. ~$ git clone https://github.com/boundarydevices/u-boot -b boundary-v2022.04 ~$ cd u-boot ~/u-boot$ sudo apt-get install device-tree-compiler swig

Choosing the proper defconfig

Here you'll need to find and make the relevant defconfig for your board. If you have the board running U-Boot already, you can type the following to see which defconfig you should build. => printenv uboot_defconfig Otherwise, to see all the defconfigs, use this command and pick the one that is right for you. ~/u-boot$ find configs/ -name "nit*defconfig"

Building for i.MX6/7

Now compile that defconfig. For 32-bit platforms, we'll use nitrogen6q_defconfig as an example. ~/u-boot$ sudo apt-get install crossbuild-essential-armhf ~/u-boot$ export ARCH=arm ~/u-boot$ export CROSS_COMPILE=arm-linux-gnueabihf- ~/u-boot$ make nitrogen6q_defconfig ~/u-boot$ make u-boot-dtb.imx -j8 ~/u-boot$ cp u-boot.dtb.imx u-boot.nitrogen6q

Building for i.MX8

For 64-bit platforms, we'll use nitrogen8mp_2gr0_defconfig as an example. ~$ sudo apt-get install crossbuild-essential-arm64 ~$ export ARCH=arm64 ~$ export CROSS_COMPILE=aarch64-linux-gnu- ~$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.17.bin ~$ chmod +x firmware-imx-8.17.bin ~$ ./firmware-imx-8.17.bin ~$ cp firmware-imx-8.17/firmware/hdmi/cadence/signed_hdmi_imx8m.bin u-boot/ ~$ cp firmware-imx-8.17/firmware/ddr/synopsys/lpddr4*.bin u-boot/ ~$ cd u-boot ~/u-boot$ make nitrogen8mp_2gr0_defconfig ~/u-boot$ make -j8 At this point, you can rename the bootable image from flash.bin to u-boot.${uboot_defconfig} ~/u-boot$ cp flash.bin u-boot.nitrogen8mp_2gr0

Flashing procedure

For i.MX 8 platforms, the easiest might be to use fastboot to flash the bootloader:
  1. Enter fastboot mode => fastboot 0
  2. Connect your PC to the platform
    • Either microUSB or TypeC cable depending on the platform
    • You can check fastboot support for Windows here
  3. Flash the bootloader ~$ fastboot flash bootloader u-boot.<uboot_defconfig>
For all platforms, you can use the copy_upgrade.sh script to copy the bootable binary and the upgrade script to the root folder of your media (SD Card / USB / SATA drive). ~/u-boot/$ ./copy_upgrade.sh <mount_path>/ Plug your media to the platform, power up the board and interrupt u-boot to run the commands below (via the serial terminal). Hit any key to stop autoboot: 0 => run upgradeu This will run the upgrade.scr script and look for a file u-boot.${uboot_defconfig} and burn it. At this point it might be worthwhile to clear your environment variables after the first reboot. This will set you up with the default environment variables and no more. Hit any key to stop autoboot: 0 => env default -a => savee As a final note, if you've somehow managed to brick your board and need help, we already wrote a blog post here to assist.