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

📄 stop.c

📁 2410开发测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************
	NAME: stop.c
	DESC: STOP mode test
	HISTORY:
	03.21.2002:purnnamu: first release for S3C2410X
	05.10.2002:SOP RTC Name Change (DAY,DATE)
 *************************************************/
 
#include "def.h"
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h" 

#include "lcdlib.h"
#include "stop.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)

void SelectEintType(void);

static void __irq Eint0Int(void)
{
	ClearPending(BIT_EINT0);
	Uart_Printf("[WU]EINT0 interrupt is occurred for STOP/POWER_OFF mode wake-up.\n");
}

static void __irq Eint8_23Int(void)
{
	rEINTPEND=(1<<11); //EINT11 sub-pending bit.	
	ClearPending(BIT_EINT8_23);
	Uart_Printf("[WU]EINT8_23 interrupt is occurred for STOP/POWER_OFF mode wake-up.\n");
}

static void __irq Eint8_23Int_100Hz(void)
{
	rEINTPEND=(1<<11); //EINT11 sub-pending bit.	
	ClearPending(BIT_EINT8_23);
	Uart_Printf("wui\n");
}

static void __irq AlarmInt(void)
{
	ClearPending(BIT_RTC);
	Uart_Printf("[WU]ALARM interrupt is occurred for STOP/POWER_OFF mode wake-up.\n");
}

#define CHECK_SDRAM_SELFREFRESH		(1)
#define EXTERNAL_BUS_HOLDER			(1)	
	//The SMDK2410X board has externa databus buffer with bus hold function.
#define CHOOSE_EINT_TYPE			(1)
#define GPIO_RESTORE				(0)

//Initialize SDRAM for SDRAM self-refresh test.
void Test_InitSDRAM(void)
{
	int i;
	
	Uart_Printf("[SDRAM Initialization]\n");
	Uart_Printf("Fill SDRAM for self-refresh test.\n");
	for(i=_NONCACHE_STARTADDRESS;i<(_NONCACHE_STARTADDRESS+0x400000);i+=4)
		*((U32 *)i)=i^0x55555555;
	Uart_Printf("Filling SDRAM is completed.\n");

	*((volatile U32 *)0x33e00000)=0x0;	//for Initialize the counter in Check_PowerOffWakeUp_100Hz(). 
}

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();

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

void ConfigStopGPIO(void)
{
	// Check point
	// 1) NC pin: input pull-up on 
	// 2) If input is driver externally: input pull-up off
	// 3) If a connected component draws some current: output low.
	// 4) If a connected component draws no current: output high.
	
	//chip # = 5

	//CAUTION:Follow the configuration order for setting the ports. 
	// 1) setting value(GPnDAT) 
	// 2) setting control register	(GPnCON)
	// 3) configure pull-up resistor(GPnUP)	

	//32bit data bus configuration	
	//*** PORT A GROUP
	//Ports	: GPA22 GPA21	GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12	
	//Signal : nFCE nRSTOUT nFRE	nFWE	ALE	CLE	nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
	//Binary : 1	1		1,	1	1	1	1,	1	1	1	1,
	//POFF	: 1	0		1,	1	0	0	1,	1	1	1	1,
	//-------------------------------------------------------------------------------------------
	//Ports	: GPA11	GPA10	GPA9	GPA8	GPA7	GPA6	GPA5	GPA4	GPA3	GPA2	GPA1	GPA0
	//Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
	//Binary : 1		1		1		1,	1		1		1		1,	1		1		1		1		
	//POFF	: 0		0		0		0,	0		0		0		0,	0		0		0		0
	rGPACON = 0x7fffff; 

	//**** PORT B GROUP
	//Ports	: GPB10	GPB9	GPB8	GPB7	GPB6	GPB5	GPB4	GPB3	GPB2	GPB1		GPB0
	//Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
	//Setting: INPUT	OUTPUT	INPUT	OUTPUT	INPUT	OUT		OUT	OUT	OUT	INPUT		INPUT 
	//Binary : 00,	01		00,	01		00,	01		01,	01	01,	00		00	
	//PU_OFF :	0		1		0,		1		1(ext)	1(*)	1,		1		1		1(ext)	1(ext)			
	//*:nDIS_OFF:4.7K external pull-down resistor								
	rGPBDAT=	0x0|(1<<9)|(1<<7)|(0<<5)|(1<<4)|(1<<3)|(1<<2);
	rGPBCON = 0x044550;	
	rGPBUP	= 0x2ff;	//0x2fd->2ff, 3uA is reduced. Why? 

	//*** PORT C GROUP
	//Ports	: GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8 GPC7	GPC6	GPC5	GPC4 GPC3 GPC2	GPC1 GPC0
	//Signal : VD7	VD6	VD5	VD4	VD3	VD2	VD1	VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND	
	//Setting: IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN
	//Binary : 00	00,	00	00,	00	00,	00	00,	00	00,	00	00,	00	00,	00	00
	//PU_OFF :	0	0	0	0,	0	0	0	0,	0	0		0		0,	0	0	0	0
	rGPCDAT = 0x0;
	rGPCCON = 0x00000000;	
	rGPCUP	= 0x0000;	

	//*** PORT D GROUP
	//Ports	: GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
	//Signal : VD23	VD22	VD21	VD20	VD19	VD18	VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9	VD8
	//Setting: IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN	IN
	//Binary : 00	00,	00	00,	00	00,	00	00,	00	00,	00	00,	00	00,	00	00
	//PU_OFF :	0	0	0	0,	0	0	0	0,	0	0	0	0,	0	0	0	0
	rGPDDAT=	0x0;
	rGPDCON = 0x0;	
	rGPDUP	= 0x0;	

	//*** PORT E GROUP
	//Ports	: GPE15	GPE14	GPE13	GPE12	GPE11	GPE10	GPE9	GPE8	GPE7	GPE6	GPE5	GPE4	
	//Signal : IICSDA IICSCL SPICLK0 SPIMOSI0 SPIMISO0 SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO 
	//Setting: IN	IN	IN		IN		IN		IN		IN		IN		IN		IN	IN	OUT
	//Binary : 00	00,	00		00,		00		00,	00		00,	00		00,	00	01,	
	//PU_OFF :	1-ext	1-ext	0		0,		0		0		0		0,		0		0	0	1,
	//------------------------------------------------------------------------------------------------
	//Ports	: GPE3	GPE2	GPE1	GPE0	
	//Signal : I2SSDI CDCLK I2SSCLK I2SLRCK	
	//Setting: IN	OUT	OUT	OUT
	//Binary : 00	01,	01		01
	//PU_OFF :	1-ext	1	1		1
	rGPEDAT = 0x0|(1<<4)|(1<<2)|(1<<1)|(1<<0);
	rGPECON = 0x00000115;	
	rGPEUP	= 0xc01f;	

	//*** PORT F GROUP
	//Ports	: GPF7	GPF6	GPF5	GPF4	GPF3		GPF2	GPF1	GPF0
	//Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
	//Setting: Output Output Output Output IN			IN	IN	EINT0
	//Binary : 01	01,	01	01,	00			00,	00	10
	//PU_OFF :	1		1		1		1,	1-ext		1-ext 1-ext	1-ext
	rGPFDAT = 0x0	|(0xf<<4);
	rGPFCON = 0x5502;
	rGPFUP	= 0xff;	
							
	//*** PORT G GROUP
	//Ports	: GPG15 GPG14 GPG13 GPG12 GPG11	GPG10	GPG9	GPG8	GPG7		GPG6	
	//Signal : nYPON YMON	nXPON XMON	EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
	//Setting: OUT	OUT	OUT	OUT	OUT	OUT		OUT		OUT		OUT		OUT
	//Binary : 01	01,	01	01,	01-dbg 01,		01		01,		01		01
	//PU_OFF :	1	1	1	1,	1-ext	1		1		1,		1		1
	//---------------------------------------------------------------------------------------
	//Ports	: GPG5		GPG4		GPG3	GPG2	GPG1	GPG0	
	//Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
	//Setting: IN		IN		EINT11 IN		IN		IN
	//Binary : 00		00,		10	00,	00		00
	//PU_OFF :	1-ext		1,		1-ext	0		1		1
	rGPGDAT= 0x0 |(1<<11)/*debug*/|(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<10)|(1<<9)|(1<<8)|(1<<7)|(1<<6) ;
	rGPGCON = 0x55555080;	//GPG11=OUT	//for debug
	rGPGUP	= 0xfffb;	

	//*** PORT H GROUP
	//Ports	: GPH10	GPH9	GPH8 GPH7	GPH6	GPH5 GPH4 GPH3 GPH2 GPH1	GPH0 
	//Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
	//Setting: IN		IN		IN	IN	IN	IN	OUT	RXD0 TXD0 OUT	IN
	//Binary : 00,	00		00,	00	00,	00	01,	10	10,	01	00
	//PU_OFF :	0		0		0,	1-ext 1-ext 1-ext 1, 1-ext 1	1	1-ext

#if 1
	rGPHDAT = 0x0|(1<<6)|(1<<1)|(1<<4);	
	rGPHCON = 0x0001a4;			//0x0011a4->0x0001a4 reduces 12uA why -> MAX3232C may sink 12uA.
#else
	//rGPHDAT = 0x0|(1<<6)|(1<<1)|(1<<4);	
	//rGPHCON = 0x0011a4; 
	rGPHDAT = 0x0|(0<<6)|(1<<1)|(1<<4);	//(1<<6)->(0<<6) reduces 12uA (MAX3232C may sink 12uA.)
	rGPHCON = 0x0011a4; 
#endif	
	rGPHUP	= 0x0ff;	// The pull up function is disabled GPH[10:0]

	//External interrupt will be falling edge triggered. 
	rEXTINT0 = 0x22222222;	// EINT[7:0]
	rEXTINT1 = 0x22222222;	// EINT[15:8]
	rEXTINT2 = 0x22222222;	// EINT[23:16]
}

void SetAlarmWakeUp(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+9;

	rRTCALM=0x7f;
	
	rRTCCON=0x0;	// R/W disable, 1/32768, Normal(merge), No reset
}

// S3C2400	- S3C2410
//	GPA11	-> GPG3(EINT11)
//	GPE3	<- GPG11(EINT19)
void Test_StopMode(void)
{
	int i;
//	U32 portStatus[33];
	int error=0;

	Uart_Printf("[STOP Mode Test]\n");
	
	Uart_Printf("BATT_FLT pin should be tested.\n");
	Uart_Printf("S3C2410 will wake up by RTC alarm(10 sec) or EINT0 .\n");

	//for test
	rMISCCR=rMISCCR&~(0x7<<4)&~(0x7<<8)|(0<<4)|(2<<8); //CLKOUT0=MPLL,CLKOUT1=FCLK

#if GPIO_RESTORE
	// Save the port configurations
	for(i=0;i<33;i++)
		portStatus[i]=*( (volatile U32 *)0x56000000 + i);
#endif

	ConfigStopGPIO(); //GPG11=OUT
	
#if CHOOSE_EINT_TYPE		
	SelectEintType();
#else
	rGPFCON=rGPFCON & ~(3<<0)|(2<<0);	//GPF0=EINT0
	rEXTINT0=rEXTINT0&~(7<<0)|(0x2<<0);	//EINT0=falling edge triggered
#endif

	rGPGCON=rGPGCON & ~(3<<6)|(2<<6);	//GPG3=EINT11
	rEXTINT1=rEXTINT1&~(7<<12)|(0x2<<12);	//EINT11=falling edge triggered

	Uart_Printf("\nNow, I am entering STOP mode.\n");
	Uart_TxEmpty(0);	//Wait until UART0 Tx buffer empty.
	
	pISR_EINT0=(U32)Eint0Int;
	pISR_EINT8_23=(U32)Eint8_23Int;
	pISR_RTC=(U32)AlarmInt;

	rEINTPEND = (1<<11); // clear EINT11 pending bit in rEINTPEND
	rSRCPND = BIT_EINT0|BIT_RTC|BIT_EINT8_23;
	rINTPND = BIT_EINT0|BIT_RTC|BIT_EINT8_23;

	rINTMSK = BIT_ALLMSK;
	//rINTMSK = ~BIT_EINT0;
	// NOTE: Any interrupt can't be used in STOP mode 
	//		because SDRAM is in self-refresh mode and ISR code will access SDRAM.

#if 1	
	SetAlarmWakeUp();
#endif

	rRTCCON=0x0;	// R/W disable, 1/32768, Normal(merge), No reset
	rADCCON|=(1<<2);

	rMISCCR|=(1<<12); //USB port0 = suspend
	rMISCCR|=(1<<13); //USB port1 = suspend

	rMISCCR|=(1<<2); //Previous state at STOP mode. 
					//For SDRAM self-refresh mode, rMISCCR[2] should be 1.

#if EXTERNAL_BUS_HOLDER
	//D[31:0] pull-up off. The data bus will not be float by the external bus holder.
	//If the pull-up resitsers are turned on,
	//there will be the leakage current through the pull-up resister
	rMISCCR=rMISCCR|(3<<0); 
#else
	//D[31:0] pull-up on. The data bus will not be float by pull-up resister. 
	rMISCCR=rMISCCR&~(3<<0); 
#endif

	Lcd_EnvidOnOff(0); //Before entering STOP mode, LCD must be off	
	Delay(1);

	Led_Display(0x5);
	//rCLKSLOW=0x34;	//csh (???)debug
	
	//=================================================================
	//	VERY IMPORTANT NOTE 
	//	To enter STOP/SLIDLE mode, MMU TLB-fill operation should be prohibited
	//	because MTT table is in SDRAM and SDRAM is in the self-refresh mode.
	//	So, we will fill TLB before entering SDRAM self-refresh 
	//	instead of disabling MMU.
//	rREFRESH;//To fill TLB for the special register used in EnterPWDN
//	rCLKCON;
//	rMISCCR;
//	rGPFDAT;
	//=================================================================
	rGPGDAT=rGPGDAT&~(1<<11)|(0<<11);	//GPG11(EINT19)=L

⌨️ 快捷键说明

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