分类: LINUX
2011-09-25 22:29:35
转:http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html
# if defined(CONFIG_S3C2440)
#define MPLLCON 0x4C000004
#define UPLLCON 0x4C000008
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
ldr r0, =MPLLCON
ldr r1, =0x7F021
str r1, [r0]
ldr r0, =UPLLCON
ldr r1, =0x38022
str r1, [r0]
# else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
CPU上电几毫秒后,晶振输出稳定,FCLK=Fin(晶振频率),CPU开始执行指令。但实际上,FCLK可以高于Fin,为了提高系统时钟,需要用软件来启用PLL。这就需要设置CLKDIVN,MPLLCON,UPLLCON这3个寄存器。
CLKDIVN寄存器用于设置FCLK,HCLK,PCLK三者间的比例,可以根据表2.2来设置。
表 2.2 S3C2440 的CLKDIVN寄存器格式
CLKDIVN
位
说明
初始值
HDIVN
[2:1]
00 : HCLK = FCLK/1.
01 : HCLK = FCLK/2.
10 : HCLK = FCLK/4 (当 CAMDIVN[9] = 0 时)
HCLK= FCLK/8 (当 CAMDIVN[9] = 1 时)
11 : HCLK = FCLK/3 (当 CAMDIVN[8] = 0 时)
HCLK = FCLK/6 (当 CAMDIVN[8] = 1时)
00
PDIVN
[0]
0: PCLK = HCLK/1 1: PCLK = HCLK/2
0
设置CLKDIVN为5,就将HDIVN设置为二进制的10,由于CAMDIVN[9]没有被改变过,取默认值0,因此HCLK = FCLK/4。PDIVN被设置为1,因此PCLK= HCLK/2。因此分频比FCLK:HCLK:PCLK = 1:4:8 。
MPLLCON寄存器用于设置FCLK与Fin的倍数。MPLLCON的位[19:12]称为MDIV,位[9:4]称为PDIV,位[1:0]称为SDIV。
对于S3C2440,FCLK与Fin的关系如下面公式:
MPLL(FCLK) = (2×m×Fin)/(p×)
其中: m=MDIC+8,p=PDIV+2,s=SDIV
MPLLCON与UPLLCON的值可以根据参考文献4中“PLL VALUE SELECTION TABLE”设置。该表部分摘录如下:
表 2.3 推荐PLL值
输入频率
输出频率
MDIV
PDIV
SDIV
12.0000MHz
48.00 MHz
56(0x38)
2
2
12.0000MHz
405.00 MHz
127(0x7f)
2
1
当mini2440系统主频设置为405MHZ,USB时钟频率设置为48MHZ时,系统可以稳定运行,因此设置MPLLCON与UPLLCON为:
MPLLCON=(0x7f<<12) | (0x02<<4) | (0x01) = 0x7f021
UPLLCON=(0x38<<12) | (0x02<<4) | (0x02) = 0x38022