嵌入式Linux裸机开发(三)——BL0初始化
BL0阶段的初始化过程如下:
1、关闭看门狗
2、初始化icache(打开icache)
3、初始化栈(设置中断栈、SVC栈)
4、初始化堆
5、初始化块设备copy函数
6、初始化PLL和设置系统时钟(三星参考时钟设置)
一、关闭看门狗
看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间应发出指令让,重新开始。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。由于CPU默认打开看门狗,因此需要在启动代码的开始关闭看门狗(默认S5PV210的irom BL0中已经关闭看门狗)。
看门狗是一个内部外设,位于SoC内。查阅S5PV210文档可知,看门狗的相关控制寄存器如下:
WTCON0xE2700000bit5: 0 = Disables 1 = Enables
关闭看门狗放在程序启动代码开始,汇编代码如下:
#define WDTCON 0xE2700000
//关闭看门狗
ldr r0,=WDTCON
ldr r1,=0x8001//bit5设置为0,其它位设置为默认
str r1,[r0]
二、开启iCache
S5PV210内部有32KB的icache和32KB的dcache。Dcache和MMU相关,裸机程序MMU关闭,不考虑。
//关闭icache,S5PV210默认IROM中已结打开
mrc p15,0,r0,c1,c0,0 //读出cp15的c1到r0
// bic r0,r0,#(1<<12) //置0,关闭
orr r0,r0,#(1<<12) //置1,开
mcr p15,0,r0,c1,c0,0 //写入r0到
三、设置栈
C语言运行时需要一定的环境,因此调用C语言代码前需要设置C语言运行时环境。CPU复位后为SVC模式,DRAM尚未初始化,只有SRAM可用,查阅文档S5PV210_iROM_ApplicationNote_Preliminary可知SVC栈空间从0xD0037780到0xD0037D80,大小1.5K。
汇编代码如下:
#define SVC_SP 0xD0037D80
ldr sp,=SVC_SP
设置好C语言运行时环境后就可以调用C语言的函数了。