![](https://csdnimg.cn/release/download_crawler_static/85936631/bg7.jpg)
}
/*这段蓝色文字搞错了,分析的是 board.c 的 board_init_f 函数,不用看,*/
开头定义了两个结构体变量: bd_t *bd; gd_t *id;
Bd_t 类型存储板子信息,gd_t 即 global_data 结构体类型,在 include\asm-generic 中定义。
以下宏没有定义,所以相应位置的代码不会执行:
CONFIG_PRAM 、 CONFIG_OF_EMBED 、 CONFIG_OF_SEPARATE 、
CONFIG_OF_CONTROL 、 CONFIG_SYS_MEM_TOP_HIDE 、 CONFIG_LOGBUFFER 、
CONFIG_ALT_LB_ADDR
CONFIG_SYS_ICACHE_OFF 、 CONFIG_SYS_DCACHE_OFF 、 CONFIG_LCD 、
CONFIG_FB_ADDR
CONFIG_MACH_TYPE、CONFIG_USE_IRQ、CONFIG_POST
board_init_f 主要作用就是配置 bd 和 id,因为 CONFIG_SPL_BUILD 已经定义,故后面的代
码不会执行了,_main 函数已经跑完,返回。
这里执行 gd = &gdata 就是把 gdata 的指针地址赋给 gd。
Gd 在哪里定义呢?百度后可知 gd 是由 DECLARE_GLOBAL_DATA_PTR 定义的。搜索
DECLARE_GLOBAL_DATA_PTR,找到 Global_data.h (arch\arm\include\asm)文件,其中有
如下定义:
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r9")
在 Smdkc100.c (board\samsung\smdkc100)中,有 DECLARE_GLOBAL_DATA_PTR 定义。
DECLARE_GLOBAL_DATA_PTR 的含义:声明结构体 gd_t 类型的指针变量 gd,该指针变
量的地址存储在寄存器 r8 中。
接下来执行 board_init_r(null, 0)。
board_init_r:
board_init_r 的意思是 ram 中初始化,因为我们已经设置好了栈指针,所以可以运行 C 代码
了。
board_init_r 位于 Spl.c (common\spl)中。先把 Spl.c (common\spl)的大部分代码贴出来:
void board_init_r(gd_t *dummy1, ulong dummy2)
{
u32 boot_device;
debug(">>spl:board_init_r()\n");
#ifdef CONFIG_SYS_SPL_MALLOC_START
mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
CONFIG_SYS_SPL_MALLOC_SIZE);
#endif
#ifndef CONFIG_PPC
/*
* timer_init() does not exist on PPC systems. The timer is initialized
* and enabled (decrementer) in interrupt_init() here.
*/