02-uboot2017.01 SPL阶段分析

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阶段的函数调用过程如下,图片中仅列出了比较重要的函数,并未全部列出。
图1  函数调用过程

/* 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

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值