U-Boot Environment and Boot Script

The last step to configure U-Boot in LmP is to provide the boot environment (for lmp-base) and the boot command. You can start by using the reference board support, adjusting the files accordingly for the target board.

For the lmp-base distro, provide the boot environment input file uEnv.txt.in, which sets the needed variables for booting:

u-boot-base-scr/imx8mmevk/uEnv.txt.in:

devnum=2
devtype=mmc
bootcmd_args=setenv bootargs console=tty1 console=${console} root=/dev/mmcblk2p2 rootfstype=ext4 rootwait rw
bootcmd_dtb=fatload ${devtype} ${devnum}:1 ${fdt_addr} ${fdt_file}
bootcmd_load_k=fatload ${devtype} ${devnum}:1 ${loadaddr} ${image}
bootcmd_run=booti ${loadaddr} - ${fdt_addr}
bootcmd=run bootcmd_args; run bootcmd_dtb; run bootcmd_load_k; run bootcmd_run

You will need to define the devnum and bootcmd_args root parameters to meet the eMMC index on your board. Other board specific variables can be set in this file if needed, like fdt_file or console configurations.

After uEnv.txt.in is in place, provide boot.cmd. This loads this environment and boots to kernel:

u-boot-base-scr/imx8mmevk/boot.cmd:

fatload mmc ${emmc_dev}:1 ${loadaddr} /uEnv.txt
env import -t ${loadaddr} ${filesize}
run bootcmd

For the lmp-base distro, these files live in u-boot-base-scr:

recipes-bsp/u-boot/
├── u-boot-base-scr
│ └── <board>
│     ├── boot.cmd
│     └── uEnv.txt.in
└── u-boot-base-scr.bbappend

Also for the lmp distro, the only file that needs to be provided is boot.cmd. Note that in this case, it handles both the environment and the boot command:

u-boot-ostree-scr-fit/imx8mmevk/boot.cmd:

echo "Using freescale_${fdt_file}"

# Default boot type and device
setenv bootlimit 3
setenv devtype mmc
setenv devnum 2
setenv bootpart 1
setenv rootpart 2

# Boot image files
setenv fdt_file_final freescale_${fdt_file}
setenv fit_addr ${initrd_addr}

# Boot firmware updates
setenv bootloader 42
setenv bootloader2 300
setenv bootloader_s 1042
setenv bootloader2_s 1300
setenv bootloader_image "imx-boot"
setenv bootloader_s_image ${bootloader_image}
setenv bootloader2_image "u-boot.itb"
setenv bootloader2_s_image ${bootloader2_image}
setenv uboot_hwpart 1

@@INCLUDE_COMMON@@

You will need to define devnum as expected by the board. Make sure the initrd_addr is set in U-Boot correctly. Otherwise you may need to set the initrd_addr (as well as any other missing addresses) in this file.

Note

If porting to a new SoC not supported in LmP, the boot firmware offsets also need to be calculated and adjusted as described under TF-A/OP-TEE.

The boot.cmd for the lmp distro lives in:

recipes-bsp/u-boot/
├── u-boot-ostree-scr-fit
│   └── <board>
│       └── boot.cmd
└── u-boot-ostree-scr-fit.bbappend

After providing these files, LmP has all the needed configuration to boot U-Boot and get to the kernel.