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

📄 pll_test.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*======================================================================

 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 + -