[RK3288][Android6.0] 使用SD卡升级固件流程分析

Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92

uboot: v2014.10


u-boot开机时会先读取sd卡,制作的sd卡固件里有升级标志.

sdmmcBoot.c:
uint32 SdmmcInit(uint32 ChipSel)
{
    ......
#ifdef RK_SDCARD_BOOT_EN
        if (ChipSel == 0) {
            if (gIdDataBuf[0] == 0xFCDC8C3B) {
                gSdCardInfoTbl[ChipSel].FwPartOffset = SD_CARD_FW_PART_OFFSET;
                if (0 == gIdDataBuf[128 + 104 / 4]) { /* sd*/
                    gsdboot_mode = SDMMC_SDCARD_UPDATE;
                    PRINT_E("SDCard Update.\n");
                } else if (1 == gIdDataBuf[128 + 104 / 4]) { /* sd ¿¨ÔËÐÐ */
......
}
接着开机获取reboot类型
fastboot.c:
board_fbt_get_reboot_type()
{
......
#ifdef CONFIG_RK_SDCARD_BOOT_EN
        if (StorageSDCardUpdateMode()) {
            /* detect sd card update, audo entern recovery */
            frt = FASTBOOT_REBOOT_RECOVERY;
        }
#endif
......
}
storage.c:
bool StorageSDCardUpdateMode(void)
{
    if ((StorageGetBootMedia() == BOOT_FROM_SD0) && (SdmmcGetSDCardBootMode() == SDMMC_SDCARD_UPDATE))
        return true;

    return false;
}
sdmmcBoot.c
uint32 SdmmcGetSDCardBootMode(void)
{
    return gsdboot_mode;
}

调用的就是一开始设置的gsdboot_mode,因此开机会进入recovery mode.

另外rk_commandline_setenv()中会设置cmdline
cmd_bootrk.c:
static void rk_commandline_setenv(const char *boot_name, rk_boot_img_hdr *hdr, bool charge)
{
......
#ifdef CONFIG_RK_SDCARD_BOOT_EN
    if (StorageSDCardUpdateMode()) { /* sdcard undate */
        snprintf(command_line, sizeof(command_line),
                "%s %s", command_line, "sdfwupdate");
    }
#endif
......
}


再看进入recovery mode的代码:
rkimage.cpp:
int check_sdboot(void)
{
    char param[1024];
    int fd, ret;
    char *s=NULL;
    printf("read cmdline\n");
    memset(param,0,1024);
    fd= open("/proc/cmdline", O_RDONLY);
    ret = read(fd, (char*)param, 1024);
    s = strstr(param,"sdfwupdate");
    if(s!= NULL)
    return 0;
    else
    return -1;
}
从cmdline中读取是否有sdfwupdate字样,有就执行升级.

目前拿到的code中只有接口,没有具体实现的地方,RK以后应该会完善.

你可能感兴趣的:(子类__SD,EMMC)