跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

u-boot第一阶段代码解析:关键步骤详解!

文章导读

大家好,今天我们来聊聊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)资深编辑

相关文章