⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 2 页
字号:
//====================================================================
// 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 + -