梳理了U-boot 15的代码流程

bootloader通常stage1和stage2两步骤,u-boot也不例外。

Stage1:依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在这个程序段,且可以用汇编语言来实现;
stage2:通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

<F:\FileRecv\Uboot中start.S源码的指令级的详尽解析+v1.6.pdf>
<F:\Clear_up_0.0.0_20180710_Don\Spec\计算机语言\GasARMRef.pdf>
<F:\Clear_up_0.0.0_20180710_Don\Spec\计算机语言\常用ARM指令集及汇编.pdf>
<F:\Clear_up_0.0.0_20180710_Don\Spec\计算机语言\u-boot向linux内核传递启动参数(详细).pdf>

"https://blog.csdn.net/dddd0216/article/details/51142333"

 * _main execution sequence is:
 *
 * 1. Set up initial environment for calling board_init_f().
 *    This environment only provides a stack and a place to store
 *    the GD ('global data') structure, both located in some readily
 *    available RAM (SRAM, locked cache...). In this context, VARIABLE
 *    global data, initialized or not (BSS), are UNAVAILABLE; only
 *    CONSTANT initialized data are available.
 *
 * 2. Call board_init_f(). This function prepares the hardware for
 *    execution from system RAM (DRAM, DDR...) As system RAM may not
 *    be available yet, , board_init_f() must use the current GD to
 *    store any data which must be passed on to later stages. These
 *    data include the relocation destination, the future stack, and
 *    the future GD location.
 *
 * (the following applies only to non-SPL builds)
 *
 * 3. Set up intermediate environment where the stack and GD are the
 *    ones allocated by board_init_f() in system RAM, but BSS and
 *    initialized non-const data are still not available.
 *
 * 4. Call relocate_code(). This function relocates U-Boot from its
 *    current location into the relocation destination computed by
 *    board_init_f().
 *
 * 5. Set up final environment for calling board_init_r(). This
 *    environment has BSS (initialized to 0), initialized non-const
 *    data (initialized to their intended value), and stack in system
 *    RAM. GD has retained values set by board_init_f(). Some CPUs
 *    have some work left to do at this point regarding memory, so
 *    call c_runtime_cpu_setup.
 *
 * 6. Branch to board_init_r().
include/configs/sp9820e_2h10.h
(UART0)
u-boot15\board\spreadtrum\sp9820e_2h10\u-boot.lds
ENTRY(_start)
	arch/arm/cpu/armv7/start.S(??? _start)
	reset
		save_boot_params_ret
			cpu_init_cp15
				arch/arm/lib/crt0.S
				_main
					bl	board_init_f
					arch\arm\lib\board.c
						for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
							serial_init
							console_init_f
							display_banner
							init_func_i2c
							dram_init
						debug("relocation Offset is: %08lx\n", gd->reloc_off);
						arch\arm\lib\crt0.S
						b	relocate_code
						arch\arm\lib\relocate.S(https://blog.csdn.net/skyflying2012/article/details/37660265)
						bl	relocate_vectors
						arch\arm\lib\relocate.S
						bl	c_runtime_cpu_setup
						arch\arm\cpu\armv7\start.S
						ldr	pc, =board_init_r
						u-boot15\arch\arm\lib\board.c
							enable_caches();
							board_init();
							board\spreadtrum\sp9820e_2h10\sp9820e_2h10.c
								misc_init();
								arch\arm\cpu\armv7\sharkle\misc.c
									pmic_misc_init();
										ANA_REG_GET(ANA_REG_GLB_POR_OFF_FLAG))
										regulator_pmic_init();
									sprd_get_chipid(NULL, NULL);	
								regulator_init();
									power_on_voltage_init();
										regulator_set_voltage("vddsim2",2800);(????)
											dcdc_set_voltage
											ldo_set_trimming
								pmic_adc_Init();
									sprd_small_scale_adc_efuse_get
									sprd_bat_scale_adc_efuse_get
								pin_init();
								sprd_eic_init();
								sprd_gpio_init();
								sprd_pmu_lowpower_init();
								enable_global_clocks();
							serial_initialize();
								serial_assign(default_serial_console()->name);
								/*
								 *	#define serial_initfunc(name)                    \ 
								 *	void name(void)                        \ 
								 *	__attribute__((weak, alias("serial_null")));
								 *
								 *	serial_initfunc(sprd_uart_initialize);
								 */
								drivers\serial\serial_sprd.c
									sprd_serial_drv
										sprd_serial_init
											sprd_apb_eb(CONSOLE_PORT);
												port[1]
(UART1)
debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
arch\arm\lib\board.c
	mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);
	nand_init();
	drivers\mtd\nand_sprd\sprd_nand.c
		_getGlobeResource(this);
		nand_set_timing_config(this, &default_timing, SPRD_NAND_CLOCK);
		__reset(this);
		__readId(this);
		ret = _param_init(this);
			ret = __param_init_nandHWInfo(this);
				SprdGetNandParam
					__PrintNandInfo
					__SprdCheckNancParam
				nand_set_timing_config
		_init_reg_state1(this);
		_init_nfc_base(&nfc_base, this);
		nfc_base_register(&nfc_base);
	mmc_initialize(gd->bd);
	should_load_env()
		fdtdec_get_config_int(gd->fdt_blob, "load-environment", 1);
			config_node = fdt_path_offset(blob, "/config");
	set_default_env(NULL);
		himport_r
			while ((dp < data + size) && *dp)
	fdt_fixup_memory_region(gd->fdt_blob, NULL);
	common\loader\sprd_fdt_memory.c
	stdio_init()
		stdio_init_tables();
		stdio_add_devices();
			i2c_init_all();
				i2c_set_bus_num
					i2c_init_bus
						I2C_ADAP->init(I2C_ADAP, speed, slaveaddr);
						drivers\i2c\sprd_i2c_v2.c
							sprd_i2c_init
			drv_system_init ()
			serial_stdio_init ();
			console_init_r();
				stdio_print_current_devices();
				setenv(stdio_names[i], stdio_devices[i]->name);
				print_pre_console_buffer
				interrupt_init();
				enable_interrupts();
				board_late_init();
					boot_pwr_check();
						if (!power_button_pressed())
							eic_value = sprd_eic_get(EIC_PBINT);
					nand_ubi_dev_init();
						ret = mtdparts_init();
						common\sprd_common_rw.c
							if (parse_mtdids(ids) != 0) {
								if (mtd_device_validate(type, num, &size) != 0)
							if (parse_mtdparts(parts) != 0)
							current_save();
						ret = ubi_init();
						dev_num = _boot_ubi_attach_mtd(UBIPAC_PART);
							ret = find_dev_and_part(mtdpart, &dev, &pnum, &part);
					battery_init();
						sprdchg_common_cfg();
						sprdchg_2721_init
						sprdbat_init
							sprdbat_help_init();
								sprdbat_get_vbatauxadc_caldata();
									ret = read_adc_calibration_data((char *)adc_data, 48);
									if (!sprd_get_adc_bat_cal(adc_data)) {
							sprdfgu_init();
								sprdfgu_cal_from_chip();
								sprdfgu_cal_init
						if (charger_connected()) {
						if (!sprdbat_is_battery_connected()) {
						sprdfgu_late_init();
						board_keypad_init();
				init_write_log();
				main_loop();
(main)
common\main.c
void main_loop(void)
	cli_init();(u-boot shell)
	run_preboot_environment_command();
		p = getenv("preboot");
	s = bootdelay_process();
	common\main.c
		fdtdec_get_config_int
		process_fdt_options(gd->fdt_blob);
			fdtdec_get_config_int
	autoboot_command(s);
	
			

								
									
				

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
		

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值