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

View File

@ -12,6 +12,8 @@
#include <asm/arch/resource_img.h>
#include <asm/arch/rockchip_crc.h>
#include <boot_rkimg.h>
#include <asm/arch/boot_mode.h>
#include <asm/io.h>
#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)
* RK_BLK_SIZE;
int ret;
uint32_t reg_boot_mode;
if (boot_mode != -1)
return boot_mode;
@ -201,22 +204,50 @@ int rockchip_get_boot_mode(void)
part_info.start + BOOTLOADER_MESSAGE_BLK_OFFSET,
size >> 9, bmsg);
if (ret != (size >> 9)) {
ret = -EIO;
goto err;
free(bmsg);
return -EIO;
}
/* Mode from misc partition */
if (!strcmp(bmsg->command, "boot-recovery")) {
printf("boot mode: recovery\n");
ret = BOOT_MODE_RECOVERY;
boot_mode = BOOT_MODE_RECOVERY;
} else {
printf("boot mode: normal\n");
ret = BOOT_MODE_NORMAL;
}
boot_mode = ret;
err:
free(bmsg);
/* Mode from boot mode register */
reg_boot_mode = readl((void *)CONFIG_ROCKCHIP_BOOT_MODE_REG);
writel(BOOT_NORMAL, (void *)CONFIG_ROCKCHIP_BOOT_MODE_REG);
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)

View File

@ -11,10 +11,14 @@
enum _boot_mode {
BOOT_MODE_NORMAL = 0,
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_KERNEL "kernel"
#define PART_BOOT "boot"