Installing Linux Images to Flash Print


This note explains how to install a bootable Linux image to the NAND Flash on the i.MX 6SoloX System-On-Module (SOM). Having installed a Linux image to the Flash, you would be able to boot Linux on the target automatically on any power up or reset cycle. This is the mode of operation that is typically used for deployed production units.

It should be noted that all i.MX 6SoloX SOMs come with a default Linux image preloaded to the Flash.

The example below refers to rootfs.uImage, however the process below will work for any bootable Linux image you build using the Emcraft software distribution.

Before you proceed to install a Linux image to the NAND Flash, it probably makes sense to verify that what you have is indeed a bootable Linux image. You can do that by loading the image to the target from the network using the run netboot command (refer to Loading Linux Images via Ethernet and TFTP). It is important to understand that the same uImage that you load via TFTP can be loaded from the Flash as well. It doesn't make sense to install a Linux image to the Flash unless you have validated the image by loading it via Ethernet and TFTP.

The U-Boot command sequence required to install a Linux image to the NAND Flash is defined for you by the U-Boot environment variable called update. Here is how update is defined in U-Boot by default:

SLX-SOM U-Boot > print update
update=tftp ${image} && nand erase.spread ${uImage_offset} ${filesize} && nand write ${loadaddr} ${uImage_offset} ${filesize}
SLX-SOM U-Boot >

You will notice that the first command in update is a tftpboot command to download an image from the network via Ethernet and TFTP. Please refer to Loading Linux Images via Ethernet and TFTP for detailed information on how to set up your target and the development host for loading images from TFTP. Following tftpboot, there is a sequence of commands that erase those Flash sections where the Linux image will be installed to and then copy the image to the Flash.

Here is a snapshot showing how update is used to install rootfs.uImage to the Flash:

SLX-SOM U-Boot > setenv image slx/rootfs.uImage
SLX-SOM U-Boot > saveenv
Saving Environment to NAND...
...
SLX-SOM U-Boot > run update
Using FEC0 device
TFTP from server 172.17.0.1; our IP address is 172.17.80.3
Filename 'psl/slx/rootfs.uImage'.
Load address: 0x807fffc0
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
########################
done
Bytes transferred = 7019816 (6b1d28 hex)

NAND erase.spread: device 0 offset 0x2c0000, size 0x6b1d28
Erasing at 0x960000 -- 100% complete.
OK

NAND write: device 0 offset 0x2c0000, size 0x6b1d28
7019816 bytes written: OK
SLX-SOM U-Boot >

Having installed an image to the Flash, just hit the Reset button on the baseboard to boot the newly installed image from Flash:

U-Boot 2015.04-imx6sx-2.3.3 (Jul 27 2017 - 19:17:20)

CPU:   Freescale i.MX6SX rev1.2 at 792 MHz
CPU:   Temperature 57 C
Reset cause: WDOG
Board: Emcraft SLX-SOM rev 2A
I2C:   ready
DRAM:  512 MiB
NAND:  512 MiB
MMC:   FSL_SDHC: 0
Display: LCD-TN43 (480x272)
Video: 480x272x24
gis input --- No input
In:    serial
Out:   serial
Err:   serial
Net:   FEC [PRIME]
Normal Boot
Hit any key to stop autoboot:  0

Loading from nand0, offset 0xe20000
Image Name:   Linux-4.5.0-imx6sx-2.3.3
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    5368448 Bytes = 5.1 MiB
Load Address: 80008000
Entry Point:  80008000

NAND read: device 0 offset 0xe00000, size 0x20000
131072 bytes read: OK
## Booting kernel from Legacy Image at 807fffc0 ...
Image Name:   Linux-4.5.0-imx6sx-2.3.3
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    5368448 Bytes = 5.1 MiB
Load Address: 80008000
Entry Point:  80008000
## Flattened Device Tree blob at 83000000
Booting using the fdt blob at 0x83000000
Loading Kernel Image ... OK
Loading Device Tree to 9df30000, end 9df3c298 ... OK

Starting kernel ...
...
init started: BusyBox v1.17.0 (2016-12-27 19:31:05 +0400)
~ #

On deployed units, you will probably want to optimize the boot time by setting the U-Boot bootdelay variable to 0. Please refer to Autobooting Linux from U-Boot for detailed information on how to do that.

The root filesystem UBI image, U-Boot LCD splash image and kernel Device Tree Blob (rootfs.dtb) are updated using the similar U-Boot macros - rootfsupdate, splashupdate and dtbupdate.