close

0. 概述

U-Boot通常是從架構相關的匯編文件(尾綴為大寫S的匯編文件意為可鏈接)中獲取第一條執行的指令,例如:

-arch/arm/cpu/armv7/start.S-arch/powerpc/cpu/mpc83xx/start.S-arch/mips/cpu/start.S

在以上所列出的匯編文件中,主要執行如下三個函數:

lowlevel_init()board_init_f()board_init_r()

完整的執行流程如下圖所示:

U-Boot代碼執行流程1. lowlevel_init()

不同架構類型的處理器會單獨定義lowlevel_init.S文件,例如:

./arch/arm/cpu/armv7/lowlevel_init.S./arch/arm/cpu/armv8/lowlevel_init.S./arch/mips/mach-ath79/ar933x/lowlevel_init.S

該函數的基本功能是使得CPU可以獲取、執行到board_init_f()函數。在此函數中沒有棧信息,不能設置SDRAM和控制台。

.pushsection .text.lowlevel_init, "ax"WEAK(lowlevel_init)#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK) ldr sp, =CONFIG_SPL_STACK#else ldr sp, =CONFIG_SYS_INIT_SP_ADDR#endif bic sp, sp, #7 /* 8-byte alignment for ABI compliance */#ifdef CONFIG_SPL_DM mov r9, #0#else#ifdef CONFIG_SPL_BUILD ldr r9, =gdata#else sub sp, sp, #GD_SIZE bic sp, sp, #7 mov r9, sp#endif#endif push {ip, lr} bl s_init pop {ip, pc}ENDPROC(lowlevel_init).popsection2. board_init_f()

為執行board_init_r做準備,需要初始化兩個關鍵功能:SDRAM和串口。在此階段,global_data已經可以使用,棧信息位於SRAM中。由於BSS段仍然無法使用,因此,不可以使用全局/靜態變量。

若U-Boot中開啟了SPL功能,則在common/spl.c代碼中可以實現該函數,否則,通常以common/board_f.c中實現為準。

board_init_f()中調用的函數在數組init_sequence_f[]中定義:

staticconstinit_fnc_tinit_sequence_f[]={setup_mon_len,......env_init,/*initializeenvironment*/init_baud_rate,/*initialzebaudratesettings*/serial_init,/*serialcommunicationssetup*/console_init_f,/*stage1initofconsole*/display_options,/*saythatwearehere*/display_text_info,/*showdebugginginfoifrequired*/checkcpu,#ifdefined(CONFIG_SYSRESET)print_resetinfo,#endif#ifdefined(CONFIG_DISPLAY_CPUINFO)print_cpuinfo,/*displaycpuinfo(andspeed)*/#endif#ifdefined(CONFIG_DTB_RESELECT)embedded_dtb_select,#endif#ifdefined(CONFIG_DISPLAY_BOARDINFO)show_board_info,#endifINIT_FUNC_WATCHDOG_INIT#ifdefined(CONFIG_MISC_INIT_F)misc_init_f,#endifINIT_FUNC_WATCHDOG_RESET#ifdefined(CONFIG_SYS_I2C)init_func_i2c,#endif#ifdefined(CONFIG_VID)&&!defined(CONFIG_SPL)init_func_vid,#endifannounce_dram_init,dram_init,/*configureavailableRAMbanks*/#ifdefCONFIG_POSTpost_init_f,#endif......#if!defined(CONFIG_ARM)&&!defined(CONFIG_SANDBOX)&&\!CONFIG_IS_ENABLED(X86_64)jump_to_copy,#endifNULL,};3. board_init_r()

U-Boot執行到此處,已經進入到正常的功能代碼調用流程,例如設備驅動、命令行、鏡像搬移加載等功能。

若U-Boot中開啟了SPL功能,則在common/spl.c代碼中可以實現該函數,否則,通常以common/board_r.c中實現為準。

board_init_r()中調用的函數在數組init_sequence_r[]中定義:

staticinit_fnc_tinit_sequence_r[]={initr_trace,initr_reloc,......#ifdefCONFIG_MMCinitr_mmc,#endif......run_main_loop,};

以上所有的功能相關的初始化中,CPU相關的初始化代碼通常位於如下路徑:

linux@u-boot$lsarch/arm/config.mklibmach-davincimach-keystonemach-orion5xmach-snapdragonmach-tegramach-zynqmp-r5cpumach-aspeedmach-exynosmach-kirkwoodmach-owlmach-socfpgamach-uniphierMakefiledtsmach-at91mach-highbankmach-mediatek......linux@u-boot$

板級相關的初始化代碼通常位於如下路徑:

linux@u-boot$lsboard/abilisbluewatercorsciencegelgqcasifivetoradexadvantechboschcreativegeekbuyingl+gqemu-mipssilicatplinkalliedtelesisboundarycssigoogleliebherrqualcommsks-kinkeltqcalterabroadcomCZ.NICgrinnlogicpdquipossocratesucRobotics......

END

掃碼添加我的微信

--- 往期精彩內容 ---
內核圖顯子系統專輯內核驅動原理專輯內核驅動調試專輯內核及32/64位ARM處理器工作原理專輯

歡迎點讚、轉發、在看,點擊關注,

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()