📄 idle.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 + -