1.前言
本文主要就Hi3556v200的U-boot+Liteos方案的启动流程做简要介绍.我们在前面分析过,uboot执行的过程会执行重定位,这也主要是为了为后续执行kenrel代码腾出空间。重定位后,uboot将执行重定位的uboot代码,这其中会执行board_init_r函数,它会遍历并执行一个函数数组。
U-boot版本:u-boot-2016.11
2.init_sequence_r函数数组
可以看出init_sequence_r函数数组与init_sequence_f还是有区别的,init_sequence_f更多的是集中在重定位相关的处理上,init_sequence_r更多的是执行真正的硬件的初始化相关的动作.
-
initr_caches
使能cache -
initr_reloc_global_data
重定位global data -
initr_malloc
初始化malloc相关 -
bootstage_relocate
-
initr_dm
-
set_cpu_clk_info, /* Setup clock information */
-
stdio_init_tables,
-
initr_serial,
-
initr_announce,
-
INIT_FUNC_WATCHDOG_RESET
-
initr_addr_map
-
initr_logbuffer
-
initr_icache_enable
-
arch_early_init_r
-
power_init_board
-
initr_nand
-
initr_mmc
-
initr_ufs
-
initr_env
…
- run_main_loop
3. run_main_loop
run_main_loop
|--main_loop
|--s = bootdelay_process()
|--s = getenv("bootcmd")
|--autoboot_command(s)
|-- run_command_list(s, -1, 0)
run_main_loop最终通过default_environment获取到bootcmd命令,并执行;
bootm命令主要是用于启动kernel