On Friday 28 May 2021 10:00:49 Marek Behún wrote: > 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 <[email protected]>
Reviewed-by: Pali Rohár <[email protected]> > --- > board/CZ.NIC/turris_omnia/turris_omnia.c | 53 +++++++++++++----------- > include/configs/turris_omnia.h | 23 ++++++++++ > 2 files changed, 52 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 > diff --git a/include/configs/turris_omnia.h b/include/configs/turris_omnia.h > index 0b55c14d8b..7da18f97db 100644 > --- a/include/configs/turris_omnia.h > +++ b/include/configs/turris_omnia.h > @@ -108,12 +108,35 @@ > > #include <config_distro_bootcmd.h> > > +/* > + * The 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 TURRIS_OMNIA_BOOTCMD_RESCUE \ > + "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" > + > #define CONFIG_EXTRA_ENV_SETTINGS \ > RELOCATION_LIMITS_ENV_SETTINGS \ > LOAD_ADDRESS_ENV_SETTINGS \ > "fdtfile=" CONFIG_DEFAULT_DEVICE_TREE ".dtb\0" \ > "console=ttyS0,115200\0" \ > "ethact=ethernet@34000\0" \ > + "bootcmd_rescue=" TURRIS_OMNIA_BOOTCMD_RESCUE "\0" \ > BOOTENV > > #endif /* CONFIG_SPL_BUILD */ > -- > 2.26.3 >

