📄 sleep.c
字号:
/***************************************************************
NAME: sleep.c
DESC: Sleep mode test
HISTORY:
08.24.2002:purnnamu
LCDVFn is connected the analog circuit in LCD.
So, this signal should be output L.
05.xx.2003:DonGo modifid for 2442X, Power-off -> Sleep. naming change.
12.04.2006:grmoon
- S3C2443 GPIO configuration setup
10.31.2007: SKY
- Modified for 2450
****************************************************************/
#include "System.h"
#include "sleep.h"
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 Sleep 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 Sleep 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 Sleep 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 Sleep wake-up.\n");
}
//================================================================================
void Test_SleepMode(void)
{
//U32 portStatus1[32]; // A ~ H, 8*4=32
//U32 portStatus2[16]; // J ~ M, 4*4=16
printf("[SLEEP Mode Test]\n");
printf("S3C2450 will wake up by EINT0 (Falling Edge Triggered).\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;
#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
rINFORM1+=1;
/*
rINFORM2=0x77777777;
rINFORM3=0x99999999;
rGSTATUS3 = 0x55555555;
rGSTATUS4 = 0xaaaaaaaa;
*/
#if 0 // sdram test
// if(rINFORM1!=0x0)
if(1)
{
a=0x30000000;
for(i=0x31000000;i<(0x31000000+0x3f0000);i+=4)
{
//if(*((unsigned int *)i)!=(0xaaaa5555))
if(*((unsigned int *)i)!=*((unsigned int *)a))
{
printf("Mem Error:%x=%x(%x)\n",i,*((unsigned int *)i),i^0x5555aaaa);
error++;
}
if(error>20)
break;
a+=4;
}
if(error)
printf("SDRAM self-refresh test:FAILED\n");
else
printf("SDRAM self-refresh test:O.K.\n");
}
a=0x30000000;
for(i=0x31000000;i<(0x31000000+0x3f0000);i+=4)
{
*((unsigned int *)i)=*((unsigned int *)a);
//*((unsigned int *)i)=0xaaaa5555;
a+=4;
}
printf("write done\n");
Uart_TxEmpty();
#endif
//ConfigSleepGPIO();
//printf("GPFCON=%08x, GPFUDP=%08x, , GPFDAT=%08x \n",rGPFCON, rGPFUDP, rGPFDAT);
//printf("VIDCON0=%08x, LCDCON1=%08x \n",rVIDCON0, rLCDCON1);
rADCCON|=(1<<2);
/* Pin Configuration in Sleep Mode */
rMISCCR|=(1<<12); //USB port0 = suspend
//Lcd_EnvidOnOff(0); // jcs 060610 //LCD must be off before entering Sleep mode.
//set flag sleep wakeup : rINFORM0 = 0x2BED
rINFORM0 = 0x2BED;
//Delay(20000);
// Entering the SLEEP mode
//*************************//
printf("\nNow, I am entering Sleep mode.\n");
printf("Sleep count: %x\n", rINFORM1);
rRSTCON=0x1ff80;
rOSCSET=0xffff;
#if 1
printf("WFI mode(y/n)? ");
if(getchar()=='y')
{
Uart_TxEmpty(); //Wait until UART0 Tx buffer empty.
rEINTMASK &= ~((1<<11)|(1<<0));
rINTMSK &= ~(BIT_EINT0|BIT_EINT8_23|BIT_BAT_FLT|BIT_RTC|BIT_TICK);
rPWRCFG=(1<<15)|(0<<9)|(0<<8)|(0<<7)|(0<<4)|(0<<3)|(0<<2)|(1<<0);
rPWRCFG|=(1<<17);
rPWRCFG&=~(0x3<<5)|(0x03<<5);
MMU_WaitForInterrupt();
}
else
#endif
{
Uart_TxEmpty(); //Wait until UART0 Tx buffer empty.
rEINTMASK &= ~((1<<11)|(1<<0));
rINTMSK &= ~(BIT_EINT0|BIT_EINT8_23|BIT_BAT_FLT|BIT_RTC|BIT_TICK);
rPWRCFG=(1<<15)|(0<<9)|(1<<8)|(1<<7)|(0<<4)|(0<<3)|(0<<2)|(1<<0);
rPWRMODE=rPWRMODE&~(0xffff<<0)| (0x2BED<<0); // Go To BED
}
//*************************//
}
void Test_SoftMode(void)
{
printf("Software reset Test : 0x%x \n", rRSTSTAT);
//Check wake-DN reset
if( rRSTSTAT & (1<<0) ) // nRESET?
{
printf("\n__ Wake-UP by nRESET\n");
rRSTSTAT |= (1<<0);
}
else if( rRSTSTAT & (1<<2) ) // WDTRST?
{
printf("\n__ Wake-UP by WDTRST\n");
rRSTSTAT |= (1<<2);
}
else if( rRSTSTAT & (1<<3) ) // SLEEP?
{
printf("\n__ Wake-UP by SLEEP\n");
rRSTSTAT |= (1<<3);
}
else if( rRSTSTAT & (1<<4) ) // ESLEEP?
{
printf("\n__ Wake-UP by Deep stop\n");
rRSTSTAT |= (1<<4);
}
else if( rRSTSTAT & (1<<5) ) // SWRST?
{
printf("\n__ Wake-UP by SWRST\n");
rRSTSTAT |= (1<<5);
}
// rPWRCFG|=(1<<9); // nand reset disable
rSWRST = 0x533c2450;
}
int batt_flag=0;
//=========================================================================
static void __irq BattFault(void)
{
rINTMSK |= (BIT_BAT_FLT); // mask.
ClearPending(BIT_BAT_FLT)
printf("BATT_FLT interrupt occured\n");
batt_flag=1;
//Batt_Sleep();
}
//================================================================================
void Test_BattFaultInterrupt(void)
{
int i;
printf("Battery fault interrupt test.\n");
printf("Detect low-level.\n");
printf("0, 2 : Ignore.\n");
printf("1 : Generation interrupt.\n");
printf("3 : The system enters into the Sleep mode when nBatt_flt is asserted.\n");
printf("Select battery function : ");
i = GetIntNum() & 0x3;
rPWRCFG = rPWRCFG & ~(0x3<<0) |(i<<0);
printf("%d is selected\n", i);
pISR_BAT_FLT = (U32)BattFault;
rSRCPND = BIT_BAT_FLT;
rINTPND = BIT_BAT_FLT;
if(i==3)
{
printf("S3C2450 will wake up by EINT0 (Falling Edge Triggered).\n");
rGPFUDP &= ~(1<<1); // Pull up down disable
rGPFCON=rGPFCON & ~(3<<0)|(2<<0); //GPF0=EINT0
rEXTINT0=rEXTINT0&~(0x7<<0)|(0x2<<0); //EINT0=falling edge triggered
rPWRCFG|=(1<<15);
printf(" PWRCFG:0x%x\n", rPWRCFG);
}
rINTMSK = rINTMSK & ~(BIT_BAT_FLT); // unmask.
while(batt_flag==0)
{
if(Uart_GetKey()!=0) break;
}
batt_flag=0;
rPWRCFG = rPWRCFG & ~(0x3<<0);
//Batt_Sleep();
printf("exit.\n");
}
//===========================================================================
void Test_InitSDRAM(void)
//Initialize SDRAM for SDRAM self-refresh test.
{
int i;
printf("[SDRAM Initialization]\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -