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

📄 idle.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
字号:
/*****************************************
  NAME: idle.c
  DESC: IDLE mode test
  HISTORY:
  03.23.2002:purnnamu: first release for 2410
  06.02.2003:DonGo: Modified for 2442
  10.31.2007: SKY
  	- Modified for 2450	
 *****************************************/

#include "System.h" 
#include "idle.h"


#define TESTYEAR 	(0x00)
#define TESTMONTH 	(0x12)
#define TESTDATE        (0x31)
#define TESTDAY         (0x06)  // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7   
#define TESTHOUR	(0x23)
#define TESTMIN		(0x59)
#define TESTSEC		(0x59)

#define TESTYEAR2	(0x01)
#define TESTMONTH2 	(0x01)
#define TESTDATE2	(0x01)
#define TESTDAY2	(0x07)  // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7   
#define TESTHOUR2	(0x00)
#define TESTMIN2	(0x00)
#define TESTSEC2	(0x00)


void SetAlarmWakeUp(void)
{
	rRTCCON = 0x1;	// R/W enable, 1/32768, Normal(merge), No reset
	rRTCCON|= (0x1<<3);	
	rRTCCON&= ~(0x1<<3);	
	rRTCCON|= (0x1<<1);		

	rBCDYEAR = TESTYEAR;
	rBCDMON  = TESTMONTH;
	rBCDDAY  = TESTDAY;	// SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
	rBCDDATE = TESTDATE;
	rBCDHOUR = TESTHOUR;
	rBCDMIN  = TESTMIN;
	rBCDSEC  = TESTSEC;
	
	rALMYEAR=TESTYEAR2 ;
	rALMMON =TESTMONTH2;
	rALMDATE=TESTDATE2  ;
	rALMHOUR=TESTHOUR2 ;
	rALMMIN =TESTMIN2  ;
	rALMSEC =TESTSEC2+0x03;

	rRTCALM=0x7f;

	rRTCCON=0x0;   // R/W disable, 1/32768, Normal(merge), No reset
}

void RTC_TimeTickSet(void)
{
	printf("RTC Tick set\n");

	rRTCCON = 0x1;	// R/W enable, 1/32768, Normal(merge), No reset
	rRTCCON = (rRTCCON & ~(0x7<<5)) | (1<<5);
	rRTCCON&=~(0x1<<0);   // R/W disable, 1/32768, Normal(merge), No reset
	
	rTICNT0=0x7f; // upper count
	rTICNT1=0xff; // Lower count
	rTICNT0 |= (1<<7);	// Tick Time Interrupt Enable
	
}


static void __irq Eint0Int(void)
 {
 	printf("INTPND:%x, SRCPND:%x \n", rINTPND, rSRCPND);
	rEINTMASK |= (1<<0);	
	rEINTPEND |= (1<<0);
	ClearPending(BIT_EINT0);
	printf("EINT0 interrupt is occurred for IDLE wake-up.\n");
}

#if 0
static void __irq Eint11Int(void)
 {
 	printf("INTPND:%x, SRCPND:%x \n", rINTPND, rSRCPND);
	rEINTMASK |= (1<<11);
	rEINTPEND |= (1<<11);
	ClearPending(BIT_EINT8_23);
	printf("EINT11 interrupt is occurred for Sleep wake-up.\n");
}
#endif

static void __irq AlarmInt(void)
{
	printf("INTPND:%x, SRCPND:%x \n", rINTPND, rSRCPND);
	rINTMSK |= BIT_RTC;	
	ClearPending(BIT_RTC);	
	printf("ALARM interrupt is occurred for IDLE wake-up.\n");
	//rRTCCON = 0x0;	// R/W disable, but interrupt will be generated.
}

static void __irq TickInt(void)
{
	printf("INTPND:%x, SRCPND:%x \n", rINTPND, rSRCPND);
	rINTMSK |= BIT_TICK;	
	ClearPending(BIT_TICK);
	printf("Tick interrupt is occurred for IDLE wake-up.\n");
	rTICNT0 &=~(0x1<<7);	// Tick Time Interrupt disable	
}

static void __irq BattFaultInt(void)
{
	printf("INTPND:%x, SRCPND:%x \n", rINTPND, rSRCPND);
	rINTMSK|= (BIT_BAT_FLT);	// mask.
	ClearPending(BIT_BAT_FLT)
	printf("BATT_FLT interrupt is occurred for IDLE wake-up.\n");

}

#if 0
static volatile int t0cnt,t1cnt;
static void __irq Timer0Int(void)
//Timer0 interrupt will be used to test the IDLE mode hard	
{
    ClearPending(BIT_TIMER0);
 	printf("0");   
    //t0cnt++;
}

static void __irq Timer1Int(void)
//Timer1 interrupt will be used to test the IDLE mode hard	
{
    ClearPending(BIT_TIMER1);
    printf("1");
    //t1cnt++;
}

static void __irq Timer2Int(void)
//Timer1 interrupt will be used to test the IDLE mode hard	
{
    ClearPending(BIT_TIMER2);
    printf("2");
}
static void __irq Timer3Int(void)
//Timer1 interrupt will be used to test the IDLE mode hard	
{
    ClearPending(BIT_TIMER3);
    printf("3");
    
}
static void __irq Timer4Int(void)
//Timer1 interrupt will be used to test the IDLE mode hard	
{
    ClearPending(BIT_TIMER4);
    printf("4");
    
}
#endif

/**********************
 *   IDLE mode test   *
 **********************/

void Test_IdleMode(void)
{
	int i;

	printf("[IDLE Mode Test]\n");
	printf("S3C2450 will wake up by EINT0 or EINT11 or BATT_FLT.\n");
	printf("If not, After 10 seconds,  S3C2450 will also wake up by RTC alarm interrupt.\n");

	rGPFCON = (rGPFCON & ~0x3)|(2<<0);			//GPF0 = EINT0
	rGPGCON = (rGPGCON & ~0xc0)|(2<<6);		//GPG3 = EINT11	
	rGPFUDP= (rGPFUDP & ~0x3);			//GPF0 up down disable
	rGPGUDP= (rGPGUDP & ~0xc0);		//GPG3 = EINT11	up down disable
	rEXTINT0 = (rEXTINT0 | (1<<3)); //EINT0 filter enable
	rEXTINT1 = (rEXTINT1 | (1<<15));//EINT11 filter enable
	rEXTINT0 = (rEXTINT0 & ~(7<<0))  | (0x2<<0) ; //EINT0=falling edge triggered
	rEXTINT1 = (rEXTINT1 & ~(7<<12)) | (0x2<<12); //EINT11=falling edge triggered

	pISR_EINT0=(U32)Eint0Int;
	//pISR_EINT8_23=(U32)Eint11Int;
	pISR_BAT_FLT = (U32)BattFaultInt;
	pISR_RTC=(U32)AlarmInt;	
	pISR_TICK= (U32)TickInt;	
	
	rEINTPEND = 0xffffff;
	rSRCPND = BIT_EINT0|BIT_EINT8_23|BIT_BAT_FLT|BIT_RTC|BIT_TICK; //to clear the previous pending states
	rINTPND = BIT_EINT0|BIT_EINT8_23|BIT_BAT_FLT|BIT_RTC|BIT_TICK;

	rHCLKCON = (rHCLKCON & ~(0xfffff)) | (1<<19) | (1<<18) | (1<<9);
	printf("\nHCLK Control = %x",rHCLKCON);
	rPCLKCON = (rPCLKCON & ~(0xffff)) | (1<<13) | (1<<12) | (1<<11) | (1<<10) | (1<<9) | (1<<7) | (0xf<<0);
	printf("\nPCLK Control = %x",rPCLKCON);
	rSCLKCON = (rSCLKCON & ~(0x1ffff)) | (1<<15) | (1<<10) | (1<<9) | (1<<8) | (0xf<<0);
	printf("\nSCLK Control = %x",rSCLKCON);

	rBANKCON1 |= (1<<4);
	printf("\nSDRAM Power Down\n");

	#if 1
 	printf("Alarm wake-up (y/n)? ");
	if(getchar()=='y')
	{
		printf("\nS3C2450 will wake up by RTC alarm(10 sec) \n");
		SetAlarmWakeUp();
	}

	printf("RTC tick interrupt (y/n)? ");
	if(getchar()=='y')
	{
		printf("\nS3C2450 will wake up by RTC tick(4 sec) \n");
		RTC_TimeTickSet();  // wake up will be occurred after 4sec!!!
	}
	#endif	

	Led_Display(0x5);	

	printf(" \n***Enter Idle mode ***\n");		
	//***Enter Idle mode *** : select MMU_IDLE or PWRMODECON//
	//rPWRCFG 	|=(1<<6);	//STADNBYWFI : 00:ignore, 01:idle, 10:stop, 11:sleep mode 
	//MMU_WaitForInterrupt();
	#if 1
	printf("WFI mode(y/n)? ");
	if(getchar()=='y')
	{
	rEINTMASK &= ~((1<<11)|(1<<0));
	rINTMSK &= ~(BIT_EINT0|BIT_EINT8_23|BIT_BAT_FLT|BIT_RTC|BIT_TICK);	
	rPWRCFG&=~(0x3<<0)|(0x1<<0);
	rPWRCFG|=(1<<17);
	rPWRCFG&=~(0x3<<5);	
	MMU_WaitForInterrupt();	
	}
	else
	#endif	
	{
	rEINTMASK &= ~((1<<11)|(1<<0));
	rINTMSK &= ~(BIT_EINT0|BIT_EINT8_23|BIT_BAT_FLT|BIT_RTC|BIT_TICK);
	
	rPWRCFG=rPWRCFG&~(0x3<<0)|(0x1<<0);
	rPWRMODE |=(1<<17);  //enter IDLE mode.
	}
	for(i=0;i<10;i++);   
        //wait until S3C2450X enters IDLE mode.	
 

	//***Exit Idle mode ***//
	rPWRMODE &=~(1<<17);      
	//turn-off IDLE bit. IDLE bit should be turned off after wake-up.
   	Led_Display(0xa);
	
	printf("Return to Normal Mode.\n");
	printf("wake-up= %08x\n", rWKUPSTAT);

	//Check wake-up source
	if( rWKUPSTAT & (1<<0) )		// EINT?
	{
		printf("\n__ Wake-up by EINT\n");
		rWKUPSTAT |= (1<<0);
	}
	else if( rWKUPSTAT & (1<<1) )	// RTC?
	{
		printf("\n__ Wake-up by RTC Alarm\n");
		rWKUPSTAT |= (1<<1);
	}
	else if( rWKUPSTAT & (1<<4) )	// RTC?
	{
		printf("\n__ Wake-up by RTC tick\n");
		rWKUPSTAT |= (1<<4);
	}
	else if( rWKUPSTAT & (1<<5) )	// BATFLT?
	{
		printf("\n__ Wake-up by nBATFLT\n");
		rWKUPSTAT |= (1<<5);
	}

	rEINTMASK=0xffffff;
	rINTMSK=BIT_ALLMSK;
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -