]> git.sur5r.net Git - u-boot/commitdiff
rockchip: add boot-mode support for rk3288, rk3036
authorJacob Chen <jacob2.chen@rock-chips.com>
Mon, 19 Sep 2016 10:46:28 +0000 (18:46 +0800)
committerSimon Glass <sjg@chromium.org>
Sun, 2 Oct 2016 00:36:55 +0000 (18:36 -0600)
rockchip platform have a protocol to pass the the kernel reboot mode to bootloader
by some special registers when system reboot. In bootloader we should read it and take action.

We can only setup boot_mode in board_late_init becasue "setenv" need env setuped.
So add CONFIG_BOARD_LATE_INIT to common header and use a entry "rk_board_late_init"
to replace "board_late_init" in board file.

Signed-off-by: Jacob Chen <jacob2.chen@rock-chips.com>
Acked-by: Simon Glass <sjg@chromium.org>
arch/arm/include/asm/arch-rockchip/boot_mode.h [new file with mode: 0644]
arch/arm/mach-rockchip/rk3036-board.c
arch/arm/mach-rockchip/rk3288-board.c
board/rockchip/kylin_rk3036/kylin_rk3036.c
include/configs/kylin_rk3036.h
include/configs/rk3036_common.h
include/configs/rk3288_common.h

diff --git a/arch/arm/include/asm/arch-rockchip/boot_mode.h b/arch/arm/include/asm/arch-rockchip/boot_mode.h
new file mode 100644 (file)
index 0000000..bd65f60
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef __REBOOT_MODE_H
+#define __REBOOT_MODE_H
+
+/* high 24 bits is tag, low 8 bits is type */
+#define REBOOT_FLAG            0x5242C300
+/* normal boot */
+#define BOOT_NORMAL            (REBOOT_FLAG + 0)
+/* enter loader rockusb mode */
+#define BOOT_LOADER            (REBOOT_FLAG + 1)
+/* enter recovery */
+#define BOOT_RECOVERY          (REBOOT_FLAG + 3)
+/* enter fastboot mode */
+#define BOOT_FASTBOOT          (REBOOT_FLAG + 9)
+/* enter charging mode */
+#define BOOT_CHARGING          (REBOOT_FLAG + 11)
+/* enter usb mass storage mode */
+#define BOOT_UMS               (REBOOT_FLAG + 12)
+
+#endif
index b63f9c0dde67ab9da93903e78782858cf498f859..bf2b268f8b22b6370d02fe248980f99437d951ed 100644 (file)
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/periph.h>
+#include <asm/arch/grf_rk3036.h>
+#include <asm/arch/boot_mode.h>
+#include <asm/arch/sdram_rk3036.h>
 #include <asm/gpio.h>
 #include <dm/pinctrl.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#define GRF_BASE       0x20008000
+
+static void setup_boot_mode(void)
+{
+       struct rk3036_grf *const grf = (void *)GRF_BASE;
+       int boot_mode = readl(&grf->os_reg[4]);
+
+       debug("boot mode %x.\n", boot_mode);
+
+       /* Clear boot mode */
+       writel(BOOT_NORMAL, &grf->os_reg[4]);
+
+       switch (boot_mode) {
+       case BOOT_FASTBOOT:
+               printf("enter fastboot!\n");
+               setenv("preboot", "setenv preboot; fastboot usb0");
+               break;
+       case BOOT_UMS:
+               printf("enter UMS!\n");
+               setenv("preboot", "setenv preboot; ums mmc 0");
+               break;
+       }
+}
+
+__weak int rk_board_late_init(void)
+{
+       return 0;
+}
+
+int board_late_init(void)
+{
+       setup_boot_mode();
+
+       return rk_board_late_init();
+}
+
 int board_init(void)
 {
        return 0;
index 6c36bf93977dac7be6f95d4c379beac5df30dfa7..baf9522bcdd87a0ddc5e2bcd144beb83e588c764 100644 (file)
@@ -8,25 +8,65 @@
 #include <clk.h>
 #include <dm.h>
 #include <ram.h>
+#include <syscon.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/periph.h>
+#include <asm/arch/pmu_rk3288.h>
+#include <asm/arch/boot_mode.h>
 #include <asm/gpio.h>
 #include <dm/pinctrl.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#define PMU_BASE       0xff730000
+
+static void setup_boot_mode(void)
+{
+       struct rk3288_pmu *const pmu = (void *)PMU_BASE;
+       int boot_mode = readl(&pmu->sys_reg[0]);
+
+       debug("boot mode %x.\n", boot_mode);
+
+       /* Clear boot mode */
+       writel(BOOT_NORMAL, &pmu->sys_reg[0]);
+
+       switch (boot_mode) {
+       case BOOT_FASTBOOT:
+               printf("enter fastboot!\n");
+               setenv("preboot", "setenv preboot; fastboot usb0");
+               break;
+       case BOOT_UMS:
+               printf("enter UMS!\n");
+               setenv("preboot", "setenv preboot; if mmc dev 0;"
+                      "then ums mmc 0; else ums mmc 1;fi");
+               break;
+       }
+}
+
+__weak int rk_board_late_init(void)
+{
+       return 0;
+}
+
+int board_late_init(void)
+{
+       setup_boot_mode();
+
+       return rk_board_late_init();
+}
+
 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.
-     */
+       /*
+        * 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__);
index 848f23d1a6a3e16cacb559c9e7a136d4838b8fe7..7e2edf4a566a3f3dd4a7b6d275cb65551982e3ca 100644 (file)
@@ -8,14 +8,11 @@
 #include <dm.h>
 #include <asm/io.h>
 #include <asm/arch/uart.h>
-#include <asm/arch-rockchip/grf_rk3036.h>
 #include <asm/arch/sdram_rk3036.h>
 #include <asm/gpio.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define GRF_BASE       0x20008000
-
 void get_ddr_config(struct rk3036_ddr_config *config)
 {
        /* K4B4G1646Q config */
@@ -43,16 +40,9 @@ int fastboot_key_pressed(void)
 
 #define ROCKCHIP_BOOT_MODE_FASTBOOT    0x5242C309
 
-int board_late_init(void)
+int rk_board_late_init(void)
 {
-       struct rk3036_grf * const grf = (void *)GRF_BASE;
-       int boot_mode = readl(&grf->os_reg[4]);
-
-       /* Clear boot mode */
-       writel(0, &grf->os_reg[4]);
-
-       if (boot_mode == ROCKCHIP_BOOT_MODE_FASTBOOT ||
-           fastboot_key_pressed()) {
+       if (fastboot_key_pressed()) {
                printf("enter fastboot!\n");
                setenv("preboot", "setenv preboot; fastboot usb0");
        }
index 39fb2393e36819e1866243bbdc93c8a85534354c..4f0bd84ad825997636b0caca2de3e08a8b3e61fb 100644 (file)
@@ -25,7 +25,4 @@
 
 #endif
 
-#define CONFIG_BOARD_LATE_INIT
-#define CONFIG_PREBOOT
-
 #endif
index 6ddf0d9f4b8dcac27632f96515d1e2d08c890362..73830e4aa5330dd858ffdc73843a384ae5e5e965 100644 (file)
        BOOTENV
 #endif
 
+#define CONFIG_BOARD_LATE_INIT
+#define CONFIG_PREBOOT
+
 #endif
index e8bf9878f24e586f82ecd177511e111c86a9f7ee..9ddfe1daeb6c2a1553925c1330c798396a385021 100644 (file)
        BOOTENV
 #endif
 
+#define CONFIG_BOARD_LATE_INIT
+#define CONFIG_PREBOOT
+
 #endif