📄 idle.c
字号:
/*****************************************
NAME: IDLE.C
DESC: IDLE(MMU) mode test code
HISTORY:
Jan.30.2004 : ver 0.0
******************************************/
#include "def.h"
#include "option.h"
#include "2460addr.h"
#include "2460lib.h"
#include "2460slib.h"
#include "stop.h"
#include "idle.h"
#define TESTYEAR (0x03)
#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 (0x04)
#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 CHOOSE_EINT0_TYPE (FALSE)//(TRUE)
#define EINT0COUNT 10
//#define USE_RTC_ALARM (FALSE)
static volatile int m_cnt, m_flag;
static void __irq Ext0Int(void) //EINT0
{
rEINTPEND=BIT_EINT_0;
ClearPending(BIT_EXT0_3);
printf("EINT0 for IDLE wake-up.\n");
}
static void __irq Ext3Int(void) //EINT15
{
rEINTPEND=BIT_EINT_15;
ClearPending(BIT_EXT12_15);
printf("EINT15 for IDLE wake-up.\n");
}
static void __irq AlarmInt(void)
{
ClearPending(BIT_RTC);
printf("ALARM interrupt for IDLE wake-up.\n");
}
static void __irq ModemInt(void)
{
ClearPending(BIT_MODEM);
printf("Modem interrupt for IDLE wake-up.\n");
}
static void __irq Ext0IntHard(void)
{
rEINTPEND=BIT_EINT_0;
ClearPending(BIT_EXT0_3);
if(m_cnt<EINT0COUNT)
{
m_cnt++;
//if(m_cnt%10==0)printf("#");
printf("%d ",m_cnt);
}
else
{
m_flag=0;
printf("\nEINT0 final Count=%d\n",m_cnt);
}
}
static void __irq PenDownInt(void)
{
rSUBSRCPND=BIT_SUB_PENDN;
ClearPending(BIT_ADC_PENDN);
printf("Touch screen pen-down interrupt for IDLE wake-up.\n");
}
void SetAlarmWakeUp(int sec)
{
rRTCCON = 0x1; // R/W enable, 1/32768, Normal(merge), No reset
rBCDYEAR = TESTYEAR; // '00
rBCDMON = TESTMONTH; // December
rBCDDAY = TESTDAY; // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
rBCDDATE = TESTDATE; // 31th
rBCDHOUR = TESTHOUR; // 23 hours
rBCDMIN = TESTMIN; // 59 minutes
rBCDSEC = TESTSEC; // 59 seconds
rALMYEAR=TESTYEAR2 ; // '01.01.01.Saturday 00:00:09
rALMMON =TESTMONTH2;
rALMDATE=TESTDATE2;
rALMHOUR=TESTHOUR2;
rALMMIN =(TESTMIN2+0);
rALMSEC =(TESTSEC2+sec);
rRTCALM=0x7f;
rRTCCON=0x0; // R/W disable, 1/32768, Normal(merge), No reset
}
void SetTouchWakeUp(void)
{
rADCTSC=0xd3; //Pull up Enable
Delay(1);
//rADCTSC=0xd3; //Waiting for interrupt mode
}
void SetModemWakeUp(void)
{
rINT2AP=0x3ff; //AP side INT ready
}
//temp for test
void Test_IdleMode_Temp(void)
{
int i;
printf("[IDLE Mode Temp Test]\n");
printf("S3C2460X will wake up by EINT0, 15, Stylus down or Modem int.\n");
#if USE_RTC_ALARM
printf("or RTC alarm interrupt.\n");
#endif
//Config EINT0/15
rGPJCON = ( rGPJCON & ~((3<<30)|(3<<0)) ) | ( (1<<31)|(1<<1) );
rEINTCON0=2; //falling for EINT0
rEINTCON1=(2<<28); //falling for EINT15
SetTouchWakeUp();
#if USE_RTC_ALARM
SetAlarmWakeUp(5);
#endif
SetModemWakeUp();
rINTMSK=BIT_ALLMSK;
rINTSUBMSK=BIT_SUB_ALLMSK1;
rEINTMASK=BIT_EINT_ALLMSK;
pISR_EXT0_3=(unsigned int)Ext0Int;//for EINT0
pISR_EXT12_15=(unsigned int)Ext3Int;//fro EINT15
pISR_RTC=(unsigned int)AlarmInt;
pISR_MODEM=(unsigned int)ModemInt;
pISR_ADC_PENDN=(unsigned int)PenDownInt;
//Clear sub interrupt pending
rEINTPEND=BIT_EINT_0;
rEINTPEND=BIT_EINT_15;
rSUBSRCPND=BIT_SUB_PENDN;
//Clear interrupt pending
ClearPending(BIT_EXT0_3);
ClearPending(BIT_EXT12_15);
ClearPending(BIT_RTC);
ClearPending(BIT_MODEM);
ClearPending(BIT_ADC_PENDN);
//Unmask interrupt
rINTMSK=rINTMSK&~(BIT_EXT0_3);
rINTMSK=rINTMSK&~(BIT_EXT12_15);
rINTMSK=rINTMSK&~(BIT_RTC);
rINTMSK=rINTMSK&~(BIT_MODEM);
rINTMSK=rINTMSK&~(BIT_ADC_PENDN);
//Unmask sub interrupt
rEINTMASK=rEINTMASK&~(BIT_EINT_0);
rEINTMASK=rEINTMASK&~(BIT_EINT_15);
rINTSUBMSK=rINTSUBMSK&~(BIT_SUB_PENDN);
printf("\nEntering IDLE mode......\n\n");
//Uart_TxEmpty(0);
rHCLKCON = 0;
rPCLKCON = 0;
rSCLKCON = 0;
#if USE_WFI
if( !( rPWRCFG & (3<<6) ) )
rPWRCFG = ( rPWRCFG & ~(3<<6) ) | (1<<6);
MMU_WaitForInterrupt();// WFI drive the S3C2460 into idle mode
#else
rPWRMODECON |= (1<<17);
for(i=0;i<10;i++);
//wait until S3C2460X enters IDLE mode.
#endif
//wait EINT, RTC alarm, Touch screen pen-down or Modem interrupt
//***Exit STOP mode
#if !USE_WFI
rPWRMODECON &= ~(1<<17);//IDLE bit should be cleared after wake-up.
#endif
rINTMSK=BIT_ALLMSK;
printf("Return to Normal Mode.\n");
}
/**********************
* IDLE mode test *
**********************/
void Test_IdleMode(void)
{
int i;
printf("[IDLE Mode Test]\n");
printf("S3C2460X will wake up by EINT0, 15, Stylus down or Modem int.\n");
#if USE_RTC_ALARM
printf("or RTC alarm interrupt.\n");
#endif
//Config EINT0/15
rGPJCON = ( rGPJCON & ~((3<<30)|(3<<0)) ) | ( (1<<31)|(1<<1) );
rEINTCON0=2; //falling for EINT0
rEINTCON1=(2<<28); //falling for EINT15
SetTouchWakeUp();
#if USE_RTC_ALARM
SetAlarmWakeUp(5);
#endif
SetModemWakeUp();
rINTMSK=BIT_ALLMSK;
rINTSUBMSK=BIT_SUB_ALLMSK1;
rEINTMASK=BIT_EINT_ALLMSK;
pISR_EXT0_3=(unsigned int)Ext0Int;//for EINT0
pISR_EXT12_15=(unsigned int)Ext3Int;//fro EINT15
pISR_RTC=(unsigned int)AlarmInt;
pISR_MODEM=(unsigned int)ModemInt;
pISR_ADC_PENDN=(unsigned int)PenDownInt;
//Clear sub interrupt pending
rEINTPEND=BIT_EINT_0;
rEINTPEND=BIT_EINT_15;
rSUBSRCPND=BIT_SUB_PENDN;
//Clear interrupt pending
ClearPending(BIT_EXT0_3);
ClearPending(BIT_EXT12_15);
ClearPending(BIT_RTC);
ClearPending(BIT_MODEM);
ClearPending(BIT_ADC_PENDN);
//Unmask interrupt
rINTMSK=rINTMSK&~(BIT_EXT0_3);
rINTMSK=rINTMSK&~(BIT_EXT12_15);
rINTMSK=rINTMSK&~(BIT_RTC);
rINTMSK=rINTMSK&~(BIT_MODEM);
rINTMSK=rINTMSK&~(BIT_ADC_PENDN);
//Unmask sub interrupt
rEINTMASK=rEINTMASK&~(BIT_EINT_0);
rEINTMASK=rEINTMASK&~(BIT_EINT_15);
rINTSUBMSK=rINTSUBMSK&~(BIT_SUB_PENDN);
printf("\nEntering IDLE mode......\n\n");
//Uart_TxEmpty(0);
#if USE_WFI
if( !( rPWRCFG & (3<<6) ) )
rPWRCFG = ( rPWRCFG & ~(3<<6) ) | (1<<6);
MMU_WaitForInterrupt();// WFI drive the S3C2460 into idle mode
#else
rPWRMODECON |= (1<<17);
for(i=0;i<10;i++);
//wait until S3C2460X enters IDLE mode.
#endif
//wait EINT, RTC alarm, Touch screen pen-down or Modem interrupt
//***Exit STOP mode
#if !USE_WFI
rPWRMODECON &= ~(1<<17);//IDLE bit should be cleared after wake-up.
#endif
rINTMSK=BIT_ALLMSK;
printf("Return to Normal Mode.\n");
}
void Test_IdleModeHard(void)
{
/*
int i;
printf("[IDLE Mode Hard Test with Function Genenrator]\n");
printf("S3C2460X will wake up by EINT0 at its falling edge.\n");
Uart_TxEmpty(0); //Wait until UART0 Tx buffer empty.
m_cnt=0;
m_flag=1;
rGPCON_L=( rGPCON_L & ~(3<<18) ) | (2<<18); //GP9=EINT9
rEXTINTC1=( rEXTINTC1 & ~(7<<24) ) | (2<<24); //EINT9=falling edge triggered
pISR_EINT7_10=(unsigned int)Eint9IntHard;
rEINTPEND=BIT_EINTPEND_EINT9;
ClearPending(BIT_EINT7_10);
rINTMSK=rINTMSK&~(BIT_EINT7_10);
rEINTMASK=rEINTMASK&~(BIT_EINTPEND_EINT9);
while(m_flag)
{
rCLKCON |= (1<<2); //enter IDLE mode.
//wait until S3C2460X enters IDLE mode.
//wait EINT10 interrupt
for(i=0;i<10;i++);
rCLKCON &= ~(1<<2); //turn-off IDLE bit. IDLE bit should be turned off after wake-up.
}
printf("Return to Normal Mode.\n");
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -