imx: ventana: use EEPROM register for falcon boot mode

NAND+MMC env support costs 12KB in the SPL which is fairly expensive just
for the ability to specify whether or not to boot to uboot or directly
to linux. The Ventana boards have plenty of EEPROM storage so we will use
a byte there to signify if we should boot to the bootloader or to the OS.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
master
Tim Harvey 8 years ago committed by Stefano Babic
parent a419352daf
commit 3c0fd17f61
  1. 17
      board/gateworks/gw_ventana/README
  2. 7
      board/gateworks/gw_ventana/gw_ventana_spl.c
  3. 1
      include/configs/gw_ventana.h

@ -173,13 +173,8 @@ 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.
Gateworks Ventana, we use an EEPROM register on i2c-0 at 0x50:0x00:
set to '0' will choose to boot to U-Boot and otherwise it will boot to OS.
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
@ -235,8 +230,8 @@ using rootfs (ubi), kernel (uImage), and dtb from the network:
# 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
# set i2c register 0x50:0x00=0 to boot to Linux
Ventana > i2c dev 0 && i2c mw 0x50 0x00.0 0 1
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
@ -309,8 +304,8 @@ out in U-Boot and use the following to enable Falcon mode:
# 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
# set i2c register 0x50:0x00=0 to boot to Linux
Ventana > i2c dev 0 && i2c mw 0x50 0x00.0 0 1
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

@ -15,6 +15,7 @@
#include <asm/imx-common/iomux-v3.h>
#include <asm/imx-common/mxc_i2c.h>
#include <environment.h>
#include <i2c.h>
#include <spl.h>
#include "gsc.h"
@ -560,7 +561,7 @@ void spl_board_init(void)
/* return 1 if we wish to boot to uboot vs os (falcon mode) */
int spl_start_uboot(void)
{
int ret = 1;
unsigned char ret = 1;
debug("%s\n", __func__);
#ifdef CONFIG_SPL_ENV_SUPPORT
@ -569,6 +570,10 @@ int spl_start_uboot(void)
debug("boot_os=%s\n", getenv("boot_os"));
if (getenv_yesno("boot_os") == 1)
ret = 0;
#else
/* use i2c-0:0x50:0x00 for falcon boot mode (0=linux, else uboot) */
i2c_set_bus_num(0);
gsc_i2c_read(0x50, 0x0, 1, &ret, 1);
#endif
debug("%s booting %s\n", __func__, ret ? "uboot" : "linux");
return ret;

@ -18,7 +18,6 @@
/* Falcon Mode */
#define CONFIG_CMD_SPL
#define CONFIG_SPL_OS_BOOT
#define CONFIG_SPL_ENV_SUPPORT
#define CONFIG_SYS_SPL_ARGS_ADDR 0x18000000
#define CONFIG_CMD_SPL_WRITE_SIZE (128 * SZ_1K)

Loading…
Cancel
Save