添加recovery mode 的判断

1、主要函数说明

strstr(str1,str2);

函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

int snprintf(char *restrict buf, size_t n, const char * restrictformat, ...);

函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n的话,将不会溢出。

run_command

这个函数主要是对用户输入的命令进行语法分析,从中获取命令,参数等信息,并查找一张系统保存的命令表,找到该命令对应的处理函数。

并调用它来处理这个命令。

void *memcpy(void *dest, const void *src, size_t n);

功能:

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中所需头文件:


struct bootloader_message {

char command[32];

char status[32];

char recovery[768];

char stage[32];

char reserved[224];

};

int get_bootloader_message(struct bootloader_message *out)

{

char str[64] = {0, };

unsigned long long start = 0;

unsigned long long count = 0;

unsigned char pid = 0;

char buf[1024] = {0, };

if (get_boot_part_info(0, PART_MISC, &start, &count, &pid) == -1) {

printf("failed get LOG partition info.\n");

return 0;

}

snprintf(str, 64, "mmc read %u 0x%x 0x%x 2", 0, buf, start);

dbg("%s\n", str);

run_command(str, 0);

memcpy(out, buf, sizeof(struct bootloader_message));

return 0;

}

static int check_misc_mode(void)

{

struct bootloader_message bootmessage;

get_bootloader_message(&bootmessage);

if (strstr(bootmessage.command, "boot-recovery")) {

printf("%s: boot-recovery\n",__func__);

return 1;

}

return 0;

}


static void check_reboot_flag(void)

{

int reboot_flag = 0;

char bootcmd[150] = {0, };

if(*(unsigned int *)CONFIG_SYS_SDRAM_BASE != 0xabcdef) {

printf("Running on DRAM by TRACE32: skip recovery mode check\n");

return 0;

}

reboot_flag = readl(EXYNOS7872_POWER_SYSIP_DAT0);

if ( check_misc_mode() )

reboot_flag = REBOOT_MODE_RECOVERY;

switch(reboot_flag) {

case REBOOT_MODE_FASTBOOT:

snprintf(bootcmd, 150, "fastboot");

setenv("bootcmd", bootcmd);

writel(0, EXYNOS7872_POWER_SYSIP_DAT0);

#if defined(CONFIG_EXIT_FASTBOOT)

force_exit_manual_reset();

你可能感兴趣的:(添加recovery mode 的判断)