OK6410A 开发板 (三) 8 u-boot-2021.01 boot 解析 SPL镜像运行部分

url 		: git@github.com:lisider/u-boot.git
branch 		: ok6410a
commit id 	: e63a4077ad3aea53107495b0b68b95e720fe6033
config 		: ok6410a_mini_defconfig
// 涉及的 .S .s .c 文件 有 67个
  • 从入口出口来看
// 运行在 0x0c00 0000
reset 												arch/arm/cpu/arm1176/start.S 39	
	lowlevel_init(108) 								board/samsung/ok6410a/lowlevel_init.S 72
	_main(110)										arch/arm/lib/crt0.S 91
		board_init_f(117)							board/samsung/ok6410a/ok6410a.c 266
			debug_uart_init(271) 					include/debug_uart.h 193
				_debug_uart_init(196) 				drivers/serial/s3c64xx_serial.c 315	
		board_init_r(177) 							common/spl/spl.c 589
			spl_board_init(641) 					board/samsung/ok6410a/ok6410a.c 255
				spl_boot_mmc(258) 					board/samsung/ok6410a/bl2_mmc_copy.c 18
					mmc_bl2_copy(23) 				board/samsung/ok6410a/bl2_mmc_copy.c 7
						CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, bl2_base, MOVI_INIT_REQUIRED)(13) arch/arm/mach-s3c64xx/include/mach/movi.h 25
					bl2base(24) // 跳转到 u-boot 的u-boot镜像
			
spl标准流程
reset 												arch/arm/cpu/arm1176/start.S 39	
	lowlevel_init(108) 								board/samsung/ok6410a/lowlevel_init.S 72
	_main(110)										arch/arm/lib/crt0.S 91
		board_init_f(117)							board/samsung/ok6410a/ok6410a.c 266
			debug_uart_init(271) 					include/debug_uart.h 193
				_debug_uart_init(196) 				drivers/serial/s3c64xx_serial.c 315	
		board_init_r(177) 							common/spl/spl.c 589
			spl_board_init(641) 					board/samsung/ok6410a/ok6410a.c 255
			memset(&spl_image, '\0', sizeof(spl_image)); // u-boot.img
			spl_image.boot_device = 0xdeadbeef;
			// 得到 u-boot.img在的 device类型
			board_boot_order(spl_boot_list);
				spl_boot_list[0] = spl_boot_device();
					ok6410a_get_boot_device
			// 通过device类型得到 loader函数
			// 用 loader 函数加载 u-boot.img 到 ddr
			boot_from_devices(&spl_image, spl_boot_list, (sizeof(spl_boot_list) / sizeof((spl_boot_list)[0])));
				loader = spl_ll_find_loader(spl_boot_list[i]);
				spl_load_image(spl_image, loader);
					loader->load_image/spl_mmc_load_image
						spl_mmc_load
							...
								spl_parse_image_header
									spl_parse_legacy_header
										spl_image->load_addr = image_get_load(header);
										spl_image->entry_point = image_get_ep(header);
										spl_image->size = image_get_data_size(header);
										
						
			// 需要 打补丁的赶紧打补丁 
			// 比如说 你的 u-boot.img 有问题,解析出来的 entry_point  不对
			// 就需要重新为 entry_point  赋值
			// 一般为null
			spl_perform_fixups(&spl_image);
			switch (spl_image.os) {
				case IH_OS_U_BOOT:
					break;
			}
			// 一般为null
			spl_board_prepare_for_boot
			
			jump_to_image_no_args(&spl_image);
				image_entry_noargs_t image_entry = (image_entry_noargs_t)spl_image->entry_point;
				image_entry


			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值