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

📄 pll_test.c

📁 Samsung S3C2443 Test program source code
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -