嵌入式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文档可知,看门狗的相关控制寄存器如下:

WTCON0xE2700000bit50 = 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关闭,不考虑。

//关闭icacheS5PV210默认IROM中已结打开

mrc p15,0,r0,c1,c0,0    //读出cp15c1r0

//  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语言的函数了。