rockchip: unify boot mode in rockchip_get_boot_mode()

There are two ways to get boot mode: misc partition and
CONFIG_ROCKCHIP_BOOT_MODE_REG, we unify them in the
rockchip_get_boot_mode() function.

Change-Id: Ia2dd452e8df8a8d736300048f131ed43ec2ec3a3
Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
Joseph Chen 2017-12-08 16:18:00 +08:00 committed by Kever Yang
parent d2975239b8
commit b7195498ca
3 changed files with 58 additions and 30 deletions

View File

@ -11,6 +11,7 @@
#include <cli.h> #include <cli.h>
#include <dm.h> #include <dm.h>
#include <fdtdec.h> #include <fdtdec.h>
#include <boot_rkimg.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
@ -67,23 +68,15 @@ void rockchip_dnl_mode_check(void)
int setup_boot_mode(void) int setup_boot_mode(void)
{ {
void *reg; int boot_mode = BOOT_MODE_NORMAL;
int boot_mode;
char env_preboot[256] = {0}; char env_preboot[256] = {0};
rockchip_dnl_mode_check(); rockchip_dnl_mode_check();
#ifdef CONFIG_RKIMG_BOOTLOADER
reg = (void *)CONFIG_ROCKCHIP_BOOT_MODE_REG; boot_mode = rockchip_get_boot_mode();
#endif
boot_mode = readl(reg);
debug("boot mode %x.\n", boot_mode);
/* Clear boot mode */
writel(BOOT_NORMAL, reg);
switch (boot_mode) { switch (boot_mode) {
case BOOT_FASTBOOT: case BOOT_MODE_BOOTLOADER:
printf("enter fastboot!\n"); printf("enter fastboot!\n");
#if defined(CONFIG_FASTBOOT_FLASH_MMC_DEV) #if defined(CONFIG_FASTBOOT_FLASH_MMC_DEV)
snprintf(env_preboot, 256, snprintf(env_preboot, 256,
@ -95,19 +88,19 @@ int setup_boot_mode(void)
#endif #endif
env_set("preboot", env_preboot); env_set("preboot", env_preboot);
break; break;
case BOOT_UMS: case BOOT_MODE_UMS:
printf("enter UMS!\n"); printf("enter UMS!\n");
env_set("preboot", "setenv preboot; ums mmc 0"); env_set("preboot", "setenv preboot; ums mmc 0");
break; break;
case BOOT_LOADER: case BOOT_MODE_LOADER:
printf("enter Rockusb!\n"); printf("enter Rockusb!\n");
env_set("preboot", "setenv preboot; rockusb 0 mmc 0"); env_set("preboot", "setenv preboot; rockusb 0 mmc 0");
break; break;
case BOOT_CHARGING: case BOOT_MODE_CHARGING:
printf("enter charging!\n"); printf("enter charging!\n");
env_set("preboot", "setenv preboot; charge"); env_set("preboot", "setenv preboot; charge");
break; break;
case BOOT_RECOVERY: case BOOT_MODE_RECOVERY:
printf("enter Recovery mode!\n"); printf("enter Recovery mode!\n");
env_set("reboot_mode", "recovery"); env_set("reboot_mode", "recovery");
break; break;

View File

@ -12,6 +12,8 @@
#include <asm/arch/resource_img.h> #include <asm/arch/resource_img.h>
#include <asm/arch/rockchip_crc.h> #include <asm/arch/rockchip_crc.h>
#include <boot_rkimg.h> #include <boot_rkimg.h>
#include <asm/arch/boot_mode.h>
#include <asm/io.h>
#define TAG_KERNEL 0x4C4E524B #define TAG_KERNEL 0x4C4E524B
@ -186,6 +188,7 @@ int rockchip_get_boot_mode(void)
int size = DIV_ROUND_UP(sizeof(struct bootloader_message), RK_BLK_SIZE) int size = DIV_ROUND_UP(sizeof(struct bootloader_message), RK_BLK_SIZE)
* RK_BLK_SIZE; * RK_BLK_SIZE;
int ret; int ret;
uint32_t reg_boot_mode;
if (boot_mode != -1) if (boot_mode != -1)
return boot_mode; return boot_mode;
@ -201,22 +204,50 @@ int rockchip_get_boot_mode(void)
part_info.start + BOOTLOADER_MESSAGE_BLK_OFFSET, part_info.start + BOOTLOADER_MESSAGE_BLK_OFFSET,
size >> 9, bmsg); size >> 9, bmsg);
if (ret != (size >> 9)) { if (ret != (size >> 9)) {
ret = -EIO; free(bmsg);
goto err; return -EIO;
} }
/* Mode from misc partition */
if (!strcmp(bmsg->command, "boot-recovery")) { if (!strcmp(bmsg->command, "boot-recovery")) {
printf("boot mode: recovery\n"); boot_mode = BOOT_MODE_RECOVERY;
ret = BOOT_MODE_RECOVERY;
} else { } else {
printf("boot mode: normal\n"); /* Mode from boot mode register */
ret = BOOT_MODE_NORMAL; reg_boot_mode = readl((void *)CONFIG_ROCKCHIP_BOOT_MODE_REG);
} writel(BOOT_NORMAL, (void *)CONFIG_ROCKCHIP_BOOT_MODE_REG);
boot_mode = ret;
err:
free(bmsg);
return ret; switch (reg_boot_mode) {
case BOOT_NORMAL:
printf("boot mode: normal\n");
boot_mode = BOOT_MODE_NORMAL;
break;
case BOOT_FASTBOOT:
printf("boot mode: bootloader\n");
boot_mode = BOOT_MODE_BOOTLOADER;
break;
case BOOT_LOADER:
printf("boot mode: loader\n");
boot_mode = BOOT_MODE_LOADER;
break;
case BOOT_RECOVERY:
/* printf("boot mode: recovery\n"); */
boot_mode = BOOT_MODE_RECOVERY;
break;
case BOOT_UMS:
printf("boot mode: ums\n");
boot_mode = BOOT_MODE_UMS;
break;
case BOOT_CHARGING:
printf("boot mode: charging\n");
boot_mode = BOOT_MODE_CHARGING;
break;
default:
printf("boot mode: None\n");
boot_mode = BOOT_MODE_UNDEFINE;
}
}
return boot_mode;
} }
int boot_rockchip_image(struct blk_desc *dev_desc, disk_partition_t *boot_part) int boot_rockchip_image(struct blk_desc *dev_desc, disk_partition_t *boot_part)

View File

@ -11,10 +11,14 @@
enum _boot_mode { enum _boot_mode {
BOOT_MODE_NORMAL = 0, BOOT_MODE_NORMAL = 0,
BOOT_MODE_RECOVERY, BOOT_MODE_RECOVERY,
BOOT_MODE_BOOTLOADER, BOOT_MODE_BOOTLOADER, /* Android: Fastboot mode */
BOOT_MODE_LOADER, /* Rockchip: Rockusb download mode */
BOOT_MODE_CHARGING,
BOOT_MODE_UMS,
BOOT_MODE_BROM_DOWNLOAD,
BOOT_MODE_UNDEFINE,
}; };
#define PART_MISC "misc" #define PART_MISC "misc"
#define PART_KERNEL "kernel" #define PART_KERNEL "kernel"
#define PART_BOOT "boot" #define PART_BOOT "boot"