📄 clock.c
字号:
//====================================================================
// File Name :
// Function :
// Program :
// Date :
// Version :
// History
//====================================================================
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "2413addr.h"
#include "am29f800.h"
#include "Console.h"
#include "def.h"
#include "DRAM.h"
#include "Exception.h"
#include "MMUCache.h"
#include "option.h"
#include "PLL.h"
#include "rtc.h"
#include "strata32.h"
#include "clock.h"
#include "System.h"
#include "uart.h"
#include "time.h"
volatile U32 iSeed, iNum, iARMCLK_DIVN_R, iHCLK_DIVN_R, iPCLK_DIVN_R;
volatile U32 iMPLL, iMPLL_0;
volatile U32 iTick;
volatile U32 iFCLK;
volatile U32 iCompare_0 = 0, iCompare_1 = 0, iSum = 0;
volatile U32 iDivn[4][4][4] = 0 ;
volatile U32 iCompare_R[11] = { 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff };
volatile U32 iRoop = 0 , iRoop1 = 0, iRoop2 = 0, iRoop3 = 0, iRoop4=0, iRoop5=0, iRoop6=0, iRoop7 =0 ;
volatile U32 iPvalue, iMvalue, iSvalue;
volatile U32 iCompare_PMS[18] =
{
0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff, 0x3ffff
// 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0xf, 0xf, 0xf, 0xf
};
volatile U32 iRandom_PMS;
U32 save_rGPHCON, save_rGPHDAT, save_rGPHDN;
void Test_DIVN_Value_Cange(void);
void Select_Random_DIVN(void);
void Test_Random_DIVN(void);
void __irq Rtc_TICK_ISR(void);
void Test_Random_DIVN_Enable(void);
void Data_Compare_Init(void);
void Insert_Seed(void);
void Test_DIVN_Value_Cange(void);
void Compare_Logic_DIVN(void);
void Data_Compare_Init_266(void);
void Test_PMS_Value_Change(void);
void Select_PMS_Random(void);
void Apply_PMS(void);
void Compare_PMS_Logic(void);
void Select_Random_DIVN_PMS(void);
void Select_DIVN_Check(void);
void Test_DVS(void);
void Test_PMS_DIVN_Value_Change(void);
void Select_Random_DIVN_PMS_2(void);
void Apply_PMS_2(void);
void Uart_Init_FCLK(int baud);
void Return_Condition(void);
void Setting_PMS_266(void);
void Clock_Test(void);
void Setting_266Mhz(void);
void Setting_200Mhz(void);
void * clock_func[][2]=
{
(void *) Test_PMS_DIVN_Value_Change, "PMS_Divn Random Change ",
(void *) Test_DIVN_Value_Cange, "Divn Random Change ",
(void *) Test_PMS_Value_Change, "PMS Random Change ",
0,0
};
void Test_Clock(void)
{
int i=0;
printf("\n");
Setting_200Mhz();
while(1)
{
i=0;
printf("\n\n");
while(1)
{ //display menu
if((i+1)%2)printf("\n");
printf("%2d:%s",i,clock_func[i][1]);
i++;
if((int)(clock_func[i][0])==0)
{
printf("\n");
break;
}
printf("\n");
}
printf("\nPress Enter key to exit : ");
i = GetIntNum();
if(i==-1) break; // return.
if(i>=0 && (i<((sizeof(clock_func)-1)/8)) ) // select and execute...
( (void (*)(void)) (clock_func[i][0]) )();
}
Setting_266Mhz();
}
// ************************** PMS & DIVn Value Change Program ****************************
void Test_PMS_DIVN_Value_Change(void)
{
U32 iTest = 0;
Insert_Seed();
rLOCKTIME = 0xffff0fff;
printf("If You Start Test, Press Any Key!!!\n");
printf("Press 'x' : Stop Test\n\n");
getchar();
iMPLL = 200;
iMPLL_0 = 200;
while(!Uart_GetKey())
{
iTest = rand()%2 ;
iRoop7++;
if ( iTest == 0 ) // PLL Value Change
{
Select_PMS_Random();
Apply_PMS_2();
iFCLK = iMPLL * 1000000;
Uart_Init_FCLK(115200);
printf("%d th Test(PLL) End! \n", iRoop7);
Uart_TxEmpty(1);
}
else // DIVn Value Change
{
Select_Random_DIVN();
PreChangeSDRAMParameter();
SetCLKDIV( iARMCLK_DIVN_R, iHCLK_DIVN_R, iPCLK_DIVN_R);
SystemCLK();
ChangeSDRAMParameter(HCLK);
iFCLK = iMPLL * 1000000;
Uart_Init_FCLK(115200);
printf("%d th Test(DIVN) END! \n", iRoop7);
Uart_TxEmpty(1);
}
}
Return_Condition();
}
void Select_Random_DIVN_PMS_2(void)
{
U32 iARMCLK=0, iHCLK=0, iPCLK=0;
float fARMCLK=0 , fHCLK=0, fPCLK=0;
float fARMCLK_0=0 , fHCLK_0=0, fPCLK_0=0;
while(1)
{
iARMCLK_DIVN_R = ( rand()%2 );
iHCLK_DIVN_R = ( rand()%4 );
iPCLK_DIVN_R = ( rand()%2 );
fARMCLK = (float)(iMPLL / (iARMCLK_DIVN_R+1));
fHCLK = (float)(fARMCLK / (iHCLK_DIVN_R+1));
fPCLK = (float)(fHCLK / (iPCLK_DIVN_R+1));
if ( fARMCLK<=266 & fHCLK <= 133 & fPCLK <= 66.5 )
{
iRoop ++;
fARMCLK_0 = (float)(iMPLL_0 / (iARMCLK_DIVN_R+1));
fHCLK_0 = (float)(fARMCLK_0 / (iHCLK_DIVN_R+1));
fPCLK_0 = (float)(fHCLK_0 / (iPCLK_DIVN_R+1));
if ( fARMCLK_0 <=266 & fHCLK_0 <= 133 & fPCLK_0 <= 66.5 )
{
iFCLK = iMPLL_0 * 1000000;
Uart_Init_FCLK(115200);
printf( "\TEST_PLL iMPLL_0 = %d\n", iMPLL_0);
Uart_TxEmpty(1);
iMPLL_0 = iMPLL;
break;
}
}
}
}
void Apply_PMS_2(void)
{
Select_Random_DIVN_PMS_2();
PreChangeSDRAMParameter();
SetCLKDIV( iARMCLK_DIVN_R, iHCLK_DIVN_R, iPCLK_DIVN_R);
SetMPLL( iMvalue, iPvalue, iSvalue );
SystemCLK();
ChangeSDRAMParameter(HCLK);
iFCLK = iMPLL * 1000000;
Uart_Init_FCLK(115200);
printf( "\TEST_PLL iMPLL_1 = %d\n", iMPLL);
Uart_TxEmpty(1);
Delay(1000);
}
// ************************** PMS Value Change Program ***********************************
void Test_PMS_Value_Change(void)
{
Insert_Seed();
rLOCKTIME = 0xffff0fff;
printf("\n");
printf("If You Start Test, Press Any Key!!!\n");
printf("Press 'x' : Stop Test\n\n");
getchar();
while(!Uart_GetKey())
{
Select_PMS_Random();
Apply_PMS();
Compare_PMS_Logic();
}
Return_Condition();
}
void Compare_PMS_Logic(void)
{
if ( iRoop3 >= 2 )
{
iCompare_PMS[iCompare_0] = iCompare_PMS[iCompare_0] & (~(1<<iCompare_1)) ;
iSum = 0;
for ( iRoop1 = 0 ; iRoop1 < 18 ; iRoop1++ )
{
iSum = iSum + iCompare_PMS[iRoop1];
}
if ( iSum == 0 )
{
printf(" \nTest End!!! -> %d Rotation Testing\n " , iRoop3 );
printf(" \nTest End!!! -> %d th Test \n " , iRoop6 );
iRoop6++;
for ( iRoop4 = 0 ; iRoop4 < 18 ; iRoop4++ )
{
iCompare_PMS[iRoop4] = 0x3ffff;
}
if ( iRoop6 == 4 )
{
printf( " 3th Test END !! \n");
getchar();
}
}
iCompare_0 = iCompare_1;
}
else
{
iCompare_0 = iCompare_1;
}
}
void Apply_PMS(void)
{
Select_Random_DIVN_PMS();
PreChangeSDRAMParameter();
SetCLKDIV( iARMCLK_DIVN_R, iHCLK_DIVN_R, iPCLK_DIVN_R);
SetMPLL( iMvalue, iPvalue, iSvalue );
SystemCLK();
ChangeSDRAMParameter(HCLK);
Uart_Init_FCLK(115200);
printf("New PLL Frequency = %dMhz\n", iMPLL);
printf("\n", iMPLL);
Uart_TxEmpty(1);
Delay(1000);
}
void Insert_Seed(void)
{
iSeed = (rBCDDAY*24*60*60)+(rBCDHOUR*60*60)+(rBCDMIN*60)+rBCDSEC;
srand(iSeed);
}
void Select_Random_DIVN_PMS(void)
{
U32 iARMCLK=0, iHCLK=0, iPCLK=0;
float fARMCLK=0 , fHCLK=0, fPCLK=0;
float fARMCLK_0=0 , fHCLK_0=0, fPCLK_0=0;
while(1)
{
iARMCLK_DIVN_R = ( rand()%2 );
iHCLK_DIVN_R = ( rand()%4 );
iPCLK_DIVN_R = ( rand()%2 );
fARMCLK = (float)(iMPLL / (iARMCLK_DIVN_R+1));
fHCLK = (float)(fARMCLK / (iHCLK_DIVN_R+1));
fPCLK = (float)(fHCLK / (iPCLK_DIVN_R+1));
if ( fARMCLK<=266 & fHCLK <= 133 & fPCLK <= 66.5 )
{
iRoop ++;
if ( iRoop3 >= 2 )
{
fARMCLK_0 = (float)(iMPLL_0 / (iARMCLK_DIVN_R+1));
fHCLK_0 = (float)(fARMCLK_0 / (iHCLK_DIVN_R+1));
fPCLK_0 = (float)(fHCLK_0 / (iPCLK_DIVN_R+1));
if ( fARMCLK_0 <=266 & fHCLK_0 <= 133 & fPCLK_0 <= 66.5 )
{
iFCLK = iMPLL*1000000;
printf("Previous PLL Freauency = %dMhz\n", iMPLL_0);
Uart_TxEmpty(1);
iMPLL_0 = iMPLL;
break;
}
}
else
{
iMPLL_0 = iMPLL;
iFCLK = iMPLL*1000000;
break;
// First Start Condtion Must be 200Mhz. 200Mhz have many PMS Value.
}
}
}
}
void __irq Rtc_TICK_ISR(void)
{
ClearPending(BIT_TICK);
iTick=TRUE;
}
void Select_PMS_Random(void)
{
iRandom_PMS = rand()%18;
iRoop3++;
switch ( iRandom_PMS )
{
case 0:
iPvalue = 1;
iMvalue = 42;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 200;
break;
case 1:
iPvalue = 2;
iMvalue = 62;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 210;
break;
case 2:
iPvalue = 1;
iMvalue = 47;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 220;
break;
case 3:
iPvalue = 4;
iMvalue = 107;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 230;
break;
case 4:
iPvalue = 2;
iMvalue = 72;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 240;
break;
case 5:
iPvalue = 4;
iMvalue = 117;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 250;
break;
case 6:
iPvalue = 1;
iMvalue = 57;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 260;
break;
case 7:
iPvalue = 4;
iMvalue = 125;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 266;
break;
case 8:
iPvalue = 1;
iMvalue = 62;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 280;
break;
case 9:
iPvalue = 2;
iMvalue = 88;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 288;
break;
case 10:
iPvalue = 1;
iMvalue = 67;
iSvalue = 1;
iCompare_1 = iRandom_PMS;
iMPLL = 300;
break;
case 11:
iPvalue = 4;
iMvalue = 72;
iSvalue = 0;
iCompare_1 = iRandom_PMS;
iMPLL = 320;
break;
case 12:
iPvalue = 2;
iMvalue = 48;
iSvalue = 0;
iCompare_1 = iRandom_PMS;
iMPLL = 336;
break;
case 13:
// iPvalue = 3;
// iMvalue = 63;
// iSvalue = 0;
// iCompare_1 = iRandom_PMS;
// iMPLL = 340.8;
iPvalue = 4;
iMvalue = 77;
iSvalue = 0;
iCompare_1 = iRandom_PMS;
iMPLL = 340;
break;
case 14:
iPvalue = 2;
iMvalue = 52;
iSvalue = 0;
iCompare_1 = iRandom_PMS;
iMPLL = 360;
break;
case 15:
iPvalue = 4;
iMvalue = 87;
iSvalue = 0;
iCompare_1 = iRandom_PMS;
iMPLL = 380;
break;
case 16:
iPvalue = 2;
iMvalue = 56;
iSvalue = 0;
iCompare_1 = iRandom_PMS;
iMPLL = 384;
break;
case 17:
iPvalue = 4;
iMvalue = 92;
iSvalue = 0;
iCompare_1 = iRandom_PMS;
iMPLL = 400;
break;
default :
break;
}
}
// ************************** DIVN Change Program ***********************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -