**进入uboot/cpu/s5pc11x/start.S:
(1)构建异常向量表
(2)设置CPU工作在SVC模式,ARM状态,禁止FIQ IRQ。
**在SRAM设置栈并进入uboot/board/samsuang/具体开发板名字/lowlevel_init.S:
(注,为什么要设置栈,因为在lowlevel_init.S中还要调用别的函数,而LR只有一个)
(4)检查复位状态
直接冷上电、热启动、睡眠(低功耗)状态下的唤醒等
(5)IO状态恢复
(6)关看门狗
(7)开发板供电置锁
判断当前代码执行位置SRAM(初始化CLK,DDR),DRAM(跳过初始化CLK,DDR)
(8)时钟初始化
(9)内存初始化
(10)串口初始化并打印“OK”
**回到uboot/cpu/s5pc11x/start.S:
(11)判断是从哪种介质启动的
(12)代码重定位
从SD卡把整个uboot重定位到DDR的指定位置(TEXT_BASE)开始
(13)建立映射表(TTB)并打开MMU
在ARM中支持3种块大小,细表1KB、粗表4KB、段1MB,这里使用段式。
使能域访问(cp15的c3寄存器)
设置TTB(cp15的c2寄存器)
使能MMU单元(cp15的c1寄存器)
MMU相关:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=22891521&id=2109284
(14)清DDR的BSS段
(15)长跳转到第二阶段ldr pc, _start_armboot 跳转到DDR的_start_armboot开始运行
总结:第一阶段是在SRAM中运行的,主要是初始化CPU内部相关的,比如cache,时钟,
看门狗,DDR控制器。接着跳转到第二阶段,大概就是初始化一些必要的外设,比如网卡,
串口,flash等等,接着倒计时bootdelay,或者进入命令行,接收,解析,执行命令。直到
执行驱动内核的命令,uboot的使命就终结了!