书接上回,执行流进入到 lib_arm/board.c 中的 start_armboot 函数:
1.为 gd, bd 分配空间:
gd = (gd_t *)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
gd_t 在 include/asm-arm/global_data.h 中有如下定义:
typedef struct global_data { .....} gd_t;
gd->bd = (bd_t *)((char *)gd - sizeof(bd_t));
bd_t 在 include/asm-arm/u-boot.h 中有下列定义:
typedef struct bd_info { ... } bd_t;
2. 执行初始化函数列表:
其中 init_fnc_ptr 的类型为 init_fnc_t,其定义为 typedef int (init_fnc_t)(void);
init_sequence 是一个函数指针数组,成员有 cpu_init, board_init, interrupt_init, env_init, init_baudrate,serial_init .....
其中 cpu_init 在 cpu/arm920t 中的 cpu.c 中定义,由于没有定义 CONFIG_USE_IRQ 宏,故该函数直接返回:
board_init 函数定义在 board/smdk2410/smdk2410.c 中,完成板子时钟设置,IO口设置,打开数据与指令缓存的操作:
interrupt_init 函数设置并启动定时器,其定义在 cpu/arm920t/s3c24x0 下的 interrupts.c 中:
env_init 函数有多个版本,在common目录下的 env_dataflash.c env_flash.c env_nand.c env_nowhere.c env_nvram.c env_eeprom.c 中均有定义,具体使用哪个则根据这些C文件开头的宏来决定,比如如果定义了 CFG_ENV_IS_IN_NAND 则使用 env_nand.c中的版本: