U-Boot启动过程可以分成两个阶段(stage)
下面是u-boot启动过程的流程图其中左右两部分分别是启动过程的两个阶段
第一阶段(stage 1):
依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置ARM进入SVC模式、禁止IRQ和FIQ、关闭看门狗、屏蔽所有中断。设置时钟(FCLK,HCLK,PCLK)、清空I/D cache、清空TLB、禁止MMU和cache、配置内存控制器、为搬运代码做准备、搬移uboot映像到RAM中(使用copy_loop实现)、分配堆栈、清空bss段(使用clbss_l实现)。
(1)具体设置与代码实现:
ü
CPSR 寄存器(和保存它的 SPSR 寄存器)中的位分配如下:
31 30 29 28 --- 7 6 - 4 3 2 1 0
N Z C V I F M4 M3 M2 M1 M0
0 0 0 0 0 User26 模式
0 0 0 0 1 FIQ26 模式
0 0 0 1 0 IRQ26 模式
0 0 0 1 1 SVC26 模式
1 0 0 0 0 User 模式
1 0 0 0 1 FIQ 模式
1 0 0 1 0 IRQ 模式
1 1 1 0 0 1 1 SVC 模式
1 0 1 1 1 ABT 模式
1 1 0 1 1 UND 模式
要设置成SVC模式,则要将先关中断即将6位IRQ(中断),7位(快速中断)置位;
|
关闭看门狗、屏蔽所有中断
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) # if defined(CONFIG_S3C2410) # endif |
对于S3C2440和S3C2410的WTCON寄存器的[0]控制允许或禁止看门狗定时器的复位输出功能,设置为“0”禁止复位功能。通过设置INTMSK,INTSUBMSK的所有中断位即可屏蔽所有中断。
#ifndef CONFIG_SKIP_LOWLEVEL_INIT |
MCR与MRC是对ARM处理器的协处理器进行操作的指令;
Invalidate ICache and DCache|SBZ|MCR p15,0,Rd,c7,c7,0 |
MCR p15,0,r0,c8,c7,0的操作原型如下:
Invalidate TLB(s)|SBZ|MCR p15,0,Rd,c8,c7,0 |
|
在ARM920T Technical Reference Manual(Rev 1)说明文档中,可以查到如下的信息:
|
注:对于第一阶段时钟初始化等在这儿不作讲解。
第二阶段(stage 2)通常用C语言来实现。
首先以start_armboot()函数为入口点,主要进行如下操作: