[U-Boot] [PATCH u-boot-marvell v2 14/15] arm: mvebu: turris_omnia: add RESET button handling

Stefan Roese sr at denx.de
Thu May 2 06:10:36 UTC 2019


On 30.04.19 03:48, Marek Behún wrote:
> There is a Factory RESET button on the back side of the Turris Omnia
> router. When user presses this button before powering the device up and
> keeps it pressed, the microcontroller prevents the main CPU from booting
> and counts how long the RESET button is being pressed (and indicates
> this by lighting up front LEDs).
> 
> The idea behind this is that the user can boot the device into several
> Factory RESET modes.
> 
> This patch adds support for U-Boot to read into which Factory RESET mode
> the user booted the device. The value is an integer stored into the
> omnia_reset environment variable. It is 0 if the button was not pressed
> at all during power up, otherwise it is the number identifying the
> Factory RESET mode.
> 
> This patch also adds support for configuring (via Kconfig) if the
> bootcmd environment variable should be overwritten if this Factory RESET
> button was pressed during device powerup, and if this configuration
> option is enabled, the value by which bootcmd should be overwritten with
> is also a configurable option. The default value sets the colors of all
> the LEDs on the front panel to green, then loads the rescue system image
> from the SPI flash memory and then boots it.
> 
> Signed-off-by: Marek Behún <marek.behun at nic.cz>
> ---
>   arch/arm/mach-mvebu/Kconfig              | 43 ++++++++++++++++++++++++
>   board/CZ.NIC/turris_omnia/turris_omnia.c | 23 +++++++++++++
>   2 files changed, 66 insertions(+)
> 
> diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
> index fc29c3b084..4229a505d1 100644
> --- a/arch/arm/mach-mvebu/Kconfig
> +++ b/arch/arm/mach-mvebu/Kconfig
> @@ -116,6 +116,7 @@ config TARGET_DB_88F6820_AMC
>   config TARGET_TURRIS_OMNIA
>   	bool "Support Turris Omnia"
>   	select 88F6820
> +	select BOARD_LATE_INIT
>   	select DM_I2C
>   	select I2C_MUX
>   	select I2C_MUX_PCA954x
> @@ -165,6 +166,48 @@ config TARGET_DB_XC3_24G4XG
>   
>   endchoice
>   
> +if TARGET_TURRIS_OMNIA
> +
> +config TURRIS_OMNIA_RSTBTN_OVERWRITE_BOOTCMD
> +	bool "Turris Omnia RESET button overwrites bootcmd"
> +	default y
> +	help
> +	  There is a RESET button on the back side of the Turris Omnia router,
> +	  which is read by the microcontroller before the main CPU is booted.
> +	  If this button is pressed during device poweron, the CPU is only
> +	  booted after the button is released.
> +
> +	  The CPU can then read how long the RESET button was pressed (in time
> +	  intervals of cca 2 seconds, at most 12 different values), and U-Boot
> +	  stores this value into omnia_reset environment variable.
> +	  The microcontroller also lights up one front LED every time interval,
> +	  so that users can see the value they are forcing.
> +
> +	  If this option is enabled, the board code will also overwrite the
> +	  bootcmd variable with a constant configurable in this configuration
> +	  (config TURRIS_OMNIA_RSTBTN_BOOTCMD_VALUE) if the RESET button was
> +	  pressed for at least one time interval.
> +
> +	  Otherwise only the omnia_reset environment variable is set.
> +
> +config TURRIS_OMNIA_RSTBTN_BOOTCMD_VALUE
> +	string "Turris Omnia RESET button bootcmd value"
> +	default "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 \\\"$bootargs omniarescue=$omnia_reset\\\"; sf probe; sf read 0x1000000 0x100000 0x700000; bootm 0x1000000; bootz 0x1000000"
> +	depends on TURRIS_OMNIA_RSTBTN_OVERWRITE_BOOTCMD
> +	help
> +	  If the RESET button is pressed during device poweron and released at
> +	  least after cca 2 seconds, the bootcmd will be overwritten with this
> +	  value.
> +
> +	  You can use the omnia_reset environment variable in this command to
> +	  detect how long the reset button was pressed (or pass this value to
> +	  Linux as a boot parameter).
> +
> +	  The default value of this command set the front LEDs to green color
> +	  and then tries to boot rescue system from SPI memory.
> +
> +endif

I fail to see a real reason to introduce these Kconfig options. Is
TURRIS_OMNIA_RSTBTN_OVERWRITE_BOOTCMD enabled for your board? If not
it just adds dead code, as no other board will ever enable it. So do
you plan to add 2 Omnia build targets, one with and one w/o this
option enabled? Or what is your plan here?

Thanks,
Stefan

> +
>   config SYS_BOARD
>   	default "clearfog" if TARGET_CLEARFOG
>   	default "helios4" if TARGET_HELIOS4
> diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c b/board/CZ.NIC/turris_omnia/turris_omnia.c
> index af43ee23d9..91fce6370c 100644
> --- a/board/CZ.NIC/turris_omnia/turris_omnia.c
> +++ b/board/CZ.NIC/turris_omnia/turris_omnia.c
> @@ -328,6 +328,28 @@ static int set_regdomain(void)
>   	printf("Regdomain set to %s\n", rd);
>   	return env_set("regdomain", rd);
>   }
> +
> +static void handle_reset_button(void)
> +{
> +	int ret;
> +	u8 reset_status;
> +
> +	ret = omnia_mcu_read(CMD_GET_RESET, &reset_status, 1);
> +	if (ret) {
> +		printf("omnia_mcu_read failed: %i, reset status unknown!\n",
> +		       ret);
> +		return;
> +	}
> +
> +	env_set_ulong("omnia_reset", reset_status);
> +
> +#ifdef CONFIG_TURRIS_OMNIA_RSTBTN_OVERWRITE_BOOTCMD
> +	if (reset_status) {
> +		printf("RESET button was pressed, overwriting bootcmd!\n");
> +		env_set("bootcmd", CONFIG_TURRIS_OMNIA_RSTBTN_BOOTCMD_VALUE);
> +	}
> +#endif
> +}
>   #endif
>   
>   int board_early_init_f(void)
> @@ -373,6 +395,7 @@ int board_late_init(void)
>   {
>   #ifndef CONFIG_SPL_BUILD
>   	set_regdomain();
> +	handle_reset_button();
>   #endif
>   
>   	return 0;
> 

Viele Grüße,
Stefan

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list