www.pudn.com > hf44b0_TEST.rar > stop.c


#include   
#include "..\inc\44b.h" 
#include "..\inc\44blib.h" 
#include "..\inc\def.h" 
#include "..\inc\rtc.h" 
 
void stopPort(void); 
void ReturnPort(void); 
 
 
static void __irq STAlarmInt(void); 
static void __irq STEint0Int(void); 
 
char wake_int=0; 
void Test_StopMode(void) 
{ 
    unsigned int i, j, portStatus[20]; 
    unsigned int *memdata,*temp; 
     
    memdata = (unsigned int *)malloc(0x100000); 
    temp=memdata; 
 
    for(i=0;i<0x40000;i++) 
	*(temp+i)=i; 
 
    rLOCKTIME=0xfff; 
 
    for(i=0;i<20;i++) 
	portStatus[i]=*( (volatile U32 *)(0x1d20000+(i<<2)) ); 
 
    Uart_Printf("[STOP Mode Test]\n"); 
    Uart_Printf("After 5 seconds, S3C44B0X will wake up by RTC alarm interrupt.\n"); 
    Uart_Printf("S3C44B0X will also wake up by keyboard.\n\n"); 
    Uart_TxEmpty(0);	//Wait until UART0 Tx buffer empty. 
     
    Rtc_Init(); 
 
    rALMYEAR=TESTYEAR2 ; 
    rALMMON =TESTMONTH2; 
    rALMDAY =TESTDAY2  ; 
    rALMHOUR=TESTHOUR2 ; 
    rALMMIN =TESTMIN2  ; 
    rALMSEC =TESTSEC2+4;  
	     
    rRTCALM=0x7f;   //Start RTC alarm 
 
    pISR_RTC=(U32)STAlarmInt; 
    pISR_EINT0=(U32)STEint0Int; 
     
    rINTMSK=BIT_GLOBAL;//Before entering Stop mode interrupts must be masked!! 
 
    stopPort(); 
 
    EnterPWDN(0x1);//Entering Power down mode. 
 
    rCLKCON=0x7ff8; //Thaw mode -> normal mode. 
 
    rINTMSK=~(BIT_GLOBAL|BIT_RTC|BIT_EINT0); 
 
    for(i=0;i<20;i++)// Retrun original port configurations  
        *( (volatile U32 *)(0x1d20000+(i<<2)) )=portStatus[i]; 
 
    rRTCCON = 0x01; //R/W enable to write rRTCALM 
    rRTCALM = 0x0;  //Stop RTC alram 
    rRTCCON = 0x0;  //R/W disable :Stop RTC 
 
    rINTMSK =BIT_GLOBAL;//diable all interrupt. 
 
    switch(wake_int) 
    { 
	case 1: 
	    Uart_Printf("S3C44B0X is waked by Alarm\n"); 
	    break; 
	case 2: 
	    Uart_Printf("S3C44B0X is waked by EINT0\n"); 
	    break; 
	default : 
	    Uart_Printf("Check int!!!\n"); 
	    break; 
    } 
     
    Uart_Printf("Return to Normal Mode.\n");     
 
    Uart_Printf("Self-refresh data verifing...\n"); 
    for(i=0;i<0x40000;i++) 
    { 
	j=*(temp+i); 
	if(j!=i) 
	{ 
	    Uart_Printf("Memory test fail after Self-refresh\n");  
	    break; 
	} 
    } 
    if(j+1==i) 
	Uart_Printf("Stop mode and self-refresh test O.K.\n"); 
 
    free(memdata); 
    wake_int=0; 
 
} 
void __irq STEint0Int(void) 
{ 
    rI_ISPC=BIT_EINT0;	//clear pending_bit 
    wake_int=2; 
} 
 
void __irq STAlarmInt(void) 
{ 
    rI_ISPC=BIT_RTC;    
    //rI_ISPC; //is needed only when cache=on & wrbuf=on & BSFRD=0 
    wake_int=1; 
} 
 
void stopPort(void) 
{ 
// The I/O ports have to be configured  
// properly to reduce STOP mode current. 
// pullup + output=high 
    rPCONA=0x3ff;    //ROM addr:16,17,18,19 SDRAM bank addr:21,22 
 
    rPCONB=0x7ff;	    //SDRAM:SCKE,SCLK,nSCAS,nSRAS 
 
    rPDATC=0x0; 
    rPCONC=0x10000000;	//all output 
    rPUPC=0xc000; 
 
    rPDATD=0x0; 
    rPCOND=0x5555;	//all output 
 
    rPDATE=0x0; 
    rPCONE=0x404;	//all output 
    rPUPE=0x106; 
 
    rPDATF=0x0; 
    rPCONF=0x00;	//all output 
    rPUPF=0x1e3; 
 
    rPDATG=0x0; 
    rPCONG=0x55aa;	//all output 
    rPUPG=0x0; 
 
    rSPUCR=0x0;		 
    rEXTINT=0x22222222;	//falling edge 
 
    rRTCCON=0x0;    //RTC R/W disable for power consumption 
    rADCCON |=0x20; //ADC sleep mode 
}