url : git@github.com:lisider/u-boot.git
branch : ok6410a
commit id : e63a4077ad3aea53107495b0b68b95e720fe6033
config : ok6410a_mini_defconfig
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) common/board_f.c 954
initcall_run_list(init_sequence_f)(959) include/initcall.h 21
init_sequence_f common/board_f.c 818
board_init_r(177) common/board_r.c 901
initcall_run_list(init_sequence_r)(927) include/initcall.h 21
init_sequence_r common/board_f.c 695
run_main_loop(898) common/board_r.c 678
main_loop(685) common/main.c 39
reset
lowlevel_init
时钟
串口
ddr
_main
bl board_init_f_alloc_reserve
mov sp, r0
mov r9, r0
bl board_init_f_init_reserve
bl board_init_f
查找 设备树的地址
准备 early malloc
驱动模型的前期准备
定时器初始化,为delay做准备
env 初始化,为查找环境变量做准备
串口波特率环境变量的查找和串口波特率的设置,为printf做准备
从 ddr 顶端 0x5FFF FFFF 往下 找 空间
1. mmu
2. u-boot
3. malloc
4. new_gd
5. fdt
6. irq 栈
7. 栈
搬移 gd
搬移设备树(fdt)
b relocate_code
bl relocate_vectors
CLEAR_BSS
ldr pc,=board_init_r
initr_caches
initr_malloc
initr_dm
board_init
stdio_init_tables
serial_initialize
stdio_add_devices
console_init_r
initr_mmc
initr_ethaddr
initr_net
initr_env
initr_jumptable
interrupt_init
main_loop
bootcmd以及cmdline
reset
lowlevel_init
spl_config_uart_baudrate
ulong val = spl_uart_getclk(is_mpll) / 115200;
_UBRDIV = val / 16 - 1;
_UDIVSLOT = udivslot[val % 16];
mem_ctrl_asm_init
_main
board_init_f_alloc_reserve
申请 struct global_data 个字节 用来存储 gd_t *gd 指向的 gd_t 结构体
board_init_f_init_reserve
初始化 gd_t *gd 指向的 gd_t 结构体 空间 为 0
初始化 gd_t *gd 指向的 gd_t 结构体 的 成员 malloc_base = 5F9F FFF0
board_init_f
gd->flags = 0;
gd->have_console = 0;
setup_mon_len
gd->mon_len = (ulong)&__bss_end - (ulong)_start;
fdtdec_setup
gd->fdt_blob = board_fdt_blob_setup();
return (ulong *)&_end;
gd->fdt_blob = map_sysmem (env_get_ulong("fdtcontroladdr", 16, (unsigned long)map_to_sysmem(gd->fdt_blob)), 0);
fdtdec_prepare_fdt
fdtdec_board_setup
initf_malloc
gd->malloc_limit = 0x100000;
gd->malloc_ptr = 0;
log_init
initf_bootstage
bootstage_init(1)
bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_F, "board_init_f")
show_boot_progress(id);
setup_spl_handoff
initf_console_record
arch_cpu_init
mach_cpu_init
initf_dm
bootstage_start(BOOTSTAGE_ID_ACCUM_DM_F, "dm_f");
dm_init_and_scan(1)
dm_init(0)
INIT_LIST_HEAD(&(((gd_t *)gd)->uclass_root));
list->next = list;
list->prev = list;
device_bind_by_name(0,0,&root_info, &(((gd_t *)gd)->dm_root)));
lists_driver_lookup_name(info->name);
device_bind_common(parent, drv, info->name, (void *)info->platdata, 0, ofnode_null(), platdata_size, devp);
(((gd_t *)gd)->dm_root)->node = offset_to_ofnode(0)
device_probe((((gd_t *)gd)->dm_root))
dm_scan_platdata(1)
lists_bind_drivers((((gd_t *)gd)->dm_root), 1)
dm_extended_scan_fdt(gd->fdt_blob, 1)
dm_scan_fdt(gd->fdt_blob,1)
dm_scan_fdt_node(gd->dm_root, blob, 0, 1);
for_each_node dm_scan_fdt_ofnode_path(blob, nodes[i], 1);
dm_scan_other(1)
bootstage_accum(BOOTSTAGE_ID_ACCUM_DM_F);
arch_cpu_init_dm
timer_init
gd->arch.timer_rate_hz = pre_freq/1;
gd->arch.timer_rate_hz *= 1000;
gd->arch.lastinc = timers->TCNTB4 = gd->arch.timer_rate_hz;
gd->arch.timer_reset_value = 0;
env_init
env_driver_lookup
env_get_location
return env_locations[prio] ;
_env_driver_lookup
n_ents = xxx
in section .u_boot_list_2_env_driver ,根据 ENVL_MMC 找到对应的 驱动对应的结构体 struct env_driver
drv->init
env_set_inited(drv->location)
gd->env_has_init |= (1UL << (location));
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = ENV_VALID;
init_baud_rate
gd->baudrate = env_get_ulong("baudrate", 10, 115200);
const char *str = env_get(name);
env_get_f
env_get_char
env_match
return str ? simple_strtoul(str,0,10) : default_val;
serial_init
serial_find_console_or_panic
serial_check_stdout
str = fdtdec_get_chosen_prop(blob, "stdout-path");
node = fdt_path_offset_namelen(blob, str, namelen);
lists_bind_fdt
device_probe(&dev)
gd->cur_serial_dev = dev;
gd->flags |= GD_FLG_SERIAL_READY;
serial_setbrg
gd->cur_serial_dev->driver->ops->setbrg(gd->cur_serial_dev, gd->baudrate)
s3c_serial_setbrg_internal((struct s3c64xx_uart * )CONFIG_DEBUG_UART_BASE, 0 ,CONFIG_BAUDRATE);
u32 uclk = get_uart_clk(id)
s3c64xx_serial_baud(uart, uclk, baudrate);
uart->UBRDIV = uclk / baudrate / 16 - 1;
uart->UDIVSLOT = udivslot[val];
barrier();
console_init_f
gd->have_console = 1;
console_update_silent
print_pre_console_buffer(PRE_CONSOLE_FLUSHPOINT1_SERIAL);
display_options
display_options_get_banner(true, buf, sizeof(buf));
display_options_get_banner_priv
snprintf
printf("%s", buf);
display_text_info
bss_start = (ulong)&__bss_start;
bss_end = (ulong)&__bss_end;
text_base = 0x5FB00000;
checkcpu
print_cpuinfo
printf("** Updated for OK6410A Board **\r\n");
show_board_info
model = fdt_getprop(gd->fdt_blob, 0, "model", ((void *)0));
printf("Model: %s\n", model);
checkboard
printf("Board: OK6410A\n");
announce_dram_init
puts("DRAM: ");
dram_init
gd->ram_size += SDRAM_BANK_SIZE;
setup_dest_addr
gd->ram_base = 0x50000000;
gd->ram_top = gd->ram_base + get_effective_memsize();
gd->ram_top = board_get_usable_ram_top(gd->mon_len);
gd->relocaddr = gd->ram_top;
reserve_round_4k
gd->relocaddr &= ~(4096 - 1);
arch_reserve_mmu
arm_reserve_mmu
gd->arch.tlb_size = (4096 * 4);
gd->relocaddr -= gd->arch.tlb_size;
gd->relocaddr &= ~(0x10000 - 1);
gd->arch.tlb_addr = gd->relocaddr;
reserve_video
reserve_trace
reserve_uboot
gd->relocaddr -= gd->mon_len;
gd->relocaddr &= ~(4096 - 1);
gd->start_addr_sp = gd->relocaddr;
reserve_malloc
gd->start_addr_sp = reserve_stack_aligned((1024*1024));
reserve_board
setup_machine
gd->bd->bi_arch_number = 1626;
reserve_global_data
gd->start_addr_sp = reserve_stack_aligned(sizeof(gd_t));
gd->new_gd = (gd_t *)map_sysmem(gd->start_addr_sp, sizeof(gd_t));
reserve_fdt
gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob), 32);
gd->start_addr_sp = reserve_stack_aligned(gd->fdt_size);
gd->new_fdt = map_sysmem(gd->start_addr_sp, gd->fdt_size);
reserve_bootstage
reserve_bloblist
reserve_arch
reserve_stacks
gd->start_addr_sp = reserve_stack_aligned(16);
arch_reserve_stacks
gd->irq_sp = gd->start_addr_sp;
dram_init_banksize
for_each_bank
gd->bd->bi_dram[i].start = addr;
gd->bd->bi_dram[i].size = (0x10000000);
show_dram_config
for_each_bank
size += gd->bd->bi_dram[i].size;
print_size(size, "");
board_add_ram_info(0);
null
putc('\n');
setup_bdinfo
display_new_sp
reloc_fdt
gd->fdt_blob = gd->new_fdt;
reloc_bootstage
reloc_bloblist
setup_reloc
gd->reloc_off = gd->relocaddr - 0x5FB00000;
memcpy(gd->new_gd, (char *)gd, sizeof(gd_t));
clear_bss
ldr r0, [r9, #72]
bic r0, r0, #7
mov sp, r0
ldr r9, [r9, #80]
adr lr, here
ldr r0, [r9, #76]
add lr, lr, r0
ldr r0, [r9, #56]
b relocate_code
arch/arm/lib/relocate.S +80
搬移,修复绝对地址???
bl relocate_vectors
ldr r0, [r9, #56]
mcr p15, 0, r0, c12, c0, 0
bl c_runtime_cpu_setup
CLEAR_BSS
bl coloured_LED_init
bl red_led_on
mov r0, r9
ldr r1, [r9, #56]
ldr pc,=board_init_r
gd->flags &= ~GD_FLG_LOG_READY;
initr_trace
initr_reloc
gd->flags |= GD_FLG_RELOC | GD_FLG_FULL_MALLOC_INIT;
initr_caches
enable_caches
icache_enable
cache_enable((1 << 12));
reg = get_cr();
set_cr(reg | cache_bit);
dcache_enable
cache_enable((1 << 2));
if !mmu_enabled() mmu_setup();
reg = get_cr();
set_cr(reg | cache_bit);
initr_reloc_global_data
monitor_flash_len = _end - __image_copy_start
initr_barrier
initr_malloc
malloc_start = gd->relocaddr - (1024*1024);
mem_malloc_init((ulong)map_sysmem(malloc_start, (1024*1024)), (1024*1024));
mem_malloc_start = start;
mem_malloc_end = start + size;
mem_malloc_brk = start;
memset((void *)mem_malloc_start, 0x0, size);
malloc_bin_reloc();
log_init
initr_bootstage
bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r");
initr_console_record
initr_of_live
initr_dm
gd->dm_root_f = gd->dm_root;
gd->dm_root = 0;
dm_init_and_scan(0);
bootstage_accum(BOOTSTAGE_ID_ACCUM_DM_R);
board_init
cs8900_pre_init
(*(vu_long *)(0x70000000 +0x0)) &= ~(0xf << 4);
(*(vu_long *)(0x70000000 +0x0)) |= (1 << 7) | (1 << 6) | (1 << 4);
(*(vu_long *)(0x70000000 +0x8)) = (((0x0) << 28) + ((0x4) << 24) + ((0xE) << 16) + ((0x1) << 12) + ((0x4) << 8) + ((0x6) << 4) + (0x0));
gd->bd->bi_arch_number = 1626;
gd->bd->bi_boot_params = (0x50000000 +0x100);
initr_binman
initr_dm_devices
stdio_init_tables
INIT_LIST_HEAD(&devs.list);
serial_initialize
serial_init
initr_announce
power_init_board
initr_mmc
puts("MMC: ");
mmc_initialize(gd->bd);
initr_env
env_set_default(0,0)
image_load_addr = env_get_ulong("loadaddr", 16, image_load_addr);
initr_secondary_cpu
cpu_secondary_init_r
stdio_add_devices
drv_system_init
serial_stdio_init
initr_jumptable
jumptable_init
gd->jt = malloc(sizeof(struct jt_funcs));
gd->jt->get_version = get_version;
gd->jt->getc = getchar;
gd->jt->tstc = tstc;
gd->jt->putc = putc;
gd->jt->puts = puts;
gd->jt->printf = printf;
gd->jt->install_hdlr = dummy;
gd->jt->free_hdlr = dummy;
gd->jt->malloc = malloc;
gd->jt->free = free;
gd->jt->udelay = udelay;
gd->jt->get_timer = get_timer;
gd->jt->vprintf = vprintf;
gd->jt->do_reset = do_reset;
gd->jt->env_get = env_get;
gd->jt->env_set = env_set;
gd->jt->simple_strtoul = simple_strtoul;
gd->jt->strict_strtoul = strict_strtoul;
gd->jt->simple_strtol = simple_strtol;
gd->jt->strcmp = strcmp;
gd->jt->i2c_write = dummy;
gd->jt->i2c_read = dummy;
gd->jt->spi_setup_slave = dummy;
gd->jt->spi_free_slave = dummy;
gd->jt->spi_claim_bus = dummy;
gd->jt->spi_release_bus = dummy;
gd->jt->spi_xfer = dummy;
gd->jt->ustrtoul = ustrtoul;
gd->jt->ustrtoull = ustrtoull;
gd->jt->strcpy = strcpy;
gd->jt->mdelay = mdelay;
gd->jt->memset = memset;
console_init_r
gd->flags |= GD_FLG_DEVINIT;
print_pre_console_buffer(flushpoint);
interrupt_init
IRQ_STACK_START_IN = gd->irq_sp + 8;
enable_interrupts
initr_ethaddr
eth_env_get_enetaddr("ethaddr", bd->bi_enetaddr);
initr_net
puts("Net: ");
eth_initialize
run_main_loop
main_loop