4 remap_flash_by_law0函数设置BR0为FE00_0000,OR0大小为32M。
5 remap_flash_by_law0函数设置LBLAW0窗口映射FE00_0000到FFFF_FFFF区域,并 清除LBLAW1。
11
2.4 Dcache 中分配空间做堆栈
程序跑到这里,就要进入第一个C函数了,C函数的运行需要堆栈空间,但这时,RAM还没有初始化,只能在Dcache中锁定一定的空间,用于C的堆栈空间。
lock_ram_in_cache函数在Dcache中锁定4k的空间。 下面的几行代码将堆栈指针指向刚刚分配好的Dcache空间。 lis r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h ori r1, r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l li r0, 0 stwu r0, -4(r1) 2.5 cpu_init_f 函数
该函数是系统执行的第一个C语言的函数,主要是做一些CPU 寄存器的初始化,其中最重要的部分是初始化Local Access Windows的值和Local Bus上的片选BR,OR的值。这些值需要在/include/configs/MPC8308rru.h中配置好。
12
2.6 board_init_f 函数
该函数为板级初始化的第一个函数,会对板子上很多硬件外设做初始化,其中最重要的为init_sequence数组,该数组里面包含了很多板级的硬件初始化函数,在
board_init_f函数中会依次的调用该数组中的函数去初始化各个硬件,该数组如下:
init_fnc_t *init_sequence[] = { #if defined(CONFIG_BOARD_EARLY_INIT_F) board_early_init_f, #endif
#if !defined(CONFIG_8xx_CPUCLK_DEFAULT)
get_clocks, /* get CPU and bus clocks (etc.) */ #if defined(CONFIG_TQM8xxL) && !defined(CONFIG_TQM866M) / && !defined(CONFIG_TQM885D) adjust_sdram_tbs_8xx, #endif
init_timebase, #endif
#ifdef CFG_ALLOC_DPRAM #if !defined(CONFIG_CPM2) dpram_init, #endif #endif
#if defined(CONFIG_BOARD_POSTCLK_INIT) board_postclk_init, #endif
13
env_init,
#if defined(CONFIG_8xx_CPUCLK_DEFAULT)
get_clocks_866, /* get CPU and bus clocks according to the environment variable */
sdram_adjust_866, /* adjust sdram refresh rate according to the new clock */
init_timebase, #endif
init_baudrate, serial_init, console_init_f, display_options, #if defined(CONFIG_8260) prt_8260_rsr, prt_8260_clks,
#endif /* CONFIG_8260 */ #if defined(CONFIG_MPC83XX) prt_83xx_rsr, #endif checkcpu,
#if defined(CONFIG_MPC5xxx) prt_mpc5xxx_clks,
#endif /* CONFIG_MPC5xxx */ #if defined(CONFIG_MPC8220)
14
prt_mpc8220_clks, #endif checkboard,
INIT_FUNC_WATCHDOG_INIT #if defined(CONFIG_MISC_INIT_F) misc_init_f, #endif
INIT_FUNC_WATCHDOG_RESET
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) init_func_i2c, #endif
#if defined(CONFIG_DTT) /* Digital Thermometers and Thermostats */ dtt_init, #endif
#ifdef CONFIG_POST post_init_f, #endif
INIT_FUNC_WATCHDOG_RESET
init_func_ram,
#if defined(CFG_DRAM_TEST) testdram,
#endif /* CFG_DRAM_TEST */ INIT_FUNC_WATCHDOG_RESET
15