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

📄 syscon.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
字号:
//====================================================================
// File Name : syscon.c
// Function  : S3C2412 System Controller Test Code
// Date      : Apr. 21, 2006
// Version   : S3C2412
//====================================================================
 
#include "def.h"
#include "option.h"
#include "2413addr.h"
#include "Console.h"
#include "System.h" 

#include "syscon.h"
#include "power.h"
#include "clock.h"
#include "reset.h"

void __irq SlowEint0Int(void);


void Test_WDT(void);
volatile int slowExit;


void * func_syscon_test[][2]=
{	
	//                          			"0123456789012345678"
	(void *)Test_Power,						"Power Mode Test    ",
	(void *)Test_Clock,                     "Clock Test         ",
	(void *)Test_Reset,						"Reset Test         ",
	0,0
};

void Ch6_Syscon(void)
{
	int i;
	
	printf("\nSystem Controller Test.\n");

	// Battery fault setting.
	//rMISCCR = (rMISCCR & ~(0x7<<20)) | (1<<22) | (1<<21) | (0<<20);
		
	while(1)
	{
		i=0;
		printf("\n\n");
		while(1)
		{   //display menu
			printf("%2d:%s",i,func_syscon_test[i][1]);
			i++;
			if((int)(func_syscon_test[i][0])==0)
			{
				printf("\n");
				break;
			}
			if((i%3)==0)
			printf("\n");
		}

		printf("\nSelect (\"-1\" to exit) : ");
		i = GetIntNum();
		if(i==-1) break;		// return.
		if(i>=0 && (i<((sizeof(func_syscon_test)-1)/8)) )	// select and execute...
			( (void (*)(void)) (func_syscon_test[i][0]) )();
	}
	
	printf("\nThe end of Test on System Controller.\n");
}

void __irq Eint0Wakeup(void)
{
	rINTMSK |= BIT_EINT0;
	rEINTMASK |= BIT_EINT0;
	
	rEINTPEND |= BIT_EINT0;
	ClearPending(BIT_EINT0);
	//printf("\n &&E0&& \n");
	printf("[WU]EINT0 is occurred!\n");
	
	rEINTMASK &= ~BIT_EINT0;
	rINTMSK &= ~BIT_EINT0;
}

void __irq Eint1Wakeup(void)
{
	rINTMSK |= BIT_EINT1;
	rEINTMASK |= BIT_EINT1;
	
	rEINTPEND |= BIT_EINT1;
	ClearPending(BIT_EINT1);
	//printf("\n &&E1&& \n");
	printf("[WU]EINT1 is occurred!\n");
	
	rEINTMASK &= ~BIT_EINT1;
	rINTMSK &= ~BIT_EINT1;
}

void __irq Eint2Wakeup(void)
{
	rINTMSK |= BIT_EINT2;
	rEINTMASK |= BIT_EINT2;
	
	rEINTPEND |= BIT_EINT2;
	ClearPending(BIT_EINT2);
	//printf("\n &&E2&& \n");
	printf("[WU]EINT1 is occurred!\n");
	
	rEINTMASK &= ~BIT_EINT2;
	rINTMSK &= ~BIT_EINT2;
}

void __irq Eint3Wakeup(void)
{
	rINTMSK |= BIT_EINT3;
	rEINTMASK |= BIT_EINT3;
	
	rEINTPEND |= BIT_EINT3;
	ClearPending(BIT_EINT3);
	//printf("\n &&E3&& \n");
	printf("[WU]EINT1 is occurred!\n");
	
	rEINTMASK &= ~BIT_EINT3;
	rINTMSK &= ~BIT_EINT3;
}

void __irq Eint4_7Wakeup(void)
{
	volatile U32 eintpend;
	
	rINTMSK |= BIT_EINT4_7;
	rEINTMASK |= (0xf<<4);
	
	eintpend = rEINTPEND;	
	rEINTPEND = rEINTPEND;
	ClearPending(BIT_EINT4_7);
	switch((eintpend&0xf))
	{
		case 1:
			printf("[WU]EINT4 is occurred!\n");
			break;
		case 2:
			printf("[WU]EINT5 is occurred!\n");
			break;
		case 4:
			printf("[WU]EINT6 is occurred!\n");
			break;						
		case 8:
			printf("[WU]EINT7 is occurred!\n");
			break;
		default:
			printf("[EINT4-7] Wrong EINT!\n");
			break;
	}	
	
	rEINTMASK &= ~(eintpend);
	rINTMSK &= ~BIT_EINT4_7;
}

void __irq Eint8_23Wakeup(void)
{
	volatile U32 eintpend;
	
	rINTMSK |= BIT_EINT8_23;
	rEINTMASK |= (0xffff<<8);
	
	eintpend = rEINTPEND;	
	rEINTPEND = rEINTPEND;
	ClearPending(BIT_EINT8_23);
	switch((eintpend&0xffff00)>>8)
	{
		case 0x1:
			printf("[WU]EINT8 is occurred!\n");
			break;
		case 0x2:
			printf("[WU]EINT9 is occurred!\n");
			break;
		case 0x4:
			printf("[WU]EINT10 is occurred!\n");
			break;						
		case 0x8:
			printf("[WU]EINT11 is occurred!\n");
			break;
		case 0x10:
			printf("[WU]EINT12 is occurred!\n");
			break;
		case 0x20:
			printf("[WU]EINT13 is occurred!\n");
			break;
		case 0x40:
			printf("[WU]EINT14 is occurred!\n");
			break;						
		case 0x80:
			printf("[WU]EINT15 is occurred!\n");
			break;
		case 0x100:
			printf("[WU]EINT16 is occurred!\n");
			break;
		case 0x200:
			printf("[WU]EINT17 is occurred!\n");
			break;
		case 0x400:
			printf("[WU]EINT18 is occurred!\n");
			break;						
		case 0x800:
			printf("[WU]EINT19 is occurred!\n");
			break;
		case 0x1000:
			printf("[WU]EINT20 is occurred!\n");
			break;
		case 0x2000:
			printf("[WU]EINT21 is occurred!\n");
			break;
		case 0x4000:
			printf("[WU]EINT22 is occurred!\n");
			break;						
		case 0x8000:
			printf("[WU]EINT23 is occurred!\n");
			break;												
		default:
			printf("[EINT8-23] Wrong EINT!\n");
			break;
	}	
	
	rEINTMASK &= ~(eintpend);
	rINTMSK &= ~BIT_EINT8_23;
}


void __irq AlarmWakeup(void)
{
	rINTMSK |= BIT_RTC;
	ClearPending(BIT_RTC);
	//printf("\n **RTC** \n");
	printf("[WU]RTC ALARM is occurred!\n");
	rINTMSK &= ~BIT_RTC;
}

void __irq TickWakeup(void)
{
	rINTMSK |= BIT_TICK;
	ClearPending(BIT_TICK);
	printf("[WU]RTC TICK is occurred!\n");
	rINTMSK &= ~BIT_TICK;
}

void __irq BatteryFaultEvent(void)
{
	rINTMSK |= BIT_BAT_FLT;
	ClearPending(BIT_BAT_FLT);
	printf("[WU]Battery Fault is occurred!\n");
	rINTMSK &= ~BIT_BAT_FLT;
}

void SetAlarmWakeup(void)
{

	pISR_RTC = (U32)AlarmWakeup;
	
	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+0x5;

	rRTCALM=0x7f;

	rRTCCON=0x0;   // R/W disable, 1/32768, Normal(merge), No reset
	
	rINTMSK &= ~BIT_RTC;
	printf("RTC Alarm is set for wake-up source\n");
}


void SetTimeTickWakeup(U32 TICsel, U32 TCnt)
{
	pISR_TICK = (U32)TickWakeup;
	
	rRTCCON = (rRTCCON&~(1<<4))|(TICsel<<4) ;
	rTICNT0 = (TCnt)/256;
	rTICNT1 = (TCnt)%256;
	
	rINTMSK &= ~BIT_TICK;
	
	rTICNT0 |= (1<<7);
	
	printf("RTC Tick is set for wake-up source\n");
}


void SetEintWakeup(U32 EintNumber, U32 SignalMethod, U32 Filter )
{	

	if(EintNumber < 8)
	{
		rGPFCON = (rGPFCON & ~(0x3<<(EintNumber*2)))|(0x2<<(EintNumber*2));
		rEXTINT0 = (rEXTINT0 & ~(0xf<<EintNumber*4))|
		           (Filter<<(EintNumber*4+3)|SignalMethod<<(EintNumber*4));		
	}
	else if(EintNumber < 16)
	{
		rGPGCON = (rGPGCON & ~(0x3<<((EintNumber-8)*2)))|(0x2<<((EintNumber-8)*2));
		rEXTINT1 = (rEXTINT1 & ~(0xf<<(EintNumber-8)*4))|
		           (Filter<<((EintNumber-8)*4+3)|SignalMethod<<((EintNumber-8)*4));		
	}
	else
	{
		printf("error: Wrong Wake-up Source !\n");
		return;
	}
	
	switch(EintNumber)
	{
		case 0:
			pISR_EINT0 = (U32)Eint0Wakeup;
			rEINTMASK &= ~(1<<EintNumber);
			rINTMSK &= ~(BIT_EINT0);
			break;
		case 1:
			pISR_EINT1 = (U32)Eint1Wakeup;
			rEINTMASK &= ~(1<<EintNumber);
			rINTMSK &= ~(BIT_EINT1);
			break;
		case 2:
			pISR_EINT2 = (U32)Eint2Wakeup;
			rEINTMASK &= ~(1<<EintNumber);
			rINTMSK &= ~(BIT_EINT2);
			break;
		case 3:
			pISR_EINT3 = (U32)Eint3Wakeup;
			rEINTMASK &= ~(1<<EintNumber);
			rINTMSK &= ~(BIT_EINT3);
			break;
		default:
			if(EintNumber < 8)
			{
				pISR_EINT4_7 = (U32)Eint4_7Wakeup;
				rEINTMASK &= ~(1<<EintNumber);
				rINTMSK &= ~(BIT_EINT4_7);
			}				
			else if(EintNumber < 16)
			{
				pISR_EINT8_23 = (U32)Eint8_23Wakeup;
				rEINTMASK &= ~(1<<EintNumber);
				rINTMSK &= ~(BIT_EINT8_23);
			}				
			else
			{
				printf("error: Wrong Wake-up Source!\n");
				return;
			}
			break;
	}
	printf("EINT%d is set for wake-up source\n", EintNumber);
}

void SetBatteryFaultEvent(U32 BatConfig)
{
	rPWRCFG = (rPWRCFG & ~(0x3))|(BatConfig);
	if(BatConfig==BATINT)
	{
		pISR_BAT_FLT = (U32)BatteryFaultEvent;
		rINTMSK &= ~(BIT_BAT_FLT);
	}
	if(BatConfig==BATESLEEP)
	{
		printf("Inform register is set!\n");
		rINFORM0 = 0x2BED2BED;
	}
}

⌨️ 快捷键说明

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