1 rk3399 uboot
reset()
lowlevel_init()
_main()
board_init_f()
arch_cpu_init()
initf_dm()//驱动模型的初始化
timer_init()//初始化定时器 Cortex-A7内核有一个定时器 通过这个定时器来为uboot提供时间。
env_init()
init_baud_rate()
gd->baudrate = env_get_ulong("baudrate", 10, CONFIG_BAUDRATE);
serial_init,
gd->flags |= GD_FLG_SERIAL_READY;
show_board_info()
dram_init() //./arch/arm/mach-rockchip/sdram.c
gd->ram_size = bidram_get_ram_size();
setup_dest_addr()函数,设置目的地址,设置gd->ram_size gd->ram_top gd->relocaddr这三个的值
reloc_fdt()
relocate_code()
c_runtime_cpu_setup()
board_init_r
interrupt_init(),
arch_interrupt_init();
__do_arch_irq_init();
initr_enable_interrupts,
enable_interrupts();
cpu_local_irq_enable();
asm volatile("msr daifclr, #0x02");
initr_env_nowhere()//linux 设备树相关
set_default_env(NULL);
board_init()
run_command(bootdev_rockusb_cmd(), 0);
bootdev_rockusb_cmd()
mmc_initialize(gd->bd);#初始化mmc
initr_serial()//串口初始化
serial_initialize();
run_main_loop()
main_loop();
s = bootdelay_process();//s为bootcmd的值
autoboot_command(s);//在bootdelay下按键没按下执行bootcmd 按下退出
cli_loop();
parse_file_outer();
parse_stream_outer();//读取指令,处理
2 4412 uboot
reset()
lowlevel_init()
ldr sp, =0x02060000
mem_ctrl_asm_init()//初始化ddr等
ldr r0, =MIU_BASE
//...
system_clock_init()
copy_from_nand()//代码搬运到ddr
copy_uboot_to_ram()
_start_armboot()
gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));//初始化gd
memset ((void*)gd, 0, sizeof (gd_t));
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
memset (gd->bd, 0, sizeof (bd_t)
init_fnc_ptr()//函数数组
arch_cpu_init()
board_init()
gd->bd->bi_arch_number = MACH_TYPE;
gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100);
interrupt_init() /* set up exceptions */
env_init() /* initialize environment */
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 1;
init_baudrate() /* initialze baudrate settings */
int i = getenv_r ("baudrate", tmp, sizeof (tmp));
gd->bd->bi_baudrate = gd->baudrate = (i > 0)? (int) simple_strtoul (tmp, NULL, 10): CONFIG_BAUDRATE;
serial_init() /* serial communications setup */
console_init_f() /* stage 1 init of console */
dram_init() /* configure available RAM banks */
display_dram_config()
mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN,CONFIG_SYS_MALLOC_LEN);
#if defined(CONFIG_CMD_NAND)
puts ("NAND: ");
nand_init(); /* go init the NAND */
#endif
env_relocate ();
env_relocate_spec ();
env_relocate_spec_nand()
data = (u_char*)malloc(CONFIG_ENV_SIZE);
nand_read(&nand_info[0], CONFIG_ENV_OFFSET, &total, (u_char*)data);
env_ptr = data;
gd->env_addr = (ulong)&(env_ptr->data);
enable_interrupts ();
#ifdef CONFIG_RECOVERY //mj for factory reset
recovery_preboot();
reset_mode = INF_REG5_REG;// #define INF_REG5_REG __REG(INF_REG_BASE+INF_REG5_OFFSET)
if(reset_mode ==FACTORY_RESET_MODE)
{
factory_reset(1)
}
else
{
value = __REG(GPX1DAT);
if(0x2 == (value & 0x2))//not press
{
printf("SYSTEM ENTER NORMAL BOOT MODE\n");
}
else //press
{
printf("SYSTEM ENTER Updating MODE\n");
sprintf(run_cmd, "sdfuse flashall");
run_command(run_cmd, 0);
}
}
main_loop ();
3 imx6ull uboot
reset()
save_boot_params_ret();//关中断,设置svc模式
cpu_init_cp15()// Invalidate L1 I/D disable MMU stuff and caches
cpu_init_crit()
lowlevel_init()
ldr sp, =CONFIG_SYS_INIT_SP_ADDR
s_init()
_main()
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
mov r0, sp
bl board_init_f_alloc_reserve()
top -= CONFIG_SYS_MALLOC_F_LEN;
top = rounddown(top-sizeof(struct global_data), 16);
return top;
mov sp, r0 //top 返回值
bl board_init_f_init_reserve()
gd_ptr = (struct global_data *)base;
memset(gd_ptr, '\0', sizeof(*gd));
gd->malloc_base = base;
board_init_f()
init_sequence_f[]//函数指针数组
initf_malloc()
gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
gd->malloc_ptr = 0;
arch_cpu_init()
board_early_init_f()
setup_iomux_uart();
timer_init()
struct sctr_regs *sctr = (struct sctr_regs *)SCTR_BASE_ADDR;
writel(freq, &sctr->cntfid0);
/* Enable system counter */
val = readl(&sctr->cntcr);
val &= ~(SC_CNTCR_FREQ0 | SC_CNTCR_FREQ1);
val |= SC_CNTCR_FREQ0 | SC_CNTCR_ENABLE | SC_CNTCR_HDBG;
writel(val, &sctr->cntcr);
gd->arch.tbl = 0;
gd->arch.tbu = 0;
env_init()// #define CONFIG_ENV_IS_IN_MMC
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 1;
init_baud_rate()
gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
dram_init()//设置ddr大小
gd->ram_size = imx_ddr_size();
struct esd_mmdc_regs *mem = (struct esd_mmdc_regs *)MEMCTL_BASE;
setup_dram_config()
dram_init_banksize();
gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
gd->bd->bi_dram[0].size = get_effective_memsize();
imx6_light_up_led1();//打开led
relocate_code()
c_runtime_cpu_setup()
board_init_r()
init_sequence_r[] //函数指针数组
initr_malloc,
initr_serial,
initr_mmc,
initr_env,
console_init_r, /* fully init console as a device */
interrupt_init,
initr_ethaddr,
initr_fastboot_setup,
initr_net,
run_main_loop,
main_loop();
s = bootdelay_process();
autoboot_command(s);
cli_loop();
parse_file_outer();
parse_stream_outer()