天天看點

mtk啟動流程簡析

最近想弄明白mtk平台的整個啟動流程,形成09所說的“大局觀”,但是mtk的目錄實在是太亂了,搞了半天才從網上看到一篇文章,搞明白啟動流程。

原文位址:http://h1372865100.blog.163.com/blog/static/2104291032013319111038319

(meidatek\platform\mt6589\preloader\src\core\main.c)main()--->bldr_pre_process()--->

(meidatek\platform\mt6589\preloader\src\drivers\platform.c)platform_pre_init():這裡主要是初始化序列槽和PMIC

(meidatek\platform\mt6589\preloader\src\drivers\platform.c)platform_init():這裡主要是初始化看門狗和USB裝置,檢測是否是下載下傳模式,初始化記憶體分區

上面這個main函數的主要是用來判斷開機模式的,特别是判斷是否下載下傳模式,如果是正常啟動模式,則加載UBOOT代碼,跳轉到下一個代碼段運作,if (bldr_load_part(PART_UBOOT, bootdev, &addr) != 0),

bldr_jump(addr, BOOT_ARGUMENT_ADDR, sizeof(boot_arg_t))。BOOT_ARGUMENT_ADDR是UBOOT代碼段存放的起始位址。

下面進入bootloader階段,其實是一個lk,即little linux--->

(bootable\bootloader\lk\kernel\main.c)kmain()--->(meidatek\platform\platform.c)platform_early_init:這裡主要是初始化中斷、LCM和PMIC,注意這裡是開機第一次初始化LCM顯示,但是沒有列印出LOG,原因是初始化LCM的代碼在UART初始化之前,g_fb_size = mt_disp_get_vram_size();可以進入這個函數仔細研究。

(bootable\bootloader\lk\kernel\main.c)kmain()--->thread_resume--->(meidatek\platform\platform.c)platform_init():這裡做的事情就多了,開背光,加載顯示LOGO圖檔,初始化充電電池==

執行完這個main函數後就開始真正開機了,但還是需要一個boot引導,這個是一個fastboot,如下--->

(bootable\bootloader\lk\app\mt_boot\sys_commonds.c)cmd_boot--->

(bootable\bootloader\lk\app\mt_boot\mt_boot.c)boot_linux--->這裡就真正跳到linux核心那裡去了

繼續閱讀