Colibri iMX7 Modules

Quick Start

  • Build U-Boot

  • NAND IMX image adjustments before flashing

  • Flashing manually U-Boot to eMMC

  • Flashing manually U-Boot to NAND

  • Using update_uboot script

Build U-Boot

$ export CROSS_COMPILE=arm-linux-gnueabi-
$ make colibri_imx7_emmc_defconfig # For NAND: colibri_imx7_defconfig
$ make

After the build succeeds, you will obtain the final u-boot-dtb.imx IMX specific image, ready for flashing (but check next section for additional adjustments).

The final IMX program image includes (section 6.6.7 from IMX7DRM):

  • Image vector table (IVT) for BootROM

  • Boot data -indicates the program image location, program image size in bytes, and the plugin flag.

  • Device configuration data

  • User image: U-Boot image (u-boot-dtb.bin)

IMX image adjustments prior to flashing

1. U-Boot for both Colibri iMX7 NAND and eMMC versions is built with HABv4 support (AN4581.pdf) enabled by default, which requires generating a proper Command Sequence File (CSF) by srktool from NXP (not included in the U-Boot tree, check additional details in introduction_habv4.txt) and concatenate it to the final u-boot-dtb.imx.

2. In case you don’t want to generate a proper CSF (for any reason), you still need to pad the IMX image so it has the same size as specified in the Boot Data section of the IMX image. To obtain this value, run:

$ od -X -N 0x30 u-boot-dtb.imx
0000000    402000d1 87800000 00000000 877ff42c
0000020    877ff420 877ff400 878a5000 00000000
                    ^^^^^^^^
0000040    877ff000 000a8060 00000000 40b401d2
           ^^^^^^^^ ^^^^^^^^

Where:

  • 877ff400 - IVT self address

  • 877ff000 - Program image address

  • 000a8060 - Program image size

To calculate the padding:

  • IVT offset = 0x877ff400 - 0x877ff000 = 0x400

  • Program image size = 0xa8060 - 0x400 = 0xa7c60

and then pad the image:

$ objcopy -I binary -O binary --pad-to 0xa7c60 --gap-fill=0x00 \
    u-boot-dtb.imx u-boot-dtb.imx.zero-padded

3. Also, according to the requirement from 6.6.7.1, the final image should have 0x400 offset for the initial IVT table.

For eMMC setup we handle this by flashing it to 0x400, however for NAND setup we adjust the image prior to flashing, adding padding at the beginning of the image.

$ dd if=u-boot-dtb.imx.zero-padded of=u-boot-dtb.imx.ready bs=1024 seek=1

Flash U-Boot IMX image to eMMC

Flash the u-boot-dtb.imx.zero-padded binary to the primary eMMC hardware boot area partition:

=> load mmc 1:1 $loadaddr u-boot-dtb.imx.zero-padded
=> setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200
=> mmc dev 0 1
=> mmc write ${loadaddr} 0x2 ${blkcnt}

Flash U-Boot IMX image to NAND

=> load mmc 1:1 $loadaddr u-boot-dtb.imx.ready
=> nand erase.part u-boot1
=> nand write ${loadaddr} u-boot1 ${filesize}
=> nand erase.part u-boot2
=> nand write ${loadaddr} u-boot2 ${filesize}

Using update_uboot script

You can also use U-Boot env update_uboot script, which wraps all eMMC/NAND specific command invocations:

=> load mmc 1:1 $loadaddr u-boot-dtb.imx.ready
=> run update_uboot