文章导读
大家好,今天我们来聊聊u-boot的第一阶段代码。这个阶段主要做了哪些事情?又是如何一步步完成这些任务的?让我们一起深入解析一下。
u-boot第一阶段代码分析
#include
#include
start.S:
.globl _start
_start: b reset
reset:
/* 1.set the cpu to SVC32 mode */
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
/* 2.turn off the watchdog */
#if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#elif defined(CONFIG_S3C2410) //这里定义了CONFIG_S3C2410
# define pWTCON 0x53000000
# define INTMOD 0X4A000004
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
#endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) /*向寄存器中写入0,关看们狗*/
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
/*3.mask all IRQs by setting all bits in the INTMR - default*/
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
/*4.Init */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT //没有定义CONFIG_SKIP_LOWLEVEL_INIT
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM _TEXT_BASE is running address*/
cmp r0, r1 /* don't reloc during debug */
blne.cpu_init_crit
#endif
#ifndef CONFIG_SKIP_LOWLEVEL_INIT //没有定义CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/* 4-1.flush v4 I/D caches*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
/*4-2.disable MMU stuff and caches*/
mrc p15, 0, r0, c1, c0, 0
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
/*4-3.setup RAM timing*/
/ * before relocating, we have to setup RAM timing
* because memory timing is board-dependend, you will
* find a lowlevel_init.S in your board directory.\*/
mov ip, lr //保存子程序的返回地址
bl lowlevel_init
mov lr, ip
mov pc, lr
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
重要步骤详解
下面是一些关键步骤的详细解析:
- 设置CPU管理模式:将CPU设置为SVC32管理模式。
- 关闭看门狗:根据不同的硬件平台,关闭看门狗。
- 屏蔽所有中断:通过设置INTMSK寄存器屏蔽所有中断。
- 初始化:包括清除缓存、禁用MMU和缓存、设置RAM时序等。
小结与拓展
本文对u-boot第一阶段代码进行了详细解析,介绍了其关键步骤和作用。如果你对u-boot的其他阶段或者相关技术感兴趣,可以关注我们的网站了解更多内容。
—— 陈景序,websoft网络软件专家(www.phpwebsoft.com)资深编辑
