diff options
author | Marek Behún <marek.behun@nic.cz> | 2021-05-28 11:00:49 +0300 |
---|---|---|
committer | Stefan Roese <sr@denx.de> | 2021-06-04 12:32:41 +0300 |
commit | 176c3e7760a2e302620b8b12b29f4aa385b86087 (patch) | |
tree | f280cf847549aec7adabaffb645a64a7a014c552 /board/CZ.NIC/turris_omnia | |
parent | 0b5bb36d13fe416fda29d593ce9ac1152e62186b (diff) | |
download | u-boot-176c3e7760a2e302620b8b12b29f4aa385b86087.tar.xz |
arm: mvebu: turris_omnia: support invoking rescue boot from console
Make it possible to invoke rescue boot from U-Boot console, without
having to press the factory reset button. This is needed when accessing
the device remotely, for example.
Achieve this by putting rescue command into `bootcmd_rescue` default
environment variable and setting some distroboot environment variables
to their default values when the factory button is pressed.
Rescue boot from console can be invoked by running
run bootcmd_rescue
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'board/CZ.NIC/turris_omnia')
-rw-r--r-- | board/CZ.NIC/turris_omnia/turris_omnia.c | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c b/board/CZ.NIC/turris_omnia/turris_omnia.c index d3de8004eb..ade923f599 100644 --- a/board/CZ.NIC/turris_omnia/turris_omnia.c +++ b/board/CZ.NIC/turris_omnia/turris_omnia.c @@ -337,29 +337,6 @@ static int set_regdomain(void) return env_set("regdomain", rd); } -/* - * default factory reset bootcommand on Omnia first sets all the front LEDs - * to green and then tries to load the rescue image from SPI flash memory and - * boot it - */ -#define OMNIA_FACTORY_RESET_BOOTCMD \ - "i2c dev 2; " \ - "i2c mw 0x2a.1 0x3 0x1c 1; " \ - "i2c mw 0x2a.1 0x4 0x1c 1; " \ - "mw.l 0x01000000 0x00ff000c; " \ - "i2c write 0x01000000 0x2a.1 0x5 4 -s; " \ - "setenv bootargs \"earlyprintk console=ttyS0,115200" \ - " omniarescue=$omnia_reset rescue_mode=$omnia_reset\"; " \ - "sf probe; " \ - "sf read 0x1000000 0x100000 0x700000; " \ - "lzmadec 0x1000000 0x1700000; " \ - "if gpio input gpio@71_4; then " \ - "bootm 0x1700000#sfp; " \ - "else " \ - "bootm 0x1700000; " \ - "fi; " \ - "bootz 0x1000000" - static void handle_reset_button(void) { int ret; @@ -375,8 +352,36 @@ static void handle_reset_button(void) env_set_ulong("omnia_reset", reset_status); if (reset_status) { + const char * const vars[3] = { + "bootcmd", + "bootcmd_rescue", + "distro_bootcmd", + }; + + /* + * Set the above envs to their default values, in case the user + * managed to break them. + */ + env_set_default_vars(3, (char * const *)vars, 0); + + /* Ensure bootcmd_rescue is used by distroboot */ + env_set("boot_targets", "rescue"); + printf("RESET button was pressed, overwriting bootcmd!\n"); - env_set("bootcmd", OMNIA_FACTORY_RESET_BOOTCMD); + } else { + /* + * In case the user somehow managed to save environment with + * boot_targets=rescue, reset boot_targets to default value. + * This could happen in subsequent commands if bootcmd_rescue + * failed. + */ + if (!strcmp(env_get("boot_targets"), "rescue")) { + const char * const vars[1] = { + "boot_targets", + }; + + env_set_default_vars(1, (char * const *)vars, 0); + } } } #endif |