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();