uboot启动流程
简介
-
不同平台uboot启动流程不一样,但是基本思想是一致的
-
从更高的视角去理解,无须拘泥与具体细节(例如寄存器细节,写代码的时候再查手册,写完就可以忘记了)
1)S3C6410 地址布局
-
ARM 启动地址:0x0000_0000
-
Stepping Stone 起始地址:0x0c00_0000
-
DRAM 起始地址:0x5000_0000
2)S3C6410 自举流程
-
nand前8K地址中保存了uboot的一部分代码
-
IROM(BL0)读取nand前8K数据到Stepping Stone
-
”Stepping Stone 地址“ 映射到 “ARM 启动地址”, BL0跳转到“ARM 启动地址”
-
此时开始运行uboot代码
3)uboot第一阶段——cpu/…/start.S & board/…/lowlevel_init.S
-
初始化的异常向量表
-
设置为SVC32模式——start.S/reset
-
初始CPU寄存器——start.S/cpu_init_crit
-
关闭wathdog,关闭可屏蔽中断,简单重置可屏蔽中断——lowlevel_init.S/lowlevel_init
-
初始化系统时钟——lowlevel_init.S/system_close_init,此后JTAG使能,可以用JLINK调试
-
初始化uart——lowlevel_init.S/uart_asm_init,此后可以通过串口调试工具查看输出
-
初始化nand——lowlevel_init.S/nand_asm_init
-
初始化dram——lowlevel_init.S/mem_ctrl_asm_init
-
判断是否需要从nand中copy更多代码,copy函数为——start.S/copy_from_nand
-
使能MMU——start.S/enable_mmu
-
初始化stack——start.S/stack_setup
-
初始化bss——start.S/clear_bss
-
完成第一阶段,跳转到start_armboot
3.1)uboot第一阶段细节补充——MMU页表定义
/* form a first-level section entry */
.macro FL_SECTION_ENTRY base,ap,d,c,b