diff --git a/arch/arm/mach-rockchip/boot_mode.c b/arch/arm/mach-rockchip/boot_mode.c index d0dbff3bb8..42b01c7d48 100644 --- a/arch/arm/mach-rockchip/boot_mode.c +++ b/arch/arm/mach-rockchip/boot_mode.c @@ -11,6 +11,7 @@ #include #include #include +#include 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; diff --git a/common/boot_rkimg.c b/common/boot_rkimg.c index 54d3f6fb79..819162f2ba 100644 --- a/common/boot_rkimg.c +++ b/common/boot_rkimg.c @@ -12,6 +12,8 @@ #include #include #include +#include +#include #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) diff --git a/include/boot_rkimg.h b/include/boot_rkimg.h index f59bf2e41b..d5078e846b 100644 --- a/include/boot_rkimg.h +++ b/include/boot_rkimg.h @@ -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"