www.pudn.com > ADS_s3c2440a.rar > dvstest.c


//=================================================================== 
// File Name : Dvstest.c 
// Function  : S3C2440A  
// Date      : Feb 02, 2004 
// Version   : 0.0 
// History 
//  0.00: Feb.xx.2004:DonGo: first draft version for DVS. 
//=================================================================== 
 
#include  
#include  
#include  
#include "def.h" 
#include "option.h" 
#include "2440addr.h" 
#include "2440lib.h" 
#include "userlib.h" 
 
#include "lcdlib.h" 
#include "glib.h" 
#include "lcd.h" 
 
#include "dvstest.h" 
 
 
 
#define BIT_DVS_ON	(1<<12) 
#define DVS_VOLTL	100 
#define DVS_VOLTH	120 
// regulator voltage out settling time = 28us/0.1V. 
// 0.2V:56us, 0.3V:84us, 0.4V:112us, 0.5V:140us 
// 0.25V:70us, 0.35V:98us, 0.45V:126us, 0.55V:154us. 
 
extern U32 FCLK1; 
extern void CLKDIV124(void); 
extern void CLKDIV144(void); 
 
 
U32 Vcount=0, Timer_cnt0=0; 
short int Idle_flag=0;	// assume,  0:Normal, 1:Idle. 
short int Div_flag=124; 
short int intr_flag=0; 
 
// one-timer clock= 81 usec.  
U32 timer_val_arr[4] = {296, 617, 802, 1284}; 
//U32 timer_val_arr[4] = {1284, 1284, 1284, 1284}; 
// 296, 617, 802, 1284 -> 24ms, 50ms, 65ms, 104ms for each. 
 
short int timer_select=0; 
 
#define	XADDR	_NONCACHE_STARTADDRESS 
#define	IDLE_EN		0	// enable idle at timer interrupt. 
 
extern U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt; 
 
void Dvs_Test(void) 
{ 
	volatile int i, n; 
 
	Uart_Printf("Dvs test.\n"); 
 
	rGPGCON = (rGPGCON & ~(3<<22)) | (1<<22);	// set GPG11 output for idle state. 
	 
	rBANKSIZE = (rBANKSIZE & ~(3<<4)) | (0<<4) | (1<<7);	//SCKE_EN, SCLK_EN = disable. 
 
	Uart_Printf("Change core speed to 266MHz.\n"); 
	#if FIN==12000000 
	ChangeClockDivider(13, 12);	// 1:3:6 
		#if CPU2440A==1 
		ChangeMPllValue(127,2,1);	// 406MHz 
		#else						// 2440X 
		ChangeMPllValue(127,2,0);	// 406MHz 
		#endif 
	#else	// 16.9344Mhz 
		ChangeClockDivider(13, 12); 
		#if CPU2440A==1 
		ChangeMPllValue(110,3,1);	// 400MHz 
		#else						// 2440X 
		ChangeMPllValue(110,3,0);	// 400MHz 
		#endif 
	#endif 
	 
	Calc_Clock(1); 
	 
	UPDATE_REFRESH(Hclk); 
	Uart_Init(Pclk, 115200); 
 
	Uart_Printf("Check Clkout0:FCLK, Clkout1:HCLK.\n"); 
	// Clkout0: FCLK.	 
	Clk0_Enable(2); 
	// Clkout1: HCLK. 
	Clk1_Enable(3); 
	 
	 
#if ADS10==TRUE	 
	srand(0); 
#endif 
	Led_Display(0);	// clear all leds. 
	 
	Timer_Setting(); 
	Set_Lcd_Tft_16Bit_240320_Dvs(); 
 
	Uart_Printf("Tcnt, Vcnt, Idle_flag.\n"); 
	Uart_Printf("%8d,%8d,%1d\n", Timer_cnt0, Vcount, Idle_flag); 
	 
	while(1) { 
		//Uart_Printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); 
		Uart_Printf("%8d,%8d,%1d\n", Timer_cnt0, Vcount, Idle_flag); 
		for(i=0; i<1024*32; i+=4) { 
			//*(U32 *)(XADDR+i) = i; 
			//*(U32 *)(XADDR+i); 
		} 
		if(Uart_GetKey()==ESC_KEY) break; 
	} 
 
	rINTMSK = BIT_ALLMSK; 
} 
 
 
////////////////////////////// HCLK change test start  /////////////////////////////// 
 
//======================================================== 
// Timer Interrupt Request  
//======================================================== 
void __irq Timer0_intr(void) 
{ 
	int i; 
	 
	//if(Timer_cnt0%2) Led_Onoff(LED1,ON); 
	//else Led_Onoff(LED1,OFF); 
 
	ClearPending(BIT_TIMER0) 
 
	if(rLCDSRCPND & 2) { 
		rLCDSRCPND=2; // Clear LCD SUB Interrupt source pending 
		rLCDINTPND=2; // Clear LCD SUB Interrupt pending 
		ClearPending(BIT_LCD); 
	} 
 
#if ADS10==TRUE 
	i= (rand()%700) + 61;	// 0.081ms/cnt 
#else 
	i= 370;	// 0.081ms/cnt -> 370cnt==300ms. 
#endif 
	 
	rTCNTB0 = i; 
	//rTCNTB0 = timer_val_arr[Timer_cnt0%4]; 
 
	// Load timer cnt value 
	rTCON = 1<<3| 1<<1; 
	// Timer start. 
	rTCON = 1<<3| 1<<0; 
 
	if(Timer_cnt0%2) { 
		Idle_flag = 1;	// Idle mode 
		rINTMSK &= ~(BIT_LCD);	// unmask. 
		#if IDLE_EN==1 
			Led_Onoff(LED4, OFF); 
			rCLKCON |= 1<<2;	// Enter Idle mode. 
		    for(i=0;i<10;i++); 
			//wait until S3C2400X enters IDLE mode. 
	        //wait EINT0 interrupt or RTC alarm interrupt 
	        rCLKCON&=~(1<<2); 
		Led_Onoff(LED4, ON); 
    		//turn-off IDLE bit. IDLE bit should be turned off after wake-up. 
    	#endif 
	} else { 
		Idle_flag = 0;	// Normal mode 
		rINTMSK &= ~(BIT_LCD);	// unmask. 
	} 
 
	Timer_cnt0++; 
} 
 
 
void __irq Lcd_Int_Frame_ForDvs(void) 
{ 
	int i; 
	 
	rINTMSK |= (BIT_LCD); 
	 
	if((rLCDCON5 & (0x3<<15)))  
	{	// if Not VSYNC period 
 
		Uart_Printf("-"); 
	}  
	else  
	{		// if in VSYNC period 
		if( Idle_flag==1)  
		{	// Idle -> Clkdiv=1:4:4 
			rLCDCON1 &= ~(0x1);	// ENVID off. 
 
			#if CPU2440A==1 
			rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);	// 1:3:6 -> 1:6:12 
			rCLKDIVN &= ~(1<<0);						// 1:6:12 -> 1:6:6 
			#else  
			CLKDIV144(); 
			#endif 
			#if CPU2440A==1 
			rCAMDIVN |= BIT_DVS_ON;		// (1<<12), DVS off. 
			rGPGDAT &= ~(1<<11); 
			#endif 
			Max1718_Set(DVS_VOLTL); 
			UPDATE_REFRESH(Hclk/2); 
			rLCDCON1 = (rLCDCON1 & ~(0x3ff<<8)) | (4<<8) | 1;	// ENVID on. 5MHz VCLK, 60fps 
 
			Vcount++; 
    
			rLCDSRCPND=2; // Clear LCD SUB Interrupt source pending 
			rLCDINTPND=2; // Clear LCD SUB Interrupt pending 
			ClearPending(BIT_LCD); 
 
			if(rSRCPND & BIT_TIMER0) { 
				rSRCPND = BIT_TIMER0;	   //Clear pending bit 
				rINTPND = BIT_TIMER0; 
			} 
 
			#if IDLE_EN==1 
			rCLKCON |= 1<<2;	// Enter Idle mode. 
			for(i=0;i<10;i++); 
			//wait until S3C2400 enters IDLE mode.	 
			//wait EINT0 interrupt or RTC alarm interrupt 
			rCLKCON&=~(1<<2); 
			//turn-off IDLE bit. IDLE bit should be turned off after wake-up. 
	    		#endif 
		}  
		else 	// If Normal mode... 
		{	 
			rLCDCON1 &= ~(0x1);	// ENVID off. 
 
			Max1718_Set(DVS_VOLTH); 
			for(i=0; i<2000;i++) rGSTATUS0; 
 
			UPDATE_REFRESH(Hclk); 
 
			#if CPU2440A==1 
			rCAMDIVN &= ~BIT_DVS_ON;	// (0<<12), DVS off, FCLK=MPLLout 
			rGPGDAT |= (1<<11); 
			#endif 
 
			#if CPU2440A==1 
			rCLKDIVN |= (1<<0);						// 1:6:6 -> 1:6:12 
			rCAMDIVN = (rCAMDIVN & ~(3<<8));			// 1:6:12 -> 1:3:6 
			#else 
			CLKDIV124();	// Normal -> Clkdiv=1:2:4 
			#endif 
			rLCDCON1 = (rLCDCON1 & ~(0x3ff<<8)) | (9<<8) | 1;	// ENVID on.5MHz VCLK, 60fps 
 
			Vcount++; 
    
			rLCDSRCPND=2; // Clear LCD SUB Interrupt source pending 
			rLCDINTPND=2; // Clear LCD SUB Interrupt pending 
			ClearPending(BIT_LCD); 
 
			if(rSRCPND & BIT_TIMER0) { 
				rSRCPND = BIT_TIMER0;	   //Clear pending bit 
				rINTPND = BIT_TIMER0; 
			} 
		} 
	} // endof if((rLCDCON5 & (0x3<<15))) { 
} 
////////////////////////////// HCLK change test end  /////////////////////////////// 
 
void Set_Lcd_Tft_16Bit_240320_Dvs(void) 
{ 
    int i,j,k; 
	 
	Uart_Printf("[Set LCD]\n"); 
	 
    Lcd_Port_Init(); 
    Lcd_Init(MODE_TFT_16BIT_240320); 
    Glib_Init(MODE_TFT_16BIT_240320); 
	Lcd_Lcc3600Enable(); // Enable LCC3600 
    Lcd_PowerEnable(0, 1); 
    Lcd_EnvidOnOff(1); 
     
    Glib_ClearScr(0, MODE_TFT_16BIT_240320); 
    Glib_FilledRectangle(0,0,119,159,0xf800); 
    Glib_FilledRectangle(120,0,239,159,0x07e0); 
    Glib_FilledRectangle(0,160,119,320,0x001f); 
    Glib_FilledRectangle(120,160,239,320,0xffff); 
    Glib_FilledRectangle(100,100,150,200,0x5555); 
 
    rLCDCON1 &= ~(0x1);	// ENVID off. 
	rLCDCON1 = (rLCDCON1 & ~(0x3ff<<8)) | (9<<8) | 1;	// ENVID on. 5MHz 60fps 
 
	// ON PWREN signal 
	rLCDCON5 = (rLCDCON5 & ~(1<<3)) ;	// PWREN disable 
	rGPGCON = (rGPGCON & ~(0x3<<8)) | 0x1<<8;	// GPG4, PWR_EN -> Output. 
	rGPGDAT&=(~(1<<4)); // GPG4=Low 
	Delay(50); // GPG4=Low 
	rGPGDAT|=(1<<4); //GPG4=High 
 
	//--------LCD frame interrupt setting ------------------------------------START 
	pISR_LCD=(unsigned)Lcd_Int_Frame_ForDvs; 
	rINTMSK &= ~(BIT_LCD); 
	rLCDINTMSK=(1<<2)|(0<<1)|(1); // 8Words Trigger Level,Unmask Frame int,mask Fifo int 
	//--------LCD frame interrupt setting ------------------------------------END 
 
} 
 
 
void Led_Onoff(int Led_No, int On_Off) 
{ 
	// GPF7  GPF6   GPF5   GPF4 
	//nLED_8 nLED4 nLED_2 nLED_1 
	if(On_Off==ON) rGPFDAT = (rGPFDAT & ~Led_No); 
	else rGPFDAT = (rGPFDAT | Led_No); 
} 
 
void Timer_Setting(void) 
{ 
	float cnt_val=0.0; 
 
    Uart_Printf("[ Timer 0 Interrupt setting]\n"); 
 
	// Uart_Printf("[Timer interval: %4.1f, %4.1f, %4.1f, %4.1f[ms].\n", \ 
	// timer_val_arr[0]*0.081, timer_val_arr[1]*0.081, timer_val_arr[2]*0.081, timer_val_arr[3]*0.081); 
	// 296, 617, 802, 1284 -> 24ms, 50ms, 65ms, 104ms for eac 
 
	rGPBCON = rGPBCON& ~(0x03) | 0x2; 
	rCLKCON |= 1<<8;	// PWM timer PCLK clock enable. 
 
    pISR_TIMER0 = (int)Timer0_intr; 
	// Timer interupt start. 
	rINTMSK &= ~BIT_TIMER0; 
	 
	rTCFG0 = 0xff;		// Prescaler0 = 0xff=256. 
	// Timer input clock freq = PCLK/(Prescaler0+1)/divider value. 
	// where, PCLK = 50.7MHz 
 
	rTCFG1 = 0<<20 | 3<<0;	// MUX0 = 1/16 
 
	// Timer input clock frequency = PCLK/(prescaler value+1)/(divider value) 
	// 1clock = 81us. 
    rTCNTB0 = timer_val_arr[0]; 
    rTCMPB0 = 0; 
 
	// Load timer cnt value 
	rTCON = 1<<3| 1<<1; 
 
	// Timer start. 
	rTCON = 1<<3| 1<<0; 
 
}