[PATCH v3] rockchip: include: asm: fix entering download mode rk3066
Kever Yang
kever.yang at rock-chips.com
Tue Nov 7 05:05:31 CET 2023
On 2023/10/28 02:35, Johan Jonker wrote:
> Keep track of the re-entries with help of the lr register.
> This binary can be re-used and called from various BROM functions.
> Only when it's called from the part that handles SPI, NAND or EMMC
> hardware it needs to early return to BROM ones.
> In download mode when it handles data on USB OTG and UART0
> this section must be skipped.
>
> Unlike newer Rockchip SoC models the rk3066 BROM code does not have built-in
> support to enter download mode on return to BROM. This binary must check
> the boot mode register for the BOOT_BROM_DOWNLOAD flag and reset if it's set.
> It then returns to BROM to the end of the function that reads boot blocks.
> >From there the BROM code goes into a download mode and waits for data
> on USB OTG and UART0.
>
> Signed-off-by: Johan Jonker <jbx6244 at gmail.com>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
>
> Note:
> Normal U-boot flow is OK.
> In download mode this binary hangs after return to BROM for unknown reasons.
> Replace CODE471_OPTION with 30_LPDDR2_300MHz_DD.bin for now.
>
> Changed V3:
> Kconfig option for rk3066 only
> Restyle
>
> Changed V2:
> Move file to rk3066 specific location
> Replace retry_counter by LR check
> Add DNL mode return address
> Restyle
> Reword
> ---
> arch/arm/include/asm/arch-rk3066/boot0.h | 77 +++++++++++++++++++++++-
> arch/arm/mach-rockchip/Kconfig | 2 +-
> arch/arm/mach-rockchip/rk3066/Kconfig | 8 +++
> 3 files changed, 85 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rk3066/boot0.h b/arch/arm/include/asm/arch-rk3066/boot0.h
> index 28c0fb9a4c6b..6bf3828c84e9 100644
> --- a/arch/arm/include/asm/arch-rk3066/boot0.h
> +++ b/arch/arm/include/asm/arch-rk3066/boot0.h
> @@ -3,6 +3,81 @@
> #ifndef __ASM_ARCH_BOOT0_H__
> #define __ASM_ARCH_BOOT0_H__
>
> -#include <asm/arch-rockchip/boot0.h>
> +#include <asm/arch-rockchip/boot_mode.h>
>
> +/*
> + * Execution starts on the instruction following this 4-byte header
> + * (containing the magic 'RK30'). This magic constant will be written into
> + * the final image by the rkimage tool, but we need to reserve space for it here.
> + */
> +#ifdef CONFIG_SPL_BUILD
> + b 1f /* if overwritten, entry-address is at the next word */
> +1:
> +#endif
> +
> +#if CONFIG_IS_ENABLED(ROCKCHIP_EARLYRETURN_TO_BROM)
> +/*
> + * Keep track of the re-entries with help of the lr register.
> + * This binary can be re-used and called from various BROM functions.
> + * Only when it's called from the part that handles SPI, NAND or EMMC
> + * hardware it needs to early return to BROM ones.
> + * In download mode when it handles data on USB OTG and UART0
> + * this section must be skipped.
> + */
> + ldr r3, =CONFIG_ROCKCHIP_BOOT_LR_REG
> + cmp lr, r3 /* if (LR != CONFIG_ROCKCHIP_BOOT_LR_REG) */
> + bne reset /* goto reset; */
> +/*
> + * Unlike newer Rockchip SoC models the rk3066 BROM code does not have built-in
> + * support to enter download mode on return to BROM. This binary must check
> + * the boot mode register for the BOOT_BROM_DOWNLOAD flag and reset if it's set.
> + * It then returns to BROM to the end of the function that reads boot blocks.
> + * From there the BROM code goes into a download mode and waits for data
> + * on USB OTG and UART0.
> + */
> + ldr r2, =BOOT_BROM_DOWNLOAD
> + ldr r3, =CONFIG_ROCKCHIP_BOOT_MODE_REG
> + ldr r0, [r3] /* if (readl(CONFIG_ROCKCHIP_BOOT_MODE_REG) != */
> + cmp r0, r2 /* BOOT_BROM_DOWNLOAD) { */
> + bne early_return /* goto early_return; */
> + /* } else { */
> + mov r0, #0
> + str r0, [r3] /* writel(0, CONFIG_ROCKCHIP_BOOT_MODE_REG); */
> +
> + ldr r3, =CONFIG_ROCKCHIP_BOOT_RETURN_REG
> + bx r3 /* return to CONFIG_ROCKCHIP_BOOT_RETURN_REG;*/
> + /* } */
> +early_return:
> + bx lr /* return to LR in BROM */
> +
> +SAVE_SP_ADDR:
> + .word 0
> +
> + .globl save_boot_params
> +save_boot_params:
> + push {r1-r12, lr}
> + ldr r0, =SAVE_SP_ADDR
> + str sp, [r0]
> + b save_boot_params_ret
> +
> + .globl back_to_bootrom
> +back_to_bootrom:
> + ldr r0, =SAVE_SP_ADDR
> + ldr sp, [r0]
> + mov r0, #0
> + pop {r1-r12, pc}
> +#endif
> +
> +#if (defined(CONFIG_SPL_BUILD))
> +/* U-Boot proper of armv7 does not need this */
> + b reset
> +#endif
> +
> +/*
> + * For armv7, the addr '_start' will be used as vector start address
> + * and is written to the VBAR register, which needs to aligned to 0x20.
> + */
> + .align(5), 0x0
> +_start:
> + ARM_VECTORS
> #endif
> diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
> index c43c185c17c5..6c56324f66bc 100644
> --- a/arch/arm/mach-rockchip/Kconfig
> +++ b/arch/arm/mach-rockchip/Kconfig
> @@ -401,7 +401,7 @@ config SPL_ROCKCHIP_BACK_TO_BROM
> config TPL_ROCKCHIP_BACK_TO_BROM
> bool "TPL returns to bootrom"
> default y
> - select ROCKCHIP_BROM_HELPER
> + select ROCKCHIP_BROM_HELPER if !ROCKCHIP_RK3066
> select TPL_BOOTROM_SUPPORT
> depends on TPL
> help
> diff --git a/arch/arm/mach-rockchip/rk3066/Kconfig b/arch/arm/mach-rockchip/rk3066/Kconfig
> index 95d7fc8a2917..4a79a829adec 100644
> --- a/arch/arm/mach-rockchip/rk3066/Kconfig
> +++ b/arch/arm/mach-rockchip/rk3066/Kconfig
> @@ -10,6 +10,14 @@ config TARGET_MK808
> config ROCKCHIP_BOOT_MODE_REG
> default 0x20004040
>
> +config ROCKCHIP_BOOT_LR_REG
> + hex
> + default 0x00001058
> +
> +config ROCKCHIP_BOOT_RETURN_REG
> + hex
> + default 0x00001100
> +
> config SYS_SOC
> default "rk3066"
>
> --
> 2.39.2
>
More information about the U-Boot
mailing list