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

📄 idle.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
字号:
/*****************************************
 NAME: IDLE.C
 DESC: IDLE(MMU) mode test code
 HISTORY:
 Jan.30.2004 : ver 0.0
******************************************/
#include "def.h"
#include "option.h"
#include "24a0addr.h"
#include "24a0lib.h"
#include "24a0slib.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 USE_RTC_ALARM	    (TRUE)
#define CHOOSE_EINT0_TYPE   (FALSE)//(TRUE)

#define EINT9COUNT 10

static volatile int m_cnt, m_flag;

static void __irq EintInt(void)//EINT0,1
{
//    rEINTMASK |= ( (BIT_EINTPEND_EINT1)|(BIT_EINTPEND_EINT0) );
//    rINTMSK |= (BIT_EINT0_2);

    if(rEINTPEND&(1<<0))    //if EINT0
    {
	rEINTPEND=BIT_EINTPEND_EINT0;
	Uart_Printf("EINT0 for IDLE wake-up.\n");
    }
    else if(rEINTPEND&(1<<1))//if EINT1
    {
	rEINTPEND=BIT_EINTPEND_EINT1;
	Uart_Printf("EINT1 for IDLE wake-up.\n");
    }
    else 
	Uart_Printf("EINT Error!!\n");

    ClearPending(BIT_EINT0_2);
}

static void __irq Eint9Int(void)//EINT9
{
//    rEINTMASK |=(BIT_EINTPEND_EINT9);
//    rINTMSK |= (BIT_EINT7_10);

    rEINTPEND=BIT_EINTPEND_EINT9;
    ClearPending(BIT_EINT7_10);
    Uart_Printf("EINT9 for IDLE wake-up.\n");
}

static void __irq AlarmInt(void)
{
//    rINTMSK=rINTMSK|(BIT_RTC);
    ClearPending(BIT_RTC);
    Uart_Printf("ALARM interrupt for IDLE wake-up.\n");
}

static void __irq ModemInt(void)
{
//    rINTMSK=rINTMSK|(BIT_MODEM);
    ClearPending(BIT_MODEM);
    Uart_Printf("Modem interrupt for IDLE wake-up.\n");
}

static void __irq Eint9IntHard(void)
{
    rEINTPEND=BIT_EINTPEND_EINT9;
    ClearPending(BIT_EINT7_10);

    if(m_cnt<EINT9COUNT)
    {
	m_cnt++;
	//if(m_cnt%10==0)Uart_Printf("#");
	Uart_Printf("%d ",m_cnt);
    }
    else
    {
       	m_flag=0;
	Uart_Printf("\nEINT9 final Count=%d\n",m_cnt);
    }
}

static void __irq PenDownInt(void)
{
//    rINTSUBMSK |= BIT_SUB_PENDN;
//    rINTMSK |= BIT_ADC_PENUP_DOWN;

    rSUBSRCPND=BIT_SUB_PENDN;
    ClearPending(BIT_ADC_PENUP_DOWN);
    Uart_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=0xd0; //Pull up Enable
    Delay(1);
    rADCTSC=0xd3; //Waiting for interrupt mode
    //rADCDLY=0x0;
}


void SetModemWakeUp(void)
{
    rINT2AP=0x3ff; //AP side INT ready
}


void SelectEintType(void)
{
    int extintMode;
    Uart_Printf("1.L-level  2.H-level  3.F-edge  4.R-edge  5.B-edge\n");
    Uart_Printf("Select the EINT0 trigger type:");    
    extintMode=Uart_Getch();

    switch(extintMode)
    {
	case '1':
	    rEXTINTC0=( rEXTINTC0 & ~(7<<0) ) | (0<<0); //EINT0=low level triggered
    	    Uart_Printf("L-level\n");
    	    break;
	case '2':
    	    rEXTINTC0=( rEXTINTC0 & ~(7<<0) ) | (1<<0); //EINT0=high level triggered
    	    Uart_Printf("H-level\n");
    	    break;
	case '3':
    	    rEXTINTC0=( rEXTINTC0 & ~(7<<0) ) | (2<<0);  //EINT0=falling edge triggered
    	    Uart_Printf("F-edge\n");
    	    break;
	case '4':
    	    rEXTINTC0=( rEXTINTC0 & ~(7<<0) ) | (4<<0); //EINT0=rising edge triggered
    	    Uart_Printf("R-edge\n");
     	    break;
	case '5':
    	    rEXTINTC0=( rEXTINTC0 & ~(7<<0) ) | (6<<0); //EINT0=both edge triggered
    	    Uart_Printf("B-edge\n");
    	    break;
	default:
    	    break;
    }
}



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

void Test_IdleMode(void)
{
    int i;

    Uart_Printf("[IDLE Mode Test]\n");
    Uart_Printf("Check the current cunsumption.\n");

#if USE_RTC_ALARM
    Uart_Printf("After 10 seconds, S3C24A0X will wake up by RTC alarm interrupt.\n");
#endif

    Uart_Printf("S3C24A0X will wake up by EINT0, 1, 9, 11, Stylus down or Modem int.\n");

    //PWR_Lcd_Tft_16Bit_240320_On();
    //PWR_StartIIS();
    //PWR_StartTimer();

    rGPCON_L = ( rGPCON_L & ~((3<<18)|(3<<2)|3) ) | (2<<18)|(2<<2)|2; //GP0,1,9=EINT0,1,9
    rGPCON_M = ( rGPCON_M & ~(0x3) ) | 0x2; //GP11=EINT11

#if CHOOSE_EINT0_TYPE	   
    SelectEintType();
#else
    rEXTINTC0=( rEXTINTC0 & ~(7<<0) ) | (2<<0);	//EINT0= falling edge triggered
#endif

    rEXTINTC0=( rEXTINTC0 & ~(7<<4) ) | (0<<4);	//EINT1= low level triggered
    rEXTINTC1=( rEXTINTC1 & ~(7<<24) )| (2<<24);//EINT9= falling edge triggered
    rEXTINTC2=( rEXTINTC2 & ~(7<<0) ) | (2<<0);	//EINT11=falling edge triggered

    SetTouchWakeUp();

#if USE_RTC_ALARM
    SetAlarmWakeUp(10);
#endif

    SetModemWakeUp();
    
    rINTMSK=BIT_ALLMSK;
    rINTSUBMSK=BIT_SUB_ALLMSK;
    rEINTMASK=BIT_EINTPEND_ALLMSK;

    pISR_EINT0_2=(U32)EintInt;
    pISR_EINT7_10=(U32)Eint9Int;
    pISR_EINT11_14=(U32)EintInt;
    pISR_RTC=(U32)AlarmInt;
    pISR_MODEM=(U32)ModemInt;
    pISR_ADC_PENUP_DOWN=(U32)PenDownInt;

    //Clear sub interrupt pending
    rEINTPEND=BIT_EINTPEND_EINT0;
    rEINTPEND=BIT_EINTPEND_EINT1;
    rEINTPEND=BIT_EINTPEND_EINT9;
    rEINTPEND=BIT_EINTPEND_EINT11;
    rSUBSRCPND=(BIT_SUB_PENDN|BIT_SUB_PENUP);
    //Clear interrupt pending
    ClearPending(BIT_EINT0_2);
    ClearPending(BIT_EINT7_10);
    ClearPending(BIT_EINT11_14);
    ClearPending(BIT_RTC);
    ClearPending(BIT_MODEM);
    ClearPending(BIT_ADC_PENUP_DOWN);
 
    //Uart_Printf("rINTMSK=0x%x, rINTSUBMSK=0x%x, rEINTMASK=0x%x\n",rINTMSK, rINTSUBMSK, rEINTMASK);
    //rPWRMAN=rPWRMAN&~(1<<8)|(1<<8); //Mask touch screen wakeup
    
    //Unmask interrupt
    rINTMSK=rINTMSK&~(BIT_EINT0_2);
    rINTMSK=rINTMSK&~(BIT_EINT7_10);
    rINTMSK=rINTMSK&~(BIT_EINT11_14);
    rINTMSK=rINTMSK&~(BIT_RTC);
    rINTMSK=rINTMSK&~(BIT_MODEM);
    rINTMSK=rINTMSK&~(BIT_ADC_PENUP_DOWN);
    //Unmask sub interrupt 
    rEINTMASK=rEINTMASK&~(BIT_EINTPEND_EINT0);
    rEINTMASK=rEINTMASK&~(BIT_EINTPEND_EINT1);
    rEINTMASK=rEINTMASK&~(BIT_EINTPEND_EINT9);
    rEINTMASK=rEINTMASK&~(BIT_EINTPEND_EINT11);
    rINTSUBMSK=rINTSUBMSK&~(BIT_SUB_PENDN);

    Uart_Printf("\nEntering IDLE mode......\n\n");
    Uart_TxEmpty(0);

    rCLKCON=( rCLKCON & ~(1<<2) ) | (1<<2);  //enter IDLE mode.
    for(i=0;i<10;i++);   
    //wait until S3C24A0X enters IDLE mode.	
    //wait EINT, RTC alarm, Touch screen pen-down or Modem interrupt

    rCLKCON &= ~(1<<2); 
    rINTMSK=BIT_ALLMSK;
    //turn-off IDLE bit. IDLE bit should be turned off after wake-up.
    Uart_Printf("Return to Normal Mode.\n");
}


void Test_IdleModeHard(void)
{
    int i;

    Uart_Printf("[IDLE Mode Hard Test with Function Genenrator]\n");
    Uart_Printf("S3C24A0X will wake up by EINT9 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=(U32)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 S3C24A0X 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.
    }

    Uart_Printf("Return to Normal Mode.\n");
}

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

void Test_MMUIdleMode(void)
{
    int i;

    Uart_Printf("[MMU IDLE Mode Test]\n");
    Uart_Printf("This routine tests MMU registser7:Wait for interrupt function.\n");
    Uart_Printf("\nCheck the current cunsumption.\n");
#if USE_RTC_ALARM
    Uart_Printf("After 10 seconds, S3C24A0X will wake up by RTC alarm interrupt.\n");
#endif
    Uart_Printf("S3C24A0X will also wake up by EINT0.\n");
    Uart_TxEmpty(0);    //Wait until UART0 Tx buffer empty.

    rGPCON_L=( rGPCON_L & ~(3) ) | (2<<0); //GP0=EINT0
    rEXTINTC0=( rEXTINTC0 & ~(7<<0) ) | (2<<0); //EINT0=falling edge triggered

    pISR_EINT0_2=(U32)EintInt;
#if USE_RTC_ALARM
    pISR_RTC=(U32)AlarmInt;
#endif
    //Clear sub interrupt pending
    rEINTPEND=BIT_EINTPEND_EINT0;
    //Clear interrupt pending
    ClearPending(BIT_EINT0_2|BIT_RTC);

#if USE_RTC_ALARM
    SetAlarmWakeUp(10);
    //rRTCCON = 0x0;	// R/W disable, but interrupt will be generated.
#endif

    //Unmask interrupt
    rINTMSK=rINTMSK&~(BIT_EINT0_2|BIT_RTC);
    //Unmask sub interrupt 
    rEINTMASK=rEINTMASK&~(BIT_EINTPEND_EINT0);

    MMU_WaitForInterrupt();
     
    //wait until processor enters Low-power state.	
    //wait EINT0 interrupt or RTC alarm interrupt
    for(i=0;i<10;i++);   

    Uart_Printf("Return to Normal Mode.\n");
}

⌨️ 快捷键说明

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