天天看點

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