[U-Boot] [U-Boot, v3, 3/3] rockchip: check download key before bootup

Philipp Tomsich philipp.tomsich at theobroma-systems.com
Mon Nov 20 14:51:50 UTC 2017



On Wed, 11 Oct 2017, Andy Yan wrote:

> Enter download mode if the download key pressed.
>
> Signed-off-by: Andy Yan <andy.yan at rock-chips.com>
> Acked-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>

Reviewed-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>

See below for requested changes.

> ---
>
> Changes in v3: None
> Changes in v2:
> - more document
> - move adc key detect as the default
>
> arch/arm/mach-rockchip/boot_mode.c | 43 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 43 insertions(+)
>
> diff --git a/arch/arm/mach-rockchip/boot_mode.c b/arch/arm/mach-rockchip/boot_mode.c
> index 4652490..bf0a410 100644
> --- a/arch/arm/mach-rockchip/boot_mode.c
> +++ b/arch/arm/mach-rockchip/boot_mode.c
> @@ -5,14 +5,57 @@
>  */
>
> #include <common.h>
> +#include <adc.h>
> #include <asm/io.h>
> #include <asm/arch/boot_mode.h>
>
> +void set_back_to_bootrom_dnl_flag(void)
> +{
> +	writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG);
> +}
> +
> +/*
> + * detect download key status by adc, most rockchip
> + * based boards use adc sample the download key status,
> + * but there are also some use gpio. So it's better to
> + * make this a weak function that can be override by
> + * some special boards.
> + */
> +#define KEY_DOWN_MIN_VAL	0
> +#define KEY_DOWN_MAX_VAL	30
> +
> +__weak int rockchip_dnl_key_pressed(void)
> +{
> +	unsigned int val;
> +
> +	if (adc_channel_single_shot("saradc", 1, &val)) {
> +		printf("%s adc_channel_single_shot fail!\n", __func__);

This should be a pr_debug() or pr_err().
Thanks.

> +		return false;
> +	}
> +
> +	if ((val >= KEY_DOWN_MIN_VAL) && (val <= KEY_DOWN_MAX_VAL))
> +		return true;
> +	else
> +		return false;
> +}
> +
> +void rockchip_dnl_mode_check(void)
> +{
> +	if (rockchip_dnl_key_pressed()) {
> +		printf("download key pressed, entering download mode...");
> +		set_back_to_bootrom_dnl_flag();
> +		do_reset(NULL, 0, 0, NULL);
> +	}
> +}
> +
> int setup_boot_mode(void)
> {
> 	void *reg = (void *)CONFIG_ROCKCHIP_BOOT_MODE_REG;
> 	int boot_mode = readl(reg);
>
> +	rockchip_dnl_mode_check();
> +
> +	boot_mode = readl(reg);
> 	debug("boot mode %x.\n", boot_mode);
>
> 	/* Clear boot mode */
>


More information about the U-Boot mailing list