MPC8309 NAND_SPL uboot初始化流程

nand_spl只是在常规uboot的前面打了一个padding,用该padding支持系统从NAND中启动,最后还是跳转到常规uboot处开始执行。

UBOOT第一阶段

UBOOT第一阶段在内部FCM 4K RAM中执行。当CPU启动时,自动把NAND Flash的前4K内容拷贝到FCM的4K RAM中,并根据配置字把这4K RAM映射到BMS(即0x00000000或0xFFF00000,下面假设为0xFFF00000)。然后CPU从0x100偏移处开始执行代码(即0xFFF00100,连接器应该保证_start刚好在该地址处,在Start.S中)。然后代码执行一系列初始化操作,其中有操作要LOCK CPU的数据CACHE作为RAM,LOCK的地址为CONFIG_SYS_INIT_RAM_ADDR(0xE6000000),长度为CONFIG_SYS_INIT_RAM_END(0x1000,即4K)。这个RAM作用有三个,一是存放C运行环境的全局变量,二是开辟C运行环境的STACK,三是存放uboot的global_data数据。代码在初始化好C语言运行环境后跳转到cpu_init_f(在nand_init.c中),在此函数中设定CPU的一些特性,并初始化好LOCALBUS的BANK0,为读取挂在上面的NAND做准备。然后CPU调用board_init_f(在mpc8309som.c中),在这里初始化串口打印、定时器、SDRAM,从此SDRAM便可读写;在此函数最后调用relocate_code,把FCM 4K RAM中的代码拷贝并重定向到SDRAM中,同时在SDRAM中开辟新的大的STACK(默认拷贝到0x10000,SP开辟到0x20000)。在relocate_code的最后调用board_init_r函数(在mpc8309som.c中),此函数主要用来加载nand中的代码到SDRAM中(默认0x1000000),加载完后跳转到SDRAM中(CONFIG_SYS_NAND_U_BOOT_START)执行第二阶段的操作(该函数并不返回)。
UBOOT第二阶段
该阶段其实也是从Start.S开始的,不过直接从_start_warm开始。跟第一阶段一样重新把CPU初始化一遍,跳转到cpu_init_f、board_init_f,不过这两个函数并不是第一阶段的那两个函数,这两个函数分别位于cpu_init.c和board.c。这个cpu_init_f相较于第一阶段精简版的cpu_init_f初始化的东西比较多,对于LOCALBUS,它把所有要用到的BANK和WINDOW都初始化了。board_init_f也是全功能版的,它依次调用init_sequence中所有的init函数,对板级进行初始化,然后准备把运行环境完全搬到SDRAM的末尾处,包括分配堆空间、栈空间、拷贝global_data到新地址,做好以上操作后,再次调用relocate_code运行到SDRAM的末端代码中,relocate_code最后调用board.c中的board_init_r,执行进一步的操作。

你可能感兴趣的:(MPC8309 NAND_SPL uboot初始化流程)