init_sequence_f/init_sequence_r board_init_r

arch/arm/lib/crt0.S

1
2
3
ENTRY(_main)
bl board_init_f
ldr pc, =board_init_r

先调用各种初始化函数(init_sequence_f/init_sequence_r),最后在main_loop中执行配置文件中的命令

board_f.c

1
2
3
4
5
6
7
8
9
10
11
12
static init_fnc_t init_sequence_f[] = {
...
};

void (ulong boot_flags)
{
initcall_run_list(init_sequence_f);

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
ret = (*init_fnc_ptr)();
}
}

board_init_r

board_r.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 函数指针数组
init_fnc_t init_sequence_r[] = {
...
board_init, // 板级初始化,在各个板级文件中
run_main_loop, // 最后会调用
};

void board_init_r(gd_t *new_gd, ulong dest_addr)
{
initcall_run_list(init_sequence_r);
// 调用init_sequence_r中的每个成员
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
ret = (*init_fnc_ptr)();
}
}
1
2
3
4
5
6
7
8
9
10
11
// 主要执行配置文件中的那些指令
static int run_main_loop(void)
{
/* main_loop() can return to retry autoboot, if so just run it again */
for (;;)
/* We come here after U-Boot is initialised and ready to process commands */
main_loop();
autoboot_command(s);

return 0;
}