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

📄 idle.c

📁 三星s3c2460开发板完整功能测试代码
💻 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 + -