Running U-Boot Print

 

As explained in Installing U-Boot to the NXP i.MX RT11050 EVK board, you have to install U-Boot to the SD Card of the NXP i.MX RT1050 EVK board in order to run Linux (uClinux) on the NXP i.MX RT1050 EVK board. U-Boot runs as the primary firmware from the SD Card on each power-on / reset.

U-Boot is probably the most popular firmware monitor for Linux. It is developed and maintained by DENX Software Engineering (www.denx.de). If you need detailed information on any aspects of U‑Boot operation, DENX publishes extensive U‑Boot user documentation at their web site.

U-Boot for the i.MX RT1050 microcontrollers is consisted of the two parts: SPL and TPL. SPL is installed with a 1k offset, TPL with a 128k offset in the SD card.

When SW8 switch selects the SD Card as a source boot, then the i.MX RT1050 ROM bootloader reads the SPL image at 0x400 offset from the start of the SD Card device and runs it. Then, SPL initializes SDRAM, read TPL from the SD card and runs it. TPL relocates itself to the end of the SDRAM, before the NON-Cached region, which is reserved for DMA, and is subsequently executed from there. Volatile data (stack, variables, dynamic pool) are maintained in the external SDRAM memory as well.

As soon as the NXP i.MX RT1050 EVK board is powered on or reset, the i.MX RT1050 proceeds to boot the U‑Boot firmware from the SD Card printing the following output to the serial console:

U-Boot SPL 2022.04 (Sep 25 2023 - 08:16:21 +0000)
Trying to boot from MMC1


U-Boot 2022.04 (Sep 25 2023 - 08:16:21 +0000)

DRAM: 32 MiB
Core: 71 devices, 13 uclasses, devicetree: separate
MMC: FSL_SDHC: 0
Loading Environment from MMC... OK
In: serial@40184000
Out: serial@40184000
Err: serial@40184000
Net: eth0: ethernet@402D8000
Hit any key to stop autoboot: 0
=>

If you hit any key on the serial console before the number of seconds defined by the U-Boot bootdelay variable has elapsed, you will enter the U-Boot interactive command monitor. From the command monitor you can run U‑Boot commands to examine memory, load an image from Ethernet, boot Linux from a loaded image or perform any other action supported by U-Boot.

U-Boot makes use of the so-called environment variables to define various aspects of the target functionality. On the NXP i.MX RT1050 EVK board, the U-Boot environment is stored at offset 512k also in the SD card and is persistent across power or reset cycles. Parameters defined by the U-Boot environment variables include: target IP address, target MAC address, location in RAM where a Linux bootable image will be loaded, and many others.

To manipulate the U-Boot environment the following commands are used:

  • printenv - print the value of the variable <var>. Without arguments, prints all environment variables:

    => printenv
    addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:eth0:off
    arch=arm
    baudrate=115200
    board=imxrt1050-evk
    board_name=imxrt1050-evk
    bootcmd=run mmcboot
    bootdelay=1
    cpu=armv7m
    ethact=ethernet@402D8000
    ethaddr=aa:bb:cc:dd:ee:f0
    fdtcontroladdr=81e85ea0
    fileaddr=80007fc0
    filesize=8062b8
    gatewayip=192.168.1.254
    image=rootfs.uImage
    ipaddr=192.168.1.98
    loadaddr=0x80007fc0
    mmc_update_kernel=tftp ${tftpdir}${image} && fatwrite mmc 0 ${loadaddr} ${image} ${filesize}
    mmc_update_spl=tftp ${tftpdir}${spl} && setexpr tmp ${filesize} / 0x200 && setexpr tmp ${tmp} + 1 && mmc write ${loadaddr} 2 ${tmp}
    mmc_update_uboot=tftp ${tftpdir}${uboot} && setexpr tmp ${filesize} / 0x200 && setexpr tmp ${tmp} + 1 && mmc write ${loadaddr} 0x100 ${tmp}
    mmcboot=fatload mmc 0 ${loadaddr} ${image} && run addip && bootm ${loadaddr}
    netboot=tftp ${tftpdir}${image} && run addip && bootm
    netmask=255.255.0.0
    serverip=192.168.1.96
    soc=imxrt
    spl=SPL
    splashimage=0x80007fc0
    splashsource=mmc_fs
    stderr=serial
    stdin=serial@40184000
    stdout=serial
    tftpdir=imxrt1050/
    uboot=u-boot.img
    vendor=freescale
    Environment size: 1113/126972 bytes

  • setenv <var> <val> - set the variable <var> to the value <val>:
  • => setenv image my.rootfs.uImage
    =>

  • saveenv - save the up-to-date U-Boot environment, possibly updated using setenv commands, into the SD Card. Running saveenv makes sure that any updates you have made to the U-Boot environment are persistent across power cycles and resets.
  • => saveenv
    Saving Environment to MMC... Writing to MMC(0)... OK
    =>