天天看点

mtk preloader源码简析

PL_PROFILING:打开时间计算log

main

mtk_uart_init //初始化串口

bldr_pre_process

platform_pre_init //essential hardware initialization

g_boot_mode = NORMAL_BOOT; //默认启动模式为正常模式

platform_init

mtk_wdt_init(); //初始化看门狗

set_kpd_pmic_mode(); //初始化按键键盘

g_boot_reason = reason = platform_boot_status(); //检测启动状态

if(rtc_boot_check() //返回0

if (mtk_wdt_boot_check() == WDT_NORMAL_REBOOT) { //检测看门狗的状态,看是系统重启事件还是按住电源键重启事件

print(“%s WDT normal boot!\n”, MOD);

rtc_clean_debug(); //if reboot the system,clearn the debug bit

return BR_WDT;

} else if (mtk_wdt_boot_check() == WDT_BY_PASS_PWK_REBOOT){

print(“%s WDT reboot bypass power key!\n”, MOD);

return BR_WDT_BY_PASS_PWK;

}

if (mtk_detect_key(PL_PMIC_PWR_KEY) && hw_check_battery()) { //检测电源按键状态,若电池插上且电源键按下,

print(“%s Power key boot!\n”, MOD); //返回BR_POWER_KEY事件

rtc_mark_bypass_pwrkey(); //hw_check_battery写死返回1

return BR_POWER_KEY;

}

if (usb_accessory_in()) //如果没有按下power键,插入usb充电线,执行这里,返回BR_USB事件

if (reason == BR_RTC || reason == BR_POWER_KEY || reason == BR_USB || reason == BR_WDT || reason == BR_WDT_BY_PASS_PWK || reason == BR_2SEC_REBOOT)

rtc_bbpu_power_on();

enable_PMIC_kpd_clock();

init_dram_buffer();

ram_console_init();

ram_console_reboot_reason_save(g_rgu_status);

boot_device_init();

if (mtk_detect_dl_keys()) { //如果按下download按键,进入下载模式,烧写镜像

platform_emergency_download(CFG_EMERGENCY_DL_TIMEOUT_MS);

}

if(mode == NORMAL_BOOT)

uart_handshake_init(); //串口握手初始化

bldr_handshake(&handler); //bootloader握手

case NORMAL_BOOT:

usb_handshake(handler) //usb下载软件握手,可以设置usb设置枚举超时时间和等待下载时间超时时间

g_meta_com_type = META_USB_COM; //握手成功返回META_USB_COM

uart_handshake(handler) //串口下载软件握手

g_meta_com_type = META_UART_COM; //握手成功返回META_UART_COM

bldr_load_images(&jump_addr) //读取bootloader的镜像

bldr_post_process

platform_post_init() //电池检测

platform_set_boot_args(); /设置启动参数

bootarg.boot_reason = g_boot_reason;

bldr_jump(jump_addr, jump_arg, sizeof(boot_arg_t)); 跳转到bootloader地址运行