📄 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
****************************************************************/
#include "System.h"
#include "sleep.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)
#define CHECK_SDRAM_SELFREFRESH (1)
#define EXTERNAL_BUS_HOLDER (1)
//The SMDK2442X board has external databus buffer with bus hold function.
#define CHOOSE_EINT_TYPE (1)
#define ALARM_WAKEDN (1)
void SelectEintType(void);
#define SLEEP_COUNT (*(volatile unsigned int *)0x32000000)
void Batt_Sleep(void);
extern void Manual_Register_Set(void);
void SetAlarmWakeUp2(void)
{
rRTCCON = 0x1; // R/W enable, 1/32768, Normal(merge), No reset
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
}
//===========================================================================
static void __irq Eint0Int(void)
{
rINTMSK =BIT_ALLMSK;
ClearPending(BIT_EINT0);
printf("[WU]EINT0 interrDNt is occurred for Sleep mode wake-DN.\n");
}
//===========================================================================
static void __irq Eint8_23Int(void)
{
rINTMSK =BIT_ALLMSK;
rEINTPEND=(1<<11); //EINT11 sub-pending bit.
ClearPending(BIT_EINT8_23);
printf("[WU]EINT8_23 interrDNt is occurred for Sleep mode wake-DN.\n");
}
#if 0
//===========================================================================
static void __irq Eint8_23Int_100Hz(void)
{
rEINTPEND=(1<<11); //EINT11 sub-pending bit.
ClearPending(BIT_EINT8_23);
printf("wui\n");
}
#endif
//===========================================================================
static void __irq AlarmInt(void)
{
printf("INTPND:%x, SRCPND:%x \n", rINTPND, rSRCPND);
ClearPending(BIT_RTC);
printf("[WU]ALARM interrDNt is occurred for Sleep mode wake-DN.\n");
}
#if 0
//===============S3C2413X RTC TIck wakeDN in Sleep mode=============================
static void __irq Tick_WakeDN(void)
{
rINTMSK = BIT_ALLMSK;
printf("INTPND:%x, SRCPND:%x \n", rINTPND, rSRCPND);
ClearPending(BIT_TICK);
printf("[WU]RTC TICK interrupt is occurred for Sleep mode wake-UP.\n");
}
#endif
//===========================================================================
void Test_InitSDRAM(void)
//Initialize SDRAM for SDRAM self-refresh test.
{
int i;
printf("[SDRAM Initialization]\n");
printf("Fill SDRAM for self-refresh test.\n");
for(i=_NONCACHE_STARTADDRESS;i<(_NONCACHE_STARTADDRESS+0x400000);i+=4)
*((U32 *)i)=i^0x55555555;
printf("Filling SDRAM is completed.\n");
*((volatile U32 *)0x33e00000)=0x0; //for Initialize the counter in Check_SleepWakeDN_100Hz().
}
//===========================================================================
//===========================================================================
void ConfigSleepGPIO(void)
{
// USB2.0 and PHY power
rUSB_PHYPWR |= (0xf<<0);
rPWRCFG &= ~(1<<4);
#ifdef __EVT1
rUSB_CLKCON &= ~(1<<31);
#else
#endif
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_OP1 IO
// GPF[7:0], GPG[7:0], GPE[15:14], GPE[4:0]
//GPF
rGPFCON &=~(0xffff<<0);
rGPFCON |= ((0x1<<14)|(0x1<<12)|(0x1<<10)|(0x1<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x2<<0));
#ifdef __EVT1
rEXTINT0 = (rdEXTINT0 & ~((1<<31) | (1<<27) | (1<<23) | (1<<19) | (1<<15) | (1<<11) | (1<<7) | (1<<3) ));
rEXTINT0 = (rdEXTINT0 | ((1<<31) | (1<<27) | (1<<23) | (1<<19) | (0<<15) | (1<<11) | (1<<7) | (1<<3) )); //rEXTINT0[11] = PD_dis(Because of VBUS_DET)
#else
rGPFUDP &=~(0xffff<<0);
rGPFUDP |= ((0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x1<<6)|(0x1<<4)|(0x2<<2)|(0x1<<0));
#endif
rGPFDAT &=~ (0xff<<0);
rGPFDAT |= ((0x0<<7)|(0x0<<6)|(0x0<<5)|(0x0<<4)|(0x0<<3)|(0x0<<2)|(0x0<<1)|(0x0<<0));
//GPG
rGPGCON &=~(0xffff<<0);
rGPGCON |= ((0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x2<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
rGPGUDP &=~(0xffff<<0);
#ifdef __EVT1
rEXTINT1 = (rdEXTINT1 | (0<<31) | (0<<27) | (0<<23) | (0<<19) | (1<<15) | (0<<11) | (0<<7)| (0<<0) );
#else
rGPGUDP |= ((0x2<<14)|(0x2<<12)|(0x1<<10)|(0x1<<8)|(0x1<<6)|(0x1<<4)|(0x1<<2)|(0x1<<0));
#endif
rGPGDAT &=~ (0xff<<0);
rGPGDAT |= ((0x1<<7)|(0x0<<6)|(0x1<<5)|(0x1<<4)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
//GPA
#ifdef __EVT1
rGPACDH = (rdGPACDH | (1<<16) | (1<<5)); //GPACDH[16] is exclusive use of nRSTOUT and '1' is PRESET
#else
rGPACON &=~(0x1<<21);
rGPACON |= ((0x0<<21));//Set GPA21 as Output(default : nRSTOUT)
rGPADAT &=~ (0x7<<21);//Clear GPA21~23
rGPADAT |= ((0x1<<21));//Set GPA21(DAT) as '1'
#endif
// DP0 / DN0
rMISCCR |= (1<<12); //Set USB port as suspend mode
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_OP2 IO
// GPB[10:0], GPH[12:0], GPE[15:14], GPE[4:0]
//GPB
rGPBCON &=~(0x3fffff<<0);
#ifdef __EVT1
rGPBCON |= ((0x0<<20)|(0x0<<18)|(0x0<<16)|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x3<<0));
#else
rGPBCON |= ((0x0<<20)|(0x0<<18)|(0x0<<16)|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x1<<6)|(0x1<<4)|(0x0<<2)|(0x1<<0));
#endif
rGPBUDP = (rGPBUDP &=~(0x3fffff<<0));
#ifdef __EVT1
rGPBUDP |= ((0x3<<20)|(0x2<<18)|(0x2<<16)|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x3<<8)|(0x3<<6)|(0x3<<4)|(0x0<<2)|(0x3<<0));
#else
rGPBUDP |= ((0x1<<20)|(0x1<<18)|(0x1<<16)|(0x1<<14)|(0x1<<12)|(0x1<<10)|(0x0<<8)|(0x2<<6)|(0x2<<4)|(0x1<<2)|(0x2<<0));
#endif
//GPE
rGPECON &=~((0xf<<28)|(0x3ff<<0));
#ifdef __EVT1
rGPECON |= ((0x0<<30)|(0x0<<28)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#else
rGPECON |= ((0x0<<30)|(0x0<<28)|(0x1<<8)|(0x0<<6)|(0x1<<4)|(0x0<<2)|(0x0<<0));
#endif
rGPEUDP &=~((0xf<<28)|(0x3ff<<0));
#ifdef __EVT1
rGPEUDP |= ((0x0<<30)|(0x0<<28)|(0x0<<8)|(0x3<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#else
rGPEUDP |= ((0x2<<30)|(0x2<<28)|(0x2<<8)|(0x1<<6)|(0x2<<4)|(0x1<<2)|(0x1<<0));
#endif
rGPEDAT &=~ (0xffff<<0);
rGPEDAT |= ((0x1<<15)|(0x1<<14)|(0x1<<4)|(0x1<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
#ifdef __EVT1
#else
rGPEDAT = 0;
printf("rgPEcon=%08x, rgPEUDP=%08x, rGPeDAT=%08x\n", rGPECON,rGPEUDP,rGPEDAT);
#endif
//GPG
rGPGCON &=~(0xffff<<16);
rGPGCON |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16));
rGPGUDP &=~(0xffff<<16);
#ifdef __EVT1
rGPGUDP |= ((0x2<<30)|(0x0<<28)|(0x3<<26)|(0x3<<24)|(0x0<<22)|(0x3<<20)|(0x3<<18)|(0x3<<16));
#else
rGPGUDP |= ((0x0<<30)|(0x1<<28)|(0x1<<26)|(0x1<<24)|(0x1<<22)|(0x2<<20)|(0x2<<18)|(0x1<<16));
#endif
rGPGDAT &=~ (0xff<<8);
rGPGDAT |= ((0x0<<15)|(0x0<<14)|(0x0<<13)|(0x0<<12)|(0x0<<11)|(0x0<<10)|(0x0<<9)|(0x0<<8));
//GPH
rGPHCON &=~(0x3fffffff<<0);
#ifdef __EVT1
rGPHCON |= ((0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#else
rGPHCON |= ((0x1<<28)|(0x0<<26)|(0x0<<24)|(0x1<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#endif
rGPHUDP &=~(0x3fffffff<<0);
#ifdef __EVT1
rGPHUDP |= ((0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x3<<20)|(0x0<<18)|(0x3<<16)|(0x3<<6)|(0x0<<4)|(0x3<<2)|(0x0<<0));
#else
rGPHUDP |= ((0x2<<28)|(0x1<<26)|(0x1<<24)|(0x2<<22)|(0x1<<20)|(0x2<<18)|(0x1<<16)|(0x1<<6)|(0x2<<4)|(0x1<<2)|(0x2<<0));
#endif
rGPHDAT &=~ (0x7fff<<0);
rGPHDAT |= ((0x0<<14)|(0x1<<13)|(0x0<<12)|(0x1<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_SD IO
// GPE[13:5], GPL[14:0], GPJ[15:13]
//GPE
rGPECON &=~(0x3ffff<<10);
rGPECON |= ((0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)|(0x0<<14)|(0x0<<12)|(0x0<<10));//Set Input All
rGPEUDP &=~(0x3ffff<<10);
#ifdef __EVT1
rGPEUDP |= ((0x0<<26)|(0x0<<24)|(0x0<<22)|(0x3<<20)|(0x3<<18)|(0x3<<16)|(0x3<<14)|(0x3<<12)|(0x0<<10));
#else
rGPEUDP |= ((0x1<<26)|(0x1<<24)|(0x1<<22)|(0x2<<20)|(0x2<<18)|(0x2<<16)\
|(0x2<<14)|(0x2<<12)|(0x1<<10));
#endif
rGPEDAT &=~ (0x1ff<<5);
rGPEDAT |= ((0x0<<13)|(0x0<<12)|(0x0<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)|(0x0<<7)|(0x1<<6)|(0x1<<5));
//GPL
rGPLCON &=~(0x3fffffff<<0);
rGPLCON |= ((0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
rGPLUDP &=~(0x3fffffff<<0);
#ifdef __EVT1
rGPLUDP |= ((0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x3<<16)|(0x3<<14)|(0x3<<12)|(0x3<<10)|(0x3<<8)|(0x3<<6)|(0x3<<4)|(0x3<<2)|(0x3<<0));
#else
rGPLUDP |= ((0x1<<28)|(0x1<<26)|(0x1<<24)|(0x1<<22)|(0x1<<20)|(0x1<<18)|(0x2<<16)|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x1<<6)|(0x2<<4)|(0x2<<2)|(0x2<<0));
#endif
rGPLDAT &=~ (0x1fff<<0);
rGPLDAT |= ((0x0<<14)|(0x0<<13)|(0x0<<12)|(0x0<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)|(0x1<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
//GPJ
rGPJCON &=~(0x3f<<26);
rGPJCON |= ((0x0<<30)|(0x0<<28)|(0x0<<26));
rGPJUDP &=~(0x3f<<26);
#ifdef __EVT1
rGPJUDP |= ((0x0<<30)|(0x0<<28)|(0x0<<26));
#else
rGPJUDP |= ((0x2<<30)|(0x2<<28)|(0x2<<26));
#endif
rGPJDAT &=~ (0x7<<13);
rGPJDAT |= ((0x1<<15)|(0x1<<14)|(0x1<<13));
#ifdef __EVT1
//GPH - This configuration is setting for CFG3(UART) set as [off:off:off:off]
rGPHCON &= ~((0x3<<14)|(0x3<<12)|(0x3<<10)|(0x3<<8));
rGPHUDP &= ~((0x3<<14)|(0x3<<12)|(0x3<<10)|(0x3<<8));
#endif
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_LCD IO
// GPC[15:0], GPD[15:0]
//GPC
rGPCCON &=~(0xffffffff<<0);
rGPCCON |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
rGPCUDP &=~(0xffffffff<<0);
#ifdef __EVT1
rGPCUDP |= ((0x2<<30)|(0x2<<28)|(0x2<<26)|(0x2<<24)|(0x2<<22)|(0x2<<20)|(0x2<<18)|(0x2<<16)
|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x2<<6)|(0x2<<4)|(0x2<<2)|(0x2<<0));
#else
rGPCUDP |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#endif
rGPCDAT &=~ (0x1fff<<0);
rGPCDAT |= ((0x0<<14)|(0x1<<13)|(0x0<<12)|(0x1<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
//GPD
rGPDCON &=~(0xffffffff<<0);
rGPDCON |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
rGPDUDP &=~(0xffffffff<<0);
#ifdef __EVT1
rGPDUDP |= ((0x2<<30)|(0x2<<28)|(0x2<<26)|(0x2<<24)|(0x2<<22)|(0x2<<20)|(0x2<<18)|(0x2<<16)\
|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x2<<6)|(0x2<<4)|(0x2<<2)|(0x2<<0));
#else
rGPDUDP |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#endif
rGPDDAT &=~ (0xffff<<0);
rGPDDAT |= ((0x0<<14)|(0x1<<13)|(0x0<<12)|(0x1<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_CAM IO
// GPJ[15:0],
//GPJ
rGPJCON &=~(0x3ffffff<<0);
rGPJCON |= ((0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
rGPJUDP &=~(0x3ffffff<<0);
#ifdef __EVT1
rGPJUDP |= ((0x2<<24)|(0x2<<22)|(0x2<<20)|(0x2<<18)|(0x2<<16)\
|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x2<<6)|(0x2<<4)|(0x2<<2)|(0x2<<0));
#else
rGPJUDP |= ((0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#endif
rGPJDAT &=~ (0x1fff<<0);
rGPJDAT |= ((0x0<<12)|(0x1<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)\
|(0x0<<7)|(0x1<<6)|(0x1<<5)|(0x1<<4)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_RMOP
rMSLCON = 0x0;
#ifdef __EVT1
rGPMCON &=~((0x3<<2) | (0x3<<0));
rGPMUDP &=~((0x3<<4) |(0x3<<2) | (0x3<<0));
rGPMUDP |= ((0x3<<4) | (0x3<<2) | (0x3<<0));
#endif
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_SMOP : sleep wakeup iteration fail or not?
rMSLCON = 0x0;
#ifdef __EVT1
rDATAPDEN &=~((0x1<<0)|(0x1<<1)|(0x1<<2)|(0x1<<3)|(0x1<<4)|(0x1<<5)); // reset value = 0x3f; --> 0x30 = 2uA
rDATAPDEN = (0x3<<4);
#else
rGPKUDP &=~((0x1<<0)|(0x1<<1)|(0x1<<2)|(0x1<<3)|(0x1<<4)|(0x1<<5)); // reset value = 0x3f; --> 0x30 = 2uA
rGPKUDP |= (0x3<<4);
#endif
}
//================================================================================
void SetAlarmWakeDN(void)
{
rRTCCON = 0x1; // R/W enable, 1/32768, Normal(merge), No reset
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+3;
rRTCALM=0x7f;
rRTCCON=0x0; // R/W disable, 1/32768, Normal(merge), No reset
}
//================================================================================
U32 dsc0_bak, dsc1_bak, mslcon_bak;
void ConfigMiscIO(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -