www.pudn.com > ARM9_PROGRAM.rar > pll.c


/***************************************** 
  NAME: pll.c 
  DESC: PLL & Maximum frequency test. 
  HISTORY: 
  03.21.2002:purnnamu: first release for S3C2410X 
  09.16.2002:SOP: Test_PLL() 
  09.24.2002:SOP: Test_PLL()  
 *****************************************/ 
#include  
#include  
 
#include "def.h" 
#include "option.h" 
#include "addr.h" 
#include "lib.h" 
#include "slib.h"  
#include "pll.h" 
 
#define FIN 	12000000 
 
 
void Test_PLL(void) 
{ 
    int temp; 
    int i,j, mdiv, pdiv, sdiv, sval, fclk;     
    U32 mps[][4]={ 
	101250000,127,2,2, //FCLK,MDIV,PDIV,SDIV    <-- SOP 09/24/2002 
	113000000,105,1,2,  
	118500000,150,2,2, 
	124000000,116,1,2, 
	135000000, 82,2,1, 
	147000000, 90,2,1, 
	152000000, 68,1,1, 
	158000000, 71,1,1, 
	170000000, 77,1,1, 
	180000000, 82,1,1, 
	186000000, 85,1,1, 
	192000000, 88,1,1, 
	202800000,161,3,1, 
	214500000,135,2,1, 
	220000000,102,1,1, 
	226000000,105,1,1, 
    237000000,150,2,1, 
    }; 
     
 
    Uart_Printf("[ PLL frequency change test ]\n"); 
    Uart_TxEmpty(0); 
 
    rLOCKTIME=((U32)(1807*0.8)<<12)|((U32)(1807*0.8)<<0);  
    	// 1807 is 150us at 12Mhz 
    srand(0); 
 
    for(j=0;j<30;j++)    //SOP 09/24/2002 
    { 
    	i=rand()/(float)RAND_MAX*(sizeof(mps)/16); 
    	Uart_Printf("FCLK=%d MDIV=%xh,PDIV=%xh,SDIV=%xh\n",mps[i][0],mps[i][1],mps[i][2],mps[i][3]); 
	    Uart_TxEmpty(0);    	 
 
        ChangeClockDivider(1,1);        // 1:2:4    <-- SOP 09/24/2002         
	    ChangeMPllValue(mps[i][1],mps[i][2],mps[i][3]); 
	    Uart_Init(mps[i][0]/4,115200); 
	    Uart_Printf("...I'm running in changed FCLK...\n\n"); 
    }   
     
    ChangeClockDivider(1,1);          // 1:2:4         
    ChangeMPllValue(0xa1,0x3,0x1);    // FCLK=202.8MHz     <--- SOP 09/24/2002 
    Uart_Init(0,115200);              // SOP 09/24/2002 
 } 
 
 
void ChangePLL(void) 
{ 
    int pdiv, mdiv, sdiv, sval, fclk; 
 
    Uart_Printf("[Running change test of M/P/S value]\n"); 
 
    Uart_Printf("Input M vlaue\n"); 
    mdiv=Uart_GetIntNum();         
    Uart_Printf("Input P vlaue\n"); 
    pdiv=Uart_GetIntNum();     
    Uart_Printf("Input S vlaue\n"); 
    sdiv=Uart_GetIntNum(); 
    sval=(int)pow(2,sdiv); 
    fclk=( (mdiv+8)*FIN )/( (pdiv+2)*sval ); 
 
    Uart_Printf("FCLK=%d,M=0x%x,P=0x%x,S=0x%x\n",fclk,mdiv,pdiv,sdiv); 
    Uart_Printf("Now change PLL value\n"); 
    Uart_TxEmpty(0); 
     
    ChangeMPllValue(mdiv,pdiv,sdiv); 
    Uart_Init((fclk/4),115200);         //Changed fclk ---> (fclk/4)   Sep. 16, 2002 SOP 
    Uart_Printf("...I'm running in changed FCLK...\nPress any key to return!\n"); 
 } 
 
 
void Test_PllOnOff(void) 
{ 
    int i,j; 
    unsigned int saveREFRESH; 
 
    Uart_Printf("[PLL On/Off test]\n"); 
    Uart_TxEmpty(0);	//To avoid being crushed the character 
 
    rLOCKTIME=((U32)(1807*0.8)<<12)|((U32)(1807*0.8)<<0);  
    	// 1807 is 150us at 12Mhz 
    for(j=0;j<1000;j++) 
    { 
	rCLKSLOW=0|(1<<4)|(1<<5)|(1<<7); //FCLK=FIN/1,SLOW mode,MPLL=off,UPLL=on 
 
    	saveREFRESH=rREFRESH; 
    	rREFRESH=(1<<23)|(U32)(2048+1-12*15.6); //Trp=2clk,Trc=4clk 
            //The other memory control register should be optimized for SLOW mode. 
	 
        rCLKSLOW=0|(1<<4)|(0<<5)|(1<<7);//PLL on,MPLL=on,UPLL=on 
    	for(i=0;i<2048/4;i++); //S/W MPLL lock-time 
    	rCLKSLOW=0|(0<<4)|(0<<5)|(1<<7);//NORMAL mode,PLL on,MPLL=on,UPLL=on 
     
    	rREFRESH=saveREFRESH; 
    	Uart_Printf("."); 
	Uart_TxEmpty(0);	//To avoid being crushed the character    	 
    } 
}