- 本篇主要分析
init_sequence 里的初始化函数
board_init
int board_init(void)
{
DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_DRIVER_SMC911X
smc9115_pre_init();
#endif
#ifdef CONFIG_DRIVER_DM9000
dm9000_pre_init();
#endif
gd->bd->bi_arch_number = MACH_TYPE;
gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100);
return 0;
}
- 只定义了
CONFIG_DRIVER_DM9000 ,因此主要的工作集中在dm9000网卡设备上 dm9000_pre_init 函数主要是网卡的GPIO和端口的配置gd->bd->bi_arch_number 即机器码,是配置该开发板的唯一标识。机器码的主要作用是在uboot和Linux内核之间进行比对和适配。uboot在启动内核之时会将此机器码作为参数的一部分传给内核,只有两者相同才能正常启动gd->bd->bi_boot_params 表示uboot给Linux内核启动时的传参的内存地址,这里定义的地址是0x30000100
interrupt_init
int interrupt_init(void)
{
S5PC11X_TIMERS *const timers = S5PC11X_GetBase_TIMERS();
timers->TCFG0 = 0x0f00;
if (timer_load_val == 0) {
timer_load_val = get_PCLK() / (16 * 100);
}
lastdec = timers->TCNTB4 = timer_load_val;
timers->TCON = (timers->TCON & ~0x00700000) | TCON_4_AUTO | TCON_4_UPDATE;
timers->TCON = (timers->TCON & ~0x00700000) | TCON_4_AUTO | COUNT_4_ON;
timestamp = 0;
return (0);
}
env_init
- 初始化环境变量
- 这个函数在很多地方都能找到,分别在
env_xxx.c 文件中。经过查的,此开发板使用的env_init函数位于env_movi.c 中 - 这个函数只是对内存中的env做了初始化和判定(
gd->env_valid ),当前没有进行环境变量从SD卡到DDR中的重定位,因此当前的环境变量是不能使用的 - start_armboot函数在执行
env_relocate 后才进行环境变量从SD卡中到DDR中的重定位。重定位之后需要环境变量时才可以从DDR中去取,重定位之前如果要使用环境变量只能从SD卡中去读取
init_baudrate
static int init_baudrate (void)
{
char tmp[64];
int i = getenv_r ("baudrate", tmp, sizeof (tmp));
gd->bd->bi_baudrate = gd->baudrate = (i > 0)
? (int) simple_strtoul (tmp, NULL, 10)
: CONFIG_BAUDRATE;
return (0);
}
- 该函数进行串口波特率的设置
- 首先获取环境变量中的
baudrate 值,如果成功,则使用此值作为环境变量记录在gd->bd->bi_baudrate 和gd->baudrate 中,否则使用CONFIG_BAUDRATE 定义的值
console_init_f
- 对控制台进行第一阶段初始化
- 仅仅是对
gd->have_console 赋值为1
dram_init
int dram_init(void)
{
DECLARE_GLOBAL_DATA_PTR;
gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
#if defined(PHYS_SDRAM_2)
gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
#endif
#if defined(PHYS_SDRAM_3)
gd->bd->bi_dram[2].start = PHYS_SDRAM_3;
gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE;
#endif
return 0;
}
- 对DDR进行软件的初始化
- 告诉软件DDR的起始地址和长度
display_dram_config
- 打印ram的配置信息
- 在uboot的命令行下使用
bdinfo 可以打印出gd->bd中记录的所有硬件相关的全局变量值,可以得到DDR的配置信息
|