启动过程:
1、msc_spl\board\Pisces\start.S _start
工作过程
a、Check reset status (第二阶段 忽略)
la t0, CPM_RSR
lw t1, 0(t0)
andi t1, 0x4
bnez t1, resume_from_sleep
nop
b、Clear watch registers (第二阶段 忽略) |
mtc0 zero, CP0_WATCHLO
mtc0 zero, CP0_WATCHHI
c、设置CP0_STATUS (第二阶段 忽略)
li t0,0x0040FC04
mtc0 t0,CP0_STATUS
d、设置CP0_CAUSE (第二阶段 忽略)
li t1, 0x00800000
mtc0 t1, CP0_CAUSE
e、设置CP0_CONFIG
li t0, CONF_CM_UNCACHED
mtc0 t0, CP0_CONFIG
f、 Initialize GOT pointer
bal 1f
nop
.word _GLOBAL_OFFSET_TABLE_
1:
move gp, ra
lw t1, 0(ra)
move gp, t1
g、设置栈指针sp,跳转至spl_boot (第二阶段 忽略)
la sp, 0x80004000
la t9, spl_boot
j t9
nop
注意:第二阶段在此调用如下代码:
li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET
la sp, 0(t0)
la t9, board_init_f
j t9
nop
2、msc_spl\board\Pisces\Msc_boot_jz4770.c spl_boot
初始化硬件:
__cpm_start_dmac();
__cpm_start_ddr();
...
uart_init();
serial_init();
...
pll_init();
sdram_init();
mmc_load();//将mmc中偏移地址32加载到0x80100000,大小为512k
flush_cache_all();
//执行0x80100000处的代码,此时将重新返回start.S执行
3、msc_spl\board\Pisces\start.S _start
3、Lib_mips\Board.c board_init_f
a、初始化硬件包括:
jz_board_init 初始化 gpio clocks dram etc
timer_init 定时器
env_init 环境变量
init_baudrate 波特率
serial_init 串口
console_init_f
display_banner 打印uboot版本
checkboard 打印设备名词
init_func_ram 调用jz4770_ddr.c中的initdram(0)函数 得到SDRAM大小为128M 存储在gd->ram_size中
b、初始化LCD,将framebuffer指针存储在gd->fb_base中
c、预留出UBoot文件使用的空间 uboot_end-TEXT_BASE
d、预留出malloc的堆空间 896k
e、预留出board info空间 存储在gd->bd中
f、预留出global data空间
g、预留出启动参数空间,存储在bd->bi_boot_params中
h、最后:
bd->bi_memstart=0x80000000
bd->bi_memsize=gd->ram_size(128M)
bd->bi_baudrate=gd->baudrate
调用relocate_code(栈指针,global_data,UBOOT的SDRAM预留地址)
4、cpu\mips\start.S relocate_code
5、Lib_mips\Board.c board_init_r
6、Common\Main.c main_loop
7、Common\Main.c run_command
8、Common\Cmd_msc.c do_msc
9、Common\Cmd_bootm.c do_bootm