- UID
- 1029342
- 性别
- 男
|
reset:
mrs r0,cpsr
bic r0,r0,#0x1f //r0=r0 AND(!0x1f),屏蔽所有中断,为中断提供服务通常是OS的设备驱动的责任,在bootloader执行中不需要中断
orr r0,r0,#0xd3 //逻辑或
msr cpsr,r0 //svcmode
*设置cpu运行在SVC32模式。ARM共有7种模式:
* 用户模式(usr): arm处理器正常的程序执行状态
* 快速中断模式(fiq): 用于高速数据传输或通道处理
* 外部中断模式(irq): 用于通用的中断处理
* 超级保护模式(svc): 操作系统使用的保护模式
* 数据访问终止模式(abt): 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
* 系统模式(sys): 运行具有特权的操作系统任务
* 未定义指令中止模式(und): 当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
* 通过设置ARM的CPSR寄存器,让CPU运行在操作系统保护模式,为后面进行其它操作作好准备了。
*************************************************************************/
#if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008
# define CLKDIVN 0x14800014
#elif defined(CONFIG_S3C2410)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014
#endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr r0,=pWTCON
mov r1,#0x0
str r1,[r0] //各个硬件还未就绪,关闭看门狗
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
//FCLK用于CPU,HCLK用于AHB,PCLK用于APB
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit //初始化CPU
#endif
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:
adr r0, _start
stack_setup:
ldr r0, _TEXT_BASE
sub r0, r0, #CFG_MALLOC_LEN
sub r0, r0, #CFG_GBL_DATA_SIZE
#ifdef CONFIG_USE_IRQ
sub r0, r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12
clear_bss:
ldr r0, _bss_start
ldr r1, _bss_end
mov r2,#0x00000000
clbss_l:str r2,[r0]
add r0, r0, #4
cmp r0, r1
ble clbss_l
* 已经准备好了堆栈,就可跳到C写的代码里了,也就是
* 跳到内存中的/u-boot-1.1.4/board.c -->start_armboot中运行了
* 把_start_armboot地址处的值也就是start_armboot绝对地址值移到pc
* 于是跳到C代码。
ldr pc, _start_armboot
_start_armboot: .wordstart_armboot
cpu_init_crit:
mov r0, #0
mcr p15, 0, r0, c7, c7, 0
mcr p15, 0, r0, c8, c7, 0
mrc p15, 0, r0, c1, c0,0 //将c1、c0的值写入到r0中
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
mcr p15, 0, r0, c1, c0,0 //将设置好的r0值写入到协处理器p15的c1、c0中
mov ip, lr //保存前一个跳转地址,防止下一个跳转将前一个lr地址覆盖
bl lowlevel_init//board/smdk2410/lowlevel_init.S:用于完成芯片存储器的初始化
mov lr, ip
mov pc, lr //返回cpu_init_crit函数
2.Stage2:lib_arm/board.c
此文件是u-bootStage2部分,入口为Stage1最后调用的start_armboot函数。注意上面最后ldr到pc的是_start_armboot这个地址,而非start_armboot变量。
start_armboot是U-Boot执行的第一个C语言函数,完成如下工作:
1. 初始化MMU
2.初始化外部端口
3. 中断处理程序表初始化
4. 串口初始化
5. 其它部分初始化(可选)
6. 主程序循环 |
|