init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo, /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard, /* display board info */
#endif
dram_init, /* configure available RAM banks */
display_dram_config,
NULL,
};
init_fnc_t类型如下定义
typedef int (init_fnc_t) (void);
如何调用
在接下来的start_armboot函数中
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
顺序调用该类型的各个函数依次初始化
具体调用,依靠make xxx_config时指定体系结构和处理器类型, 编译时就去指定的目录下去编译。
cpu_init()定义在uboot1.1.16/cpu/s3c64xx/cpu.c中,定义中断栈和快速中断栈空间的地址
board_init定义在uboot1.1.16/board/samsung/smdk6410/smdk6410.c中,cs8900相关初始化以及全局变量gd中bd的两个成员初始化
interrupt_init定义在uboot1.1.16/cpu/s3c64xx/interupts.c中,PWM Timer的相关初始化
env_init环境初始化,目前不知道在哪里定义
init_baudrate初始化波特率,并写进gd->bd->bi_baudrate中,定义在uboot1.1.16/lib.arm/board.c函数中
serial_init串口初始化,定义uboot1.1.16/cpu/s3c64xx/serial.c
console_init_f重定位之前调用,初始化gd相关成员
display_banner,全是打印信息,打印uboot相关变量,定义在uboot1.1.16/lib.arm/board.c函数中
print_cpuinfo,打印CPU相关信息,uboot1.1.16/cpu/s3c64xx/speed.c
checkboard,打印开发板信息,Board: SMDK6410,定义uboot1.1.16/board/samsung/smdk6410/smdk6410.c
dram_init,DRAM的初始化,这里只是对gd中的 bi_dram结构中的两个成员赋值,也即BANK的起始地址和大小,定义uboot1.1.16/board/samsung/smdk6410/smdk6410.c
display_dram_config,打印DRAM的相关信息
NULL,表示数组结束
硬件相关的初始化函数到此结束
本文详细分析了OK6410 uboot1.1.16版本中board.c的init_sequence初始化序列,涵盖了从基本的CPU设置、板级初始化到中断处理、环境变量初始化、串口配置等多个环节。每个初始化函数的职责和实现位置都进行了说明,包括在不同源文件中的定义,如cpu_init、board_init、interrupt_init等。通过对这些函数的调用,UBoot完成了对硬件的全面初始化。

被折叠的 条评论
为什么被折叠?



