U-Boot2017.01的启动过程比较复杂,本文分为6部分讲述,笔者将主要过程和函数调用关系整理成一个文档方便查看,文档链接为
U-Boot2017.01启动过程分析pdf
U-Boot2017.01源码分析及启动命令解析
启动过程6部分内容如下
01-U-Boot2017.01 启动过程概述
02-U-Boot2017.01 SPL阶段分析
03-U-Boot2017.01 U-Boot阶段分析
04-U-Boot2017.01 加载内核过程
05-U-Boot2017.01 bootz加载过程
06-U-Boot2017.01 读取uEnv.txt过程
本节开始将从uboot2017.01的源码入手,对uboot的启动过程进行分析。SPL阶段的函数调用过程如下,图片中仅列出了比较重要的函数,并未全部列出。
/* SPL阶段函数调用过程 */
u-boot-spl.lds(arch/arm/cpu/armv7/sunxi/u-boot-spl.lds)
|--> vectors.S(arch/arm/lib/vectors.S)
|--> start.S(arch/arm/cpu/armv7/start.S)
|--> save_boot_params
|--> /*set SVC mode .. disable FIQ and IRQ*/
|--> cpu_init_cp15(arch/arm/cpu/armv7/start.S) /*disable MMU stuff and caches*/
|--> cpu_init_crit(arch/arm/cpu/armv7/start.S)
|--> lowlevel_init(arch/arm/cpu/armv7/lowlevel_init.S) /* 板级初始化,设置栈空间 */
|--> s_init(arch/arm/mach-ompa2/am33xx/board.c)
|--> rtc_only(arch/arm/mach-ompa2/am33xx/board.c)
|--> _main(arch/arm/lib/crt0.S )
|--> board_init_f(arch/arm/mach-ompa2/am33xx/board.c)
|--> early_system_init(arch/arm/mach-ompa2/am33xx/board.c)
|--> watchdog_disable(arch/arm/mach-ompa2/am33xx/board.c) /* 禁止看门狗 */
|--> set_uart_mux_conf(board/ti/am335x/board.c) /* 设置串口 */
|--> setup_early_clocks(arch/arm/mach-ompa2/am33xx/clock.c)
|--> uart_soft_reset(arch/arm/mach-ompa2/am33xx/board.c)
|--> board_early_init_f(arch/arm/mach-ompa2/am33xx/board.c)
|--> prcm_init(arch/arm/mach-ompa2/am33xx/clock.c)
|--> set_mux_conf_regs(board/ti/am335x/board.c)
|--> sdram_init(board/ti/am335x/board.c) /* 初始化DDR */
|--> board_init_r(common/spl/spl.c)
|--> gd->bd = &bdata /* gd是保存在r9寄存器的,即r9保存的是指向gdata的指针 */
|--> timer_init(arch/arm/cpu/armv7/sunxi/timer.c) /* 初始化时钟 */
|--> spl_board_init(arch/arm/mach-omap2/boot-common.c)
|--> save_omap_boot_params(arch/arm/mach-omap2/boot-common.c) /* 保存启动的device和mode */
|--> preloader_console_init(common/spl/spl.c) /* 初始化gd部分数据结构 波特率 */
|--> serial_init( drivers/serial/serial.c) /* 串口初始化 */
|--> am33xx_spl_board_init() /* 设置频率 */
|--> boot_from_devices(common/spl/spl.c)
|--> spl_ll_find_loader(common/spl/spl.c)
|--> ll_entry_start(include/linker_lists.h)
|--> SPL_LOAD_IMAGE_METHOD("MMC1", 0, BOOT_DEVICE_MMC1, spl_mmc_load_image)(common/spl/spl_mmc.c)
|--> spl_mmc_load_image(common/spl/spl_mmc.c)
|--> mmc_load_image_raw_os(common/spl/spl_mmc.c)
|--> mmc_load_legacy(common/spl/spl_mmc.c)
|--> spl_parse_image_header(common/spl/spl.c) /* 解析 header */
|--> jump_to_image_no_args(common/spl/spl.c)
|--> image_entry /* 结束SPL过程,跳转到u-boot */
SPL阶段的调用框图如下所示:
&emsp