📄 pll_test.c
字号:
/*======================================================================
Project Name : S3C2443
Copyright 2006 by Samsung Electronics, Inc.
All rights reserved.
Project Description :
This software is only for verifying functions of the S3C2443.
Anybody can use this code without our permission.
File Name : PLL_test.c
Description : S3C2443 AC97 module code
Author : C.S. Jeon
Dept : AP
Created Date : 2006.06.24
Version : 0.0
History
R0.0 (2006.06.15): C.S.Jeon draft
- This code is derived from S3C2442 PLL change test code.
- modified by junon 060623
=======================================================================*/
#include "system.h"
#include "pll_test.h"
void Auto_Change_Pll(void);
void Test_PllOnOff(void);
void Test_Locktime(void);
void Test_EPLL_Locktime(void);
void Test_Clock_Divide(void);
// Sub function
U32 Calc_Locktime(U32 lock_time);
#if FIN==12000000
volatile unsigned int Mps_Val[][4]={
// MPLL_CLK, M, P, S.
{350000000, 350, 3, 2},
{360000000, 360, 3, 2},
{370000000, 370, 3, 2},
{380000000, 380, 3, 2},
{390000000, 390, 3, 2},
{400000000, 400, 3, 2},
{410000000, 205, 3, 1},
{420000000, 210, 3, 1},
{430000000, 215, 3, 1},
{440000000, 220, 3, 1},
{450000000, 225, 3, 1},
{460000000, 230, 3, 1},
{470000000, 235, 3, 1},
{480000000, 240, 3, 1},
{490000000, 245, 3, 1},
{500000000, 250, 3, 1},
{510000000, 255, 3, 1},
{520000000, 260, 3, 1},
{530000000, 265, 3, 1},
{532000000, 266, 3, 1},
{534000000, 267, 3, 1},
{540000000, 270, 3, 1},
{550000000, 275, 3, 1},
{560000000, 280, 3, 1},
{570000000, 285, 3, 1},
{580000000, 290, 3, 1},
{590000000, 295, 3, 1},
{750000000, 375, 3, 1},
{760000000, 380, 3, 1},
{770000000, 385, 3, 1},
{780000000, 390, 3, 1},
{790000000, 395, 3, 1},
{800000000, 400, 3, 1},
{810000000, 270, 4, 0},
{820000000, 205, 3, 0},
{840000000, 210, 2, 0},
{860000000, 215, 3, 0},
// {1092000000, 83, 2, 0},
};
#endif
int No_Of_Mps_Val=sizeof(Mps_Val)/16;
void * func_pll_test[][2]=
{
// "123456789012345678901"
(void *)Test_Locktime, "MPLL Locktime Test ",
(void *)Test_EPLL_Locktime, "EPLL Locktime Test ",
(void *)Test_Clock_Divide, "Clock Divider Test ",
(void *)Manual_Change_Pll, "Manual PLL Test ",
(void *)Auto_Change_Pll, "Auto PLL Test ",
(void *)Test_PllOnOff, "PLL On/Off Test ",
(void *)System_Burden_Test, "burden test ",
0,0
};
void Test_PLL(void)
{
int i;
rGPHCON=rGPHCON&~(0xf<<26)|(0xa<<26);
// CLKOUT1 CLKOUT0
rMISCCR=rMISCCR&~((0x7<<8)|(0x7<<4))|(0x1<<8)|(0x1<<4);
rCLKDIV0|=(1<<14);
rCLKSRC|=(0x3<<7);
while(1)
{
i=0;
printf("\n\n=============== PLL Function Test ===============\n\n");
while(1)
{ //display menu
printf("%2d:%s",i,func_pll_test[i][1]);
i++;
if((int)(func_pll_test[i][0])==0)
{
printf("\n");
break;
}
if((i%4)==0)
printf("\n");
}
printf("\n======================================================\n");
printf("Select #Item or Press Enter key to exit : ");
i = GetIntNum();
if(i==-1) break; // return.
if(i>=0 && (i<((sizeof(func_pll_test)-1)/8)) ) // select and execute...
( (void (*)(void)) (func_pll_test[i][0]) )();
}
}
// lock time: user lock time setting time[us],
// lock_count: register setting value for wanted locktime.
#define TIME_OF_XTAL ((float)1000000/(float)FIN) //us
U32 Calc_Locktime(U32 lock_time)
{
U32 lock_count=0;
lock_count = (U32)((float)lock_time/((float)TIME_OF_XTAL));
return lock_count;
}
void Test_Locktime(void)
{
int i;
U32 lock_time=300, lock_count=12048; //Unit is us.
// U32 mpllcon_bk;
// clock register backup.
// mpllcon_bk = rMPLLCON;
printf("[MPLL Lock time test 100,000 times]\n");
printf("Lock time range: 300us - %d [us]\n", (U32)(0xffff*TIME_OF_XTAL));
printf("Input Lock time[us]: ");
lock_time = GetIntNum();
lock_count = Calc_Locktime(lock_time); // lock_time [us]
rLOCKCON0=(lock_count<<0);
printf("Locktime register value is %d(%xh).\n", rLOCKCON0&0xffff);
// printf("Clock will be locked after LED7 is ON.\n");
i=0;
while(1)
{
if(Uart_GetKey()!=0x0)
break;
if(i>100000)
break;
if(i%2)
{
Led_Display(0x8);
SetMPLL( 450, 3, 2);
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("[400MHz]\n");
}
else
{
Led_Display(0x0);
SetMPLL( 300, 3, 2);
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("[300MHz]\n");
}
//Delay(1000);
i++;
}
printf("[PLL Lock time test %d times end]\n",i-1);
}
void Test_EPLL_Locktime(void)
{
int temp;
int i;
U32 lock_time=150, lock_count=12048; //Unit is us.
U32 epllcon_bk;
// clock register backup.
epllcon_bk = rEPLLCON;
printf("EPLLCON: %x.\n", rEPLLCON);
printf("[EPLL Lock time test 100,000 times]\n");
printf("Lock time range: 150us - %d [us]\n", (U32)(0xffff*TIME_OF_XTAL));
printf("Input Lock time[us]: ");
lock_time = GetIntNum();
lock_count = Calc_Locktime(lock_time); // lock_time [us]
rLOCKCON1=(lock_count<<0);
rCLKSRC|=(1<<6); // EPLL Output
SetEPLL( 32, 1, 2); // EPLL 96MHz
rEPLLCON&=~(1<<24); // EPLL ON
printf("Locktime register value is %d(%xh).\n", rLOCKCON1&0xffff, rLOCKCON1&0xffff);
printf("CLKSRC:%x EPLLCON: %x", rCLKSRC, rEPLLCON);
getchar();
// printf("Clock will be locked after LED7 is ON.\n");
i=0;
while(1)
{
if(Uart_GetKey()!=0x0)
break;
// if(i>100000)
// break;
if(i%2)
{
Led_Display(0x8);
SetEPLL( 32, 1, 2); // EPLL 96MHz
printf(".");
}
else
{
Led_Display(0x2);
SetEPLL( 32, 1, 3); // EPLL 48MHz
printf(",");
}
Delay(10);
i++;
}
printf("[PLL Lock time test %d times end]\n",i-1);
}
void Test_Clock_Divide(void)
{
int temp;
int i,j, mval, pval, sval, fclk, hdiv_val, pdiv_val;
U32 clkdiv0_bk;
int k;
clkdiv0_bk=rCLKDIV0;
Uart_TxEmpty();
SetCLKDIV( 1, 3, 3, 1); // 2:16:32
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("\n[Clock Divide Test]\n");
printf("Probe CLKOUT0 and check FCLK, HCLK, PCLK\n");
rGPHCON=rGPHCON&~(3<<26)|(2<<26); // CLKOUT0 setting
rGPHUDP&=~(3<<26); // pull updown disable
rMISCCR=rMISCCR&~(7<<4)|(2<<4); // 2: FCLK, 3:HCLK, 4:PCLK
printf("MPLLOUT is 800MHz\n");
//printf("MPLLOUT is 400MHz\n");
k=ARMCLKdiv;
for (k=0;k>15;k++)
{
if( (!((PREdiv+1)*(HCLKdiv+1))%(k+1)) && (ARMCLK>HCLK) && (HCLK<134))
{
printf("ARMCLK=MPLLOUT/%d \n ", k);
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(k<<9);
getchar();
SystemCLK(0);
Console(1);
}
}
/*
printf("ARMCLK=MPLLOUT /1 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x0<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /2 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x1<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /3 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x2<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /4 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x3<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /6 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x5<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /8 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x7<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /12 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0xd<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /16 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0xf<<9);
getchar();
SystemCLK(0);
Console(1);
*/
printf("MPLL:ARMCLK:HCLK:PCLK = 800MHz:400MHz:133MHz:66MHz\n ");
printf("CLKOUT0 => HCLK \n ");
rMISCCR=rMISCCR&~(7<<4)|(3<<4); // 2: FCLK, 3:HCLK, 4:PCLK
printf("HCLK=MPLLOUT/6 (800MHz /6) \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x1<<9);
//printf("HCLK=MPLLOUT/4 (400MHz /4) \n ");
//rCLKDIV0=rCLKDIV0&~((0x3<<4)|(0x3<<0))|(0x1<<4)|(1<<0);
//SystemCLK(0);
//ChangeSDRAMParameter(HCLK);
//Console(1);
//getchar();
printf("HCLK=MPLLOUT /6 \n ");
rCLKDIV0=rCLKDIV0&~((0x3<<4)|(0x3<<0))|(0x2<<4)|(1<<0);
getchar();
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("HCLK=MPLLOUT /8 \n ");
rCLKDIV0=rCLKDIV0&~((0x3<<4)|(0x3<<0))|(0x3<<4)|(1<<0);
getchar();
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("HCLK=MPLLOUT /12 \n ");
rCLKDIV0=rCLKDIV0&~((0x3<<4)|(0x3<<0))|(0x2<<4)|(3<<0);
getchar();
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("HCLK=MPLLOUT /16 \n ");
rCLKDIV0=rCLKDIV0&~((0x3<<4)|(0x3<<0))|(0x3<<4)|(3<<0);
getchar();
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("CLKOUT0 => PCLK \n ");
rMISCCR=rMISCCR&~(7<<4)|(4<<4); // 2: FCLK, 3:HCLK, 4:PCLK
printf("PCLK=HCLK (800MHz /16) \n ");
rCLKDIV0=rCLKDIV0&~(0x1<<2)|(0x0<<2);
getchar();
SystemCLK(0);
Console(1);
printf("PCLK=HCLK /2 (800MHz /32) \n ");
rCLKDIV0=rCLKDIV0&~(0x1<<2)|(0x1<<2);
getchar();
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x1<<9);
rCLKDIV0=rCLKDIV0&~((0x3<<4)|(0x3<<0))|(0x1<<4)|(1<<0);
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("[Clock divide test end]\n");
}
/*
void Test_Clock_Divide(void)
{
int temp;
int i,j, mval, pval, sval, fclk, hdiv_val, pdiv_val;
U32 clkdiv0_bk;
clkdiv0_bk=rCLKDIV0;
Uart_TxEmpty();
SetCLKDIV( 0, 3, 3, 1); // 1:16:16
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
Console(1);
printf("\n[Clock Divide Test]\n");
printf("Probe CLKOUT0 and check FCLK, HCLK, PCLK\n");
rGPHCON=rGPHCON&~(3<<26)|(2<<26); // CLKOUT0 setting
rGPHUDP&=~(3<<26); // pull updown disable
rMISCCR=rMISCCR&~(7<<4)|(2<<4); // 2: FCLK, 3:HCLK, 4:PCLK
printf("MPLLOUT is 400MHz\n");
printf("ARMCLK=MPLLOUT \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /2 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x8<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /3 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x2<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /4 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x9<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /6 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0xa<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /8 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0xb<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /12 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0xd<<9);
getchar();
SystemCLK(0);
Console(1);
printf("ARMCLK=MPLLOUT /16 \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0xf<<9);
getchar();
SystemCLK(0);
Console(1);
printf("MPLL:ARMCLK:HCLK:PCLK = 400MHz:400MHz:100MHz:50MHz\n ");
printf("CLKOUT0 => HCLK \n ");
rMISCCR=rMISCCR&~(7<<4)|(3<<4); // 2: FCLK, 3:HCLK, 4:PCLK
printf("HCLK=MPLLOUT/4 (400MHz /4) \n ");
rCLKDIV0=rCLKDIV0&~(0xf<<9)|(0x0<<9);
rCLKDIV0=rCLKDIV0&~((0x3<<4)|(0x3<<0))|(0x1<<4)|(1<<0);
SystemCLK(0);
ChangeSDRAMParameter(HCLK);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -