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. The user can start by using the reference board support and adjusting the files according to 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

The user needs to define the devnum and bootcmd_args root parameters to meet the eMMC index on their 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, which 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, but in this case it handles both the environment as well as 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@@

The user needs to define devnum as expected by the board and make sure the initrd_addr is set in U-Boot correctly, otherwise the user 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 the procedure described here 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.