Each STM32MP1 System-On-Module comes pre-loaded with U-Boot. U-Boot runs as the primary firmware from the on-module eMMC Flash 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.
On the STM32MP1 SOM, U-Boot image is stored in the eMMC device. On a power-on / reset, U-Boot is relocated to DDR RAM.
As soon as the module is powered on or reset, the core proceeds to boot the U-Boot firmware printing the following output to the serial console:
U-Boot 2018.09-stm32mp-r2-2.8.1 (Feb 14 2019 - 15:13:06 +0000) CPU: STM32MP15x.B Model: Emcraft STM32MP1 SOM Rev 1A, www.emcraft.com Board: stm32mp1 in trusted mode Watchdog enabled DRAM: 1 GiB Clocks: - MPU : 650 MHz - MCU : 196.608 MHz - AXI : 266.500 MHz - PER : 24 MHz MMC: STM32 SDMMC2: 0, STM32 SDMMC2: 1 In: serial Out: vidconsole Err: vidconsole Model: Emcraft STM32MP1 SOM Rev 1A, www.emcraft.com Board: stm32mp1 in trusted mode Error: 16 bit/pixel mode, but BMP has 24 bit/pixel Net: eth0: ethernet@5800a000 Boot over mmc1! Hit any key to stop autoboot: 0 STM32MP1-SOM>
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 STM32MP1 SOM, the U-Boot environment is stored in the eMMC Flash 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 <var>
- print the value of the variable var. Without arguments, prints all environment variables:u-boot => printenv bootcmd=run sdboot bootdelay=3 baudrate=115200 ... u-boot =>
setenv <var> <val>
- set the variable var to the valueval
:u-boot => setenv image vlad/imx8m/my.Image u-boot=>
Running setenv <var>
will unset (undefine) a specified U-Boot variable.
saveenv
- save the up-to-date U-Boot environment, possibly updated usingsetenv
commands, into the Flash. Runningsaveenv
makes sure that any updates you have made to the U-Boot environment are persistent across power cycles and resets.u-boot => saveenv Saving Environment to MMC... Writing to MMC... done u-boot =>
The autoboot sequence in U-Boot is controlled by the two environment variables called bootdelay
and bootcmd
.
The bootdelay
variable defines a delay, in seconds, before running the autoboot command defined by bootcmd
. During the bootdelay
countdown, you can interrupt the autobooting by pressing any key. This will let you enter the U-Boot command line interface.
The bootcmd
variable defines a command executed by U-Boot automatically after the bootdelay
countdown is over. Typically, this would be run netboot
to boot Linux from TFTP during development or run flashboot
to boot Linux from the on-module Flash on deployed units.
In deployed configurations, where boot time to the service provided by your embedded device is critical, you will probably want to set bootdelay
to 0
:
u-boot => set bootdelay 0 u-boot => saveenv
This will make sure that on each power on / reset U-Boot immediately executes the command defined by bootcmd
, typically booting Linux from the on-module Flash.
With bootdelay
set to 0 the U-Boot countdown is disabled, so there is a question how you enter the U-Boot command monitor, should you need to enter it for some reason. To do so, push the Ctrl-C keys down and don't release them until you have hit the reset button on the baseboard. This will interrupt the U-Boot bootcmd
sequence and let you enter the U-Boot command monitor:
U-Boot 2018.09-stm32mp-r2-2.8.0 (Feb 14 2019 - 15:13:06 +0000) ... Hit any key to stop autoboot: 0 u-boot => <INTERRUPT>
From the command monitor, you would be able to reset bootdelay
to 3 or whatever value makes sense to you.