1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-29 22:41:17 +02:00

rockchip: add option to change method of loading u-boot

If we would like to boot from SD card, we have to implement mmc driver
in SPL stage, and get a slightly large SPL binary. Rockchip SoC's
bootrom code has the ability to load spl and u-boot, then boot.

If CONFIG_ROCKCHIP_SPL_BACK_TO_BROM is enabled, the spl will return to
bootrom in board_init_f(), then bootrom loads u-boot binary.

Loading sequence after rework:
bootrom ==> spl ==> bootrom ==> u-boot

Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
Acked-by: Simon Glass <sjg@chromium.org>
Fixed up spelling of U-Boot, boorom, opinion->option, Rochchip:
Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Xu Ziyuan
2016-07-12 19:09:49 +08:00
committed by Simon Glass
parent 4579720412
commit b47ea79219
8 changed files with 66 additions and 3 deletions

View File

@@ -17,6 +17,14 @@ config ROCKCHIP_RK3036
and video codec support. Peripherals include Gigabit Ethernet, and video codec support. Peripherals include Gigabit Ethernet,
USB2 host and OTG, SDIO, I2S, UART, SPI, I2C and PWMs. USB2 host and OTG, SDIO, I2S, UART, SPI, I2C and PWMs.
config ROCKCHIP_SPL_BACK_TO_BROM
bool "SPL returns to bootrom"
default y if ROCKCHIP_RK3036
help
Rockchip SoCs have ability to load SPL & U-Boot binary. If enabled,
SPL will return to the boot rom, which will then load the U-Boot
binary to keep going on.
source "arch/arm/mach-rockchip/rk3288/Kconfig" source "arch/arm/mach-rockchip/rk3288/Kconfig"
source "arch/arm/mach-rockchip/rk3036/Kconfig" source "arch/arm/mach-rockchip/rk3036/Kconfig"
endif endif

View File

@@ -7,6 +7,7 @@
ifdef CONFIG_SPL_BUILD ifdef CONFIG_SPL_BUILD
obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board-spl.o obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board-spl.o
obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o
obj-$(CONFIG_ROCKCHIP_SPL_BACK_TO_BROM) += save_boot_param.o
else else
obj-$(CONFIG_ROCKCHIP_RK3288) += board.o obj-$(CONFIG_ROCKCHIP_RK3288) += board.o
endif endif

View File

@@ -10,12 +10,45 @@
#include <ram.h> #include <ram.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/arch/clock.h> #include <asm/arch/clock.h>
#include <asm/arch/periph.h>
#include <asm/gpio.h>
#include <dm/pinctrl.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
int board_init(void) int board_init(void)
{ {
#ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
struct udevice *pinctrl;
int ret;
/*
* We need to implement sdcard iomux here for the further
* initlization, otherwise, it'll hit sdcard command sending
* timeout exception.
*/
ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
if (ret) {
debug("%s: Cannot find pinctrl device\n", __func__);
goto err;
}
ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
if (ret) {
debug("%s: Failed to set up SD card\n", __func__);
goto err;
}
return 0; return 0;
err:
printf("board_init: Error %d\n", ret);
/* No way to report error here */
hang();
return -1;
#else
return 0;
#endif
} }
int dram_init(void) int dram_init(void)

View File

@@ -10,4 +10,3 @@ obj-y += syscon_rk3036.o
endif endif
obj-y += sdram_rk3036.o obj-y += sdram_rk3036.o
obj-y += save_boot_param.o

View File

@@ -149,7 +149,7 @@ static int configure_emmc(struct udevice *pinctrl)
return 0; return 0;
} }
#endif #endif
extern void back_to_bootrom(void);
void board_init_f(ulong dummy) void board_init_f(ulong dummy)
{ {
struct udevice *pinctrl; struct udevice *pinctrl;
@@ -204,6 +204,9 @@ void board_init_f(ulong dummy)
debug("DRAM init failed: %d\n", ret); debug("DRAM init failed: %d\n", ret);
return; return;
} }
#ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
back_to_bootrom();
#endif
} }
static int setup_led(void) static int setup_led(void)

View File

@@ -1,5 +1,5 @@
/* /*
* (C) Copyright 2015 Google, Inc * (C) Copyright 2016 Rockchip Electronics Co., Ltd
* *
* SPDX-License-Identifier: GPL-2.0+ * SPDX-License-Identifier: GPL-2.0+
*/ */

View File

@@ -119,6 +119,20 @@ something like:
Hit any key to stop autoboot: 0 Hit any key to stop autoboot: 0
=> =>
The rockchip bootrom can load and boot an initial spl, then continue to
load a second-level bootloader(ie. U-BOOT) as soon as it returns to bootrom.
Therefore RK3288 has another loading sequence like RK3036. The option of
U-Boot is controlled with this setting in U-Boot:
#define CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
You can create the image via the following operations:
./firefly-rk3288/tools/mkimage -n rk3288 -T rksd -d \
firefly-rk3288/spl/u-boot-spl-dtb.bin out && \
cat firefly-rk3288/u-boot-dtb.bin >> out && \
sudo dd if=out of=/dev/sdc seek=64
If you have an HDMI cable attached you should see a video console. If you have an HDMI cable attached you should see a video console.
For evb_rk3036 board: For evb_rk3036 board:

View File

@@ -33,7 +33,12 @@
#define CONFIG_SYS_NS16550_MEM32 #define CONFIG_SYS_NS16550_MEM32
#define CONFIG_SPL_BOARD_INIT #define CONFIG_SPL_BOARD_INIT
#ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
/* Bootrom will load u-boot binary to 0x0 once return from SPL */
#define CONFIG_SYS_TEXT_BASE 0x00000000
#else
#define CONFIG_SYS_TEXT_BASE 0x00100000 #define CONFIG_SYS_TEXT_BASE 0x00100000
#endif
#define CONFIG_SYS_INIT_SP_ADDR 0x00100000 #define CONFIG_SYS_INIT_SP_ADDR 0x00100000
#define CONFIG_SYS_LOAD_ADDR 0x00800800 #define CONFIG_SYS_LOAD_ADDR 0x00800800
#define CONFIG_SPL_STACK 0xff718000 #define CONFIG_SPL_STACK 0xff718000