📄 pll_test.c
字号:
printf("[Clock divide test end]\n");
}
void Manual_Change_Pll(void) // modified by junon 060623
{
U32 pval, mval, sval, s_temp, fclk, armdiv, prediv, hclkdiv, pclkdiv, voltage=120;
unsigned int i, fclk_sel;
float ffclk;
printf("[Running change test of M/P/S value]\n");
SystemCLK(1); // current clock setting
// clock out selection
rGPHCON = (rGPHCON&~(0xf<<26))|(0xa<<26); // use CLKOUT0, CLKOUT1
rMISCCR = (rMISCCR&~(0xff<<4))|(3<<8)|(2<<4); // [10:8]=CLKSEL1-3:HCLK, [6:4]=CLKSEL0-2:ARMCLK
for(i=0; i<sizeof(Mps_Val)/16; i++) {
if(i%2==0) printf("\n");
printf("%2d: MPLL=%4.1f [%xh(%d),%xh,%xh] ", i, (float)Mps_Val[i][0]/1000000,Mps_Val[i][1],Mps_Val[i][1],Mps_Val[i][2],Mps_Val[i][3]);
}
printf("\n");
#if 1
printf("Select MPLL No(0-%d): ", sizeof(Mps_Val)/16-1);
fclk_sel=GetIntNum();
mval = Mps_Val[fclk_sel][1];
pval = Mps_Val[fclk_sel][2];
sval = Mps_Val[fclk_sel][3];
#else
printf("Input M vlaue : ");
mval=GetIntNum();
printf("Input P vlaue : ");
pval=GetIntNum();
printf("Input S vlaue : ");
sval=GetIntNum();
#endif
printf("Select ARM divider [0=1/1, 8=1/2, 2=1/3, 9=1/4, 10=1/6, 11=1/8, 13=1/12, 15=1/16] : ");
armdiv=GetIntNum();
printf("Select Pre divider [0=1/1, 1=1/2, 2=1/3, 3=1/4] : ");
prediv=GetIntNum();
printf("Select HCLK divider [0=1/1, 1=1/2, 3=1/4] : ");
hclkdiv=GetIntNum();
printf("Select PCLK divider [0=1/1, 1=1/2] : ");
pclkdiv=GetIntNum();
// calculate MPLL clock
s_temp=(int)pow(2,sval);
ffclk = (U32) ( (((float)mval+8)*FIN*2.0)/(((float)pval)*(float)s_temp)); // pll3000x.
printf("Now change PLL value...(%dhz)[mps=%xh(%d), %d, %d]\n", (U32)ffclk, mval,mval, pval, sval);
/* printf("ARM core voltage? [ex)1.35V -> 135] : ");
voltage = GetIntNum();
if (voltage > 180)
{
printf("ARM core voltage limit is 1.5V, then set 1.5V\n");
voltage = 150;
}
Max1718_Set(1, voltage); // pwr=1:ARM, pwr=0:INT
Delay(10);
*/
SetCLKDIV(armdiv, prediv, hclkdiv, pclkdiv);
SetMPLL(mval, pval, sval);
SystemCLK(1);
ChangeSDRAMParameter(HCLK);
Console();
printf("press 'q' key to exit\n");
while(Uart_GetKey()!='q')
{
Led_Display(9);
for(i=0;i<100000;i++);
Led_Display(6);
for(i=0;i<100000;i++);
}
#if 0
//Uart_Getch();
printf("Memory test (y/n)? ");
if(getc()=='y') {
while(1) {
// Mem_Test(1);
if(Uart_getc()!=0x0) break;
//Uart_SendByte((int)'.');
}
}
#endif
}
void Auto_Change_Pll(void)
{
int temp, voltage=145;
int i,j, armdiv, prediv, hdiv, pval, sval, fclk, hdiv_val, pdiv_val;
U32 prev_fclk;
U32 mpllcon_bk, clkdivn_bk, camdivn_bk;
// clock register backup.
mpllcon_bk = rMPLLCON;
clkdivn_bk = rCLKDIV0;
printf("[PLL frequency change test 100,000 times] = %d depth\n",No_Of_Mps_Val);
Uart_TxEmpty();
rLOCKCON0=0xe10; // MPLL Lock Time
// 3614 is 300us at 12Mhz
printf("locktime=0x%x, \n",rLOCKCON0);
j=0;
while(1)
{
if(Uart_GetKey() == 'q')
break;
// if(j>100000)
// break;
i= j%No_Of_Mps_Val;
fclk = Mps_Val[i][0];
// printf("[%d] ", j);
Uart_TxEmpty();
if(prev_fclk==(Mps_Val[i][0]/(armdiv+1)))
{
armdiv=0;
prediv=1;
hdiv=1;
pval=1;
}
else
{
if (Mps_Val[i][0] >= 800000000 && Mps_Val[i][0] < 1100000000) // 1:6:12
{
armdiv=8;
prediv=3;
hdiv=1;
pval=1;
}
else if (Mps_Val[i][0] >= 666000000 && Mps_Val[i][0] < 800000000) // 1:6:12
{
armdiv=8;
prediv=2;
hdiv=1;
pval=1;
}
else if (Mps_Val[i][0] >= 535000000 && Mps_Val[i][0] < 666000000) // 1:6:12
{
armdiv=8;
prediv=2;
hdiv=1;
pval=1;
}
else if (Mps_Val[i][0] >= 420000000 && Mps_Val[i][0] < 535000000) // 1:6:12
{
armdiv=0;
prediv=2;
hdiv=1;
pval=1;
}
else if (Mps_Val[i][0] >= 266000000 && Mps_Val[i][0] < 420000000) // 1:3:6
{
armdiv=0;
prediv=2;
hdiv=0;
pval=1;
}
else
{
armdiv=0;
prediv=2;
hdiv=1;
pval=1;
}
}
Led_Display(j%2);
Delay(10);
if(prev_fclk<(Mps_Val[i][0]/(armdiv+1)))
{
Led_Display(0x1);
SetCLKDIV( armdiv, prediv, hdiv, pval);
Led_Display(0x2);
SetMPLL(Mps_Val[i][1],Mps_Val[i][2],Mps_Val[i][3]);
}
else
{
Led_Display(0x2);
SetMPLL(Mps_Val[i][1],Mps_Val[i][2],Mps_Val[i][3]);
Led_Display(0x1);
SetCLKDIV( armdiv, prediv, hdiv, pval);
}
SystemCLK(0);
Led_Display(0x4);
ChangeSDRAMParameter(HCLK);
Led_Display(0x8);
Console();
printf("[%d]ARMCLK=%d,HCLK=%d [Mps_Val=%xh,%xh,%xh]\n", j, ARMCLK,HCLK,Mps_Val[i][1],Mps_Val[i][2],Mps_Val[i][3]);
prev_fclk = ARMCLK;
j++;
}
printf("\nMPLL change test OK.\n");
printf("\nReturn to Previous setting.\n");
rMPLLCON = mpllcon_bk;
rCLKDIV0 = clkdivn_bk;
SystemCLK(1);
Console();
}
void Test_PllOnOff(void)
{
int i,j;
unsigned int saveREFRESH, saveCLKSRC, saveCLKDIV0;
printf("[PLL On/Off test, 10000 times]\n");
Uart_TxEmpty(); //To avoid being crushed the character
saveCLKSRC = rCLKSRC;
saveCLKDIV0 = rCLKDIV0;
rLOCKCON0=0xe10; // 0xe10 is 300us at 12Mhz
rLOCKCON1=0x710; // 0x710 is 150us at 12Mhz
rCLKSRC|=(1<<6); // EPLL Output
SetEPLL( 40, 1, 1);
rEPLLCON&=~(1<<24); // EPLL ON
for(j=0;j<10000;j++) {
Led_Display(0x2);
rCLKSRC=rCLKSRC & ~((1<<4)|(1<<3));
rCLKDIV0&=~((0xf<<9)|(0x3<<4)|(1<<2)|(0x3<<0)); // FCLK=reference clock, ARMCLK:HCLK:PCLK=1:1:1
rMPLLCON|=(1<<24); // MPLL off
rEPLLCON|=(1<<24); // EPLL Off
// Re-setting the refresh count for 12MHz HCLK.
saveREFRESH=rREFRESH;
rREFRESH=(U32)(2048+1-12*7.8);
Delay(100); //
rMPLLCON&=~(1<<24); // MPLL on
rEPLLCON&=~(1<<24); // EPLL ON
Led_Display(0x8);
rCLKDIV0 = saveCLKDIV0;
rCLKSRC = saveCLKSRC;
rREFRESH=saveREFRESH;
Delay(1000); //
}
rCLKDIV0 = saveCLKDIV0;
rCLKSRC = saveCLKSRC;
rREFRESH=saveREFRESH;
}
void Change_Voltage(void)
{
int voltage;
printf("Select core voltage? [0.8V -> 1.75V] : ");
printf("ARM core voltage? [ex)1.35V -> 135] : ");
voltage = GetIntNum();
if (voltage > 180)
{
printf("ARM core voltage limit is 1.5V, then set 1.5V\n");
voltage = 150;
}
Max1718_Set(1, voltage); // pwr=1:ARM, pwr=0:INT
Delay(10);
}
int Burden_Test(void)
{
int i,j,k,l,m,err=0, size, count;
int *pt_nor1, *pt_nor2;
printf("SDRAM Write Test\n");
size = 0x400000;//16MB
count = 0x10000;
pt_nor1=(int *)0x30200000;//CNB(WT Cache, on buffer)
pt_nor2=(int *)0x31200000;//NCNB(Off cache, off buffer)
for(i=0;i<size;i++)
{
*pt_nor1++=(U32)i;
if((i%(count*10))==0)
Dhry_run();
*pt_nor2++=(U32)i;
if((i%(count*10))==0)
Dhry_run();
if((i%(count*10))==0)
Dhry_run();
if((i%(count*10))==0)
Dhry_run();
if((i%count)==0)
printf(".");
if(Uart_GetKey())
return 0;
}
printf("\nWriting is completed.\n");
pt_nor1=(int *)0x30200000;
pt_nor2=(int *)0x31200000;
for(i=0;i<size;i++)
{
j=*pt_nor1++;
if((i%(count*10))==0)
Dhry_run();
k=*pt_nor2++;
if((i%(count*10))==0)
Dhry_run();
if((i%(count*10))==0)
Dhry_run();
if((i%(count*10))==0)
Dhry_run();
if(j!=(U32)i)
{
printf("%x=%x,%x\n",(U32)pt_nor1,j,i);
err++;
}
if(k!=(U32)i)
{
printf("%x=%x,%x\n",(U32)pt_nor2,k,i);
err++;
}
if((i%count)==0)printf(".");
if(Uart_GetKey())
return 0;
}
if(err==0)
printf("\nMemory read test:O.K.\n");
else
{
printf("\nMemory read test:FAIL!!!\n");
Led_Display(0xf);
while(1);
}
return 1;
}
void __irq Burden_Done(void);
volatile unsigned int var0=0;
void Timer_Burden(void)
{
unsigned int Cnt;
var0 = 0;
printf("\n timer setting\n");
rINTMSK = ~(BIT_TIMER0);
pISR_TIMER0 = (int)Burden_Done;
rTCFG0 = 0xff; //Dead zone=0,Prescaler0=256(0xff)
rTCFG1 = 0x3; //All interrupt,Mux0=1/16
Cnt = PCLK/256/16;
rTCNTB0 = (25 * Cnt) / 1000; //(1/(50MHz/16/16)) * 0x3333 (13107) = 0.334s ( 1.124Hz)
rTCMPB0 = (25 * Cnt) / 2000;
rTCON = 0xa; //Auto reload, Inverter off, Manual update, Dead zone disable, Stop
rTCON = rTCON & ~(0xffffff) | 0x9;
}
void __irq Burden_Done(void)
{
rSRCPND = BIT_TIMER0; //Clear pending bit
rINTPND = BIT_TIMER0;
rINTPND; //Prevent an double interrupt pending
Led_Display(var0%16);
// printf("^");
var0++;
}
void System_Burden_Test(void)
{
int i;
rGPHCON=rGPHCON&~(0xf<<26)|(0xa<<26);
rMISCCR=rMISCCR&~(0x7<<4)|(0x4<<4);
Timer_Burden();
while(Burden_Test());
rTCON = 0x0;
rINTMSK |= BIT_TIMER0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -