时钟对于一个系统的重要性不言而喻,时钟决定了系统发送数据的快慢,高性能的芯片往往能支持更快速度的时钟,从而提供更好的体验。
S3C2440的输入时钟频率是12MHZ,对于这款芯片,显然速度是不够的,所以就需要进行设置来获取我们想要的频率,S3C2440的芯片手册提供了这样的一个表格供选择
现在我们希望获取的输出频率为400MHZ,那么就需要设置MDIV,PDIV,SDIV这三个数值,只需设置对应的寄存器即可;因为需要的是400MHZ,因此使用的是MPLLCON
代码实现如下:
#define S3C2440_MPLL_400MHZ ((0x5c << 12) | (0x1 << 4) | (0x1)) ldr r0,=0x4c000004 ldr r1,=S3C2440_MPLL_400MHZ str r1,[r0]
这个获取到了FCLK=400MHZ,还需要获取HCLK=200MHZ, PCLK=100MHZ,PCLK=100MHZ是最终的目的,所以还需要设置CLKDIVN寄存器
实现代码如下:
ldr r0,=0x4c000014
mov r1,#0x03 //FCLK:HCLK:PCLK = 4:2:1, HDIVN=1, PDIVN=1
str r1,[r0]
最后,芯片手册还有个notes,信息如下
当HDIVN不为0的时候,CPU的总线模式必须通过如下的指令切换成异步总线模式
mrc p15,,r0,c1,c0, orr r0,r0,#R1_nF:OR:R1_iA mcr p15,,r0,c1,c0,
至此S3C2440的时钟初始化就完成了,因为时钟初始化是在u-boot中进行的,所以使用了汇编进行编码,不过身为一个嵌入式er,这点汇编肯定是小意思啦。