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位址運作