|
|
|
@ -149,3 +149,172 @@ This information is taken from: |
|
|
|
|
|
|
|
|
|
More details about the i.MX6 BOOT ROM can be found in the IMX6 reference manual. |
|
|
|
|
|
|
|
|
|
4. Falcon Mode |
|
|
|
|
------------------------------ |
|
|
|
|
|
|
|
|
|
The Gateworks Ventana board config enables Falcon mode (CONFIG_SPL_OS_BOOT) |
|
|
|
|
which allows the SPL to boot directly to an OS instead of to U-Boot |
|
|
|
|
(u-boot.img) thus acheiving a faster overall boot time. The time savings |
|
|
|
|
depends on your boot medium (ie NAND Flash vs micro-SD) and size/storage |
|
|
|
|
of the OS. The time savings can be anywhere from 2 seconds (256MB NAND Flash |
|
|
|
|
with ~1MB kernel) to 6 seconds or more (2GB NAND Flash with ~6 kernel) |
|
|
|
|
|
|
|
|
|
The Gateworks Ventana board supports Falcon mode for the following boot |
|
|
|
|
medium: |
|
|
|
|
- NAND flash |
|
|
|
|
- micro-SD |
|
|
|
|
|
|
|
|
|
For all boot mediums, raw mode is used. While support of more complex storage |
|
|
|
|
such as files on top of FAT/EXT filesystem is possible but not practical |
|
|
|
|
as the size of the SPL is fairly limitted (to 64KB based on the smallest |
|
|
|
|
size of available IMX6 iRAM) as well as the fact that this would increase |
|
|
|
|
OS load time which defeats the purpose of Falcon mode in the first place. |
|
|
|
|
|
|
|
|
|
The SPL decides to boot either U-Boot (u-boot.img) or the OS (args + kernel) |
|
|
|
|
based on the return value of the spl_start_uboot() function. While often |
|
|
|
|
this can simply be the state of a GPIO based pushbutton or DIP switch, for |
|
|
|
|
Gateworks Ventana, we use the U-Boot environment 'boot_os' variable which if |
|
|
|
|
set to '1' will choose to boot the OS rather than U-Boot. While the choice |
|
|
|
|
of adding env support to the SPL adds a little bit of time to the boot |
|
|
|
|
process as well as (significant really) SPL code space this was deemed most |
|
|
|
|
flexible as within the large variety of Gateworks Ventana boards not all of |
|
|
|
|
them have a user pushbutton and that pushbutton may be configured as a hard |
|
|
|
|
reset per user configuration. |
|
|
|
|
|
|
|
|
|
To use Falcon mode it is required that you first 'prepare' the 'args' data |
|
|
|
|
that is stored on your boot medium along with the kernel (which can be any |
|
|
|
|
OS or bare-metal application). In the case of the Linux kernel the 'args' |
|
|
|
|
is the flatenned device-tree which normally gets altered prior to booting linux |
|
|
|
|
by U-Boot's 'bootm' command. To achieve this for SPL we use the |
|
|
|
|
'spl export fdt' command in U-Boot after loading the kernel and dtb which |
|
|
|
|
will go through the same process of modifying the device-tree for the board |
|
|
|
|
being executed on but not jump to the kernel. This allows you to save the |
|
|
|
|
args data to the location the SPL expects it and then enable Falcon mode. |
|
|
|
|
|
|
|
|
|
It is important to realize that there are certain values in the dtb that |
|
|
|
|
are board model specific (IMX6Q vs IMX6DL for example) and board specific |
|
|
|
|
(board serial number, MAC addrs) so you do not want to use the 'args' |
|
|
|
|
data prepared from one board on another board. |
|
|
|
|
|
|
|
|
|
4.1. Falcon Mode on NAND flash |
|
|
|
|
------------------------------ |
|
|
|
|
To prepare a Gateworks Ventana board that boots from NAND flash for Falcon |
|
|
|
|
mode you must program your flash such that the 'args' and 'kernel' are |
|
|
|
|
located where defined at compile time by the following: |
|
|
|
|
CONFIG_CMD_SPL_NAND_OFS 17MB - offset of 'args' |
|
|
|
|
CONFIG_SYS_NAND_SPL_KERNEL_OFFS 18MB - offset of 'kernel' |
|
|
|
|
|
|
|
|
|
The location offsets defined above are defaults chosen by Gateworks and are |
|
|
|
|
flexible if you want to re-define them. |
|
|
|
|
|
|
|
|
|
The following steps executed in U-Boot will configure Falcon mode for NAND |
|
|
|
|
using rootfs (ubi), kernel (uImage), and dtb from the network: |
|
|
|
|
|
|
|
|
|
# change mtd partitions to the above mapping |
|
|
|
|
Ventana > setenv mtdparts 'mtdparts=nand:14m(spl),2m(uboot),1m(env),1m(args),10m(kernel),-(rootfs)' |
|
|
|
|
|
|
|
|
|
# flash rootfs (at 28MB) |
|
|
|
|
Ventana > tftp ${loadaddr} rootfs_${flash_layout}.ubi && \ |
|
|
|
|
nand erase.part rootfs && nand write ${loadaddr} rootfs ${filesize} |
|
|
|
|
|
|
|
|
|
# load the device-tree |
|
|
|
|
Ventana > tftp ${fdt_addr} ventana/${fdt_file2} |
|
|
|
|
|
|
|
|
|
# load the kernel |
|
|
|
|
Ventana > tftp ${loadaddr} ventana/uImage |
|
|
|
|
|
|
|
|
|
# flash kernel (at 18MB) |
|
|
|
|
Ventana > nand erase.part kernel && nand write ${loadaddr} kernel ${filesize} |
|
|
|
|
|
|
|
|
|
# set kernel args for the console and rootfs (used by spl export) |
|
|
|
|
Ventana > setenv bootargs 'console=ttymxc1,115200 root=ubi0:rootfs ubi.mtd=5 rootfstype=ubifs quiet' |
|
|
|
|
|
|
|
|
|
# create args based on env, board, EEPROM, and dtb |
|
|
|
|
Ventana > spl export fdt ${loadaddr} - ${fdt_addr} |
|
|
|
|
|
|
|
|
|
# flash args (at 17MB) |
|
|
|
|
Ventana > nand erase.part args && nand write 18000000 args 100000 |
|
|
|
|
|
|
|
|
|
# set boot_os env var to enable booting to Linux |
|
|
|
|
Ventana > setenv boot_os 1 && saveenv |
|
|
|
|
|
|
|
|
|
Be sure to adjust 'bootargs' above to your OS needs (this will be different |
|
|
|
|
for various distros such as OpenWrt, Yocto, Android, etc). You can use the |
|
|
|
|
value obtained from 'cat /proc/cmdline' when booted to Linux. |
|
|
|
|
|
|
|
|
|
This information is taken from: |
|
|
|
|
http://trac.gateworks.com/wiki/ventana/bootloader/falcon-mode#nand |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.2. Falcon Mode on micro-SD card |
|
|
|
|
--------------------------------- |
|
|
|
|
|
|
|
|
|
To prepare a Gateworks Ventana board with a primary boot device of micro-SD |
|
|
|
|
you first need to make sure you build U-Boot with CONFIG_ENV_IS_IN_MMC |
|
|
|
|
instead of CONFIG_ENV_IS_IN_NAND. |
|
|
|
|
|
|
|
|
|
For micro-SD based Falcon mode you must program your micro-SD such that |
|
|
|
|
the 'args' and 'kernel' are located where defined at compile time |
|
|
|
|
by the following: |
|
|
|
|
CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR 0x800 (1MB) - offset of 'args' |
|
|
|
|
CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR 0x1000 (2MB) - offset of 'kernel' |
|
|
|
|
|
|
|
|
|
The location offsets defined above are defaults chosen by Gateworks and are |
|
|
|
|
flexible if you want to re-define them. |
|
|
|
|
|
|
|
|
|
First you must prepare a micro-SD such that the SPL can be loaded by the |
|
|
|
|
IMX6 BOOT ROM (fixed offset of 1KB), and U-Boot can be loaded by the SPL |
|
|
|
|
(fixed offset of 69KB defined by CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR). |
|
|
|
|
|
|
|
|
|
The following shell commands are executed on a Linux host (adjust DEV to the |
|
|
|
|
block storage device of your micro-SD): |
|
|
|
|
|
|
|
|
|
DEV=/dev/sdc |
|
|
|
|
# zero out 1MB of device |
|
|
|
|
sudo dd if=/dev/zero of=$DEV count=1 bs=1M oflag=sync status=none && sync |
|
|
|
|
# copy SPL to 1KB offset |
|
|
|
|
sudo dd if=SPL of=$DEV bs=1K seek=1 oflag=sync status=none && sync |
|
|
|
|
# copy U-Boot to 69KB offset |
|
|
|
|
sudo dd if=u-boot.img of=$DEV bs=1K seek=69 oflag=sync status=none && sync |
|
|
|
|
# create a partition table with a single rootfs partition starting at 10MB |
|
|
|
|
printf "10,,L\n" | sudo sfdisk --in-order --no-reread -L -uM $DEV && sync |
|
|
|
|
# format partition |
|
|
|
|
sudo mkfs.ext4 -L root ${DEV}1 |
|
|
|
|
# mount the partition |
|
|
|
|
sudo udisks --mount ${DEV}1 |
|
|
|
|
# extract filesystem |
|
|
|
|
sudo tar xvf rootfs.tar.gz -C /media/root |
|
|
|
|
# flush and unmount |
|
|
|
|
sync && sudo umount /media/root |
|
|
|
|
|
|
|
|
|
Now that your micro-SD partitioning has been adjusted to leave room for the |
|
|
|
|
raw 'args' and 'kernel' data boot the board with the prepared micro-SD, break |
|
|
|
|
out in U-Boot and use the following to enable Falcon mode: |
|
|
|
|
|
|
|
|
|
# load device-tree from rootfs |
|
|
|
|
Ventana > ext2load mmc 0:1 ${fdt_addr} boot/${fdt_file2} |
|
|
|
|
|
|
|
|
|
# load kernel from rootfs |
|
|
|
|
Ventana > ext2load mmc 0:1 ${loadaddr} boot/uImage |
|
|
|
|
|
|
|
|
|
# write kernel at 2MB offset |
|
|
|
|
Ventana > mmc write ${loadaddr} 0x1000 0x4000 |
|
|
|
|
|
|
|
|
|
# setup kernel bootargs |
|
|
|
|
Ventana > setenv bootargs 'console=ttymxc1,115200 root=/dev/mmcblk0p1 rootfstype=ext4 rootwait rw' |
|
|
|
|
|
|
|
|
|
# prepare args |
|
|
|
|
Ventana > spl export fdt ${loadaddr} - ${fdt_addr} |
|
|
|
|
|
|
|
|
|
# write args 1MB data (0x800 sectors) to 1MB offset (0x800 sectors) |
|
|
|
|
Ventana > mmc write 18000000 0x800 0x800 |
|
|
|
|
|
|
|
|
|
# set boot_os to enable falcon mode |
|
|
|
|
Ventana > setenv boot_os 1 && saveenv |
|
|
|
|
|
|
|
|
|
Be sure to adjust 'bootargs' above to your OS needs (this will be different |
|
|
|
|
for various distros such as OpenWrt, Yocto, Android, etc). You can use the |
|
|
|
|
value obtained from 'cat /proc/cmdline' when booted to Linux. |
|
|
|
|
|
|
|
|
|
This information is taken from: |
|
|
|
|
http://trac.gateworks.com/wiki/ventana/bootloader/falcon-mode#microsd |
|
|
|
|