上接:http://blog.csdn.net/chinesedragon2010/archive/2010/09/20/5895956.aspx
1.2 关闭所有的CPU中断
通过对INTMSK,INTSUBMSK寄存器特定为设置为1来屏蔽中断源的中断请求,接着通过对中断模式寄存器INTMOD清零来把中断设置为IRQ模式。
1.3系统时钟设置
我的另一篇博客介绍了S3C2443的时钟管理http://blog.csdn.net/chinesedragon2010/archive/2010/09/24/5903553.aspx
这些红色字体的值在S3C2443.inc文件中定义,
Startup_Mdiv EQU 81
Startup_Pdiv EQU 2
Startup_Sdiv EQU 1
这些值的实际意义是什么呢?我们先来看看上图的第188行到190行对MPLLCON寄存器的设置,结合下表
可知FOUT=534MHZ,这就是MSysClk,也就是ARMCLK、HCLK、PCLK、DDRCLK等时钟的基准时钟,下图可以很清楚描述这些时钟的关系
现在我们知道FOUT=534MHZ了,S3C2443.inc文件中定义
Startup_ARMCLKdiv EQU 0
Startup_PREdiv EQU 0x1
Startup_HCLKdiv EQU 0x1
Startup_PCLKdiv EQU 1
那么这些值代表的意义是什么呢?
其中Startup_ARMCLKdiv=0,根据CLKDIVO寄存器对ARMDIV位的定义可知ARMCLK=MSysClk=534MHZ,也就是ARM内核的主频是534MHZ。
Startup_PREdiv=1,根据上图,可知MSysClkPreDiv= MSysClk/2。
Startup_HCLKdiv=1,Startup_PCLKdiv=1,根据下表可知HCLK:DDRCLK:PCLK=4:2:8,可以得到HCLK=ARMCLK/4,PCLK=ARMCLK/8
这些关系会在bsp_cfg.h中对FCLK、PCLK和HCLK中得到体现。
下面接着看对CLKSRC寄存器的设置
ldr r0,=CLKSRC ; Select MPLL clock out for SYSCLK
ldr r1,[r0]
orr r1,r1,#0x50
str r1,[r0]
上面代码主要是选择MPLL输出作为MSysClk的基准时钟,选择EPLL输出作为ESYSCLK的基准时钟。
1.4 设置CPU的总线模式
通过调用函数MMU_SetAsyncBusMode来把CPU的总线模式设置为同步模式
bl MMU_SetAsyncBusMode
此函数体定义如下
MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
mov pc, lr
通过上图我们可知mrc p15,0,r0,c1,c0,0是用于读取控制寄存器C1到R0中,也知道C1在系统复位后C1控制寄存器除了V位之外的所有控制位都为0,见下图
那么就是上电复位后,控制寄存器C1的iA和nF位,也即iA和nF位这两位的值也为0,下表是iA和nF位这两位组合的定义
结合上面这些图表及下面的定义
R1_iA EQU (1<<31)
R1_nF EQU (1<<30)
所以orr r0,r0,#R1_nF:OR:R1_iA的意义就是先判断R1_nF是否为1,如为1,则对C1的nF位做或运算,也即把CPU的时钟模式设置为Synchronous模式;如为0,则对C1的iA位做或运算,也即把CPU的时钟模式设置为FastBus模式,接着通过mcr p15,0,r0,c1,c0,0语句把运算后的结果写回C1控制寄存器。
1.5 设置CLKOUT0和CLKOUT1的时钟源
设置CLKOUT0的时钟源为PCLK,设置CLKOUT1的时钟源为HCLK。
ldr r0,=MISCCR
ldr r1,[r0]
bic r1,r1, #0x770
orr r1,r1,#0x320
str r1,[r0]
配置GPH13和GPH14分别为CLKOUT0与CLKOUT1。
ldr r0,=GPHCON
ldr r1,[r0]
bic r1,r1, #0x3C000000
orr r1,r1, #0x28000000
str r1,[r0]