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

📄 sys_irq.c

📁 SPG290 SD卡源程序 是一个基于game开发的嵌入式的平台 ,是sunplus公司推出的32bit平台, 该程序是在SPG290上读写SD卡的程序
💻 C
字号:
#include "Include/Sys_Global.h"
#include "Include/PPU_Control.h"
#include "..\SysLib_Basic\Include\Sys_Register.h"

void IRQ63();
void IRQ62();
void IRQ61();
void IRQ60();

void IRQ59();
void IRQ56();
void IRQ53();

void IRQ51();
void IRQ50();
void IRQ49();
void IRQ48();
void IRQ30();

void IRQ22();

void intmsg();

extern int framecnt;
//extern unsigned int old_yuv, md_frame_int;
extern U32 md_frame_int;

unsigned int MP3_Isr=0;
void irq_dispatch(U32 cp0_cause )
{
	S32 intvec;
	
	intvec = (cp0_cause & 0x00FC0000)>>18;
	
	switch (intvec) {
	case 63:	// TVE IRQ 1
	   	IRQ63();	
		break;	
	case 62:	// TVE IRQ 2
	   	IRQ62();	
		break;	
	case 61:	// TVE IRQ 3
	   	IRQ61();	
		break;	
	case 60:	// TVE IRQ 4
	   	IRQ60();
		break;	
	case 59:	// LCD Interrupt
	   	IRQ59();
		break;	
	case 56: 
		IRQ56(); // timer irq		
		break;
 	case 53: 	// PPU Vertical IRQ		
		IRQ53();
		break;
	case 51:	// Sensor IRQ 0/1
	   	IRQ51();
		break;	
	case 50:	// Sensor IRQ 2
	   	IRQ50();
		break;	
	case 49:	// Sensor IRQ 3
	   	IRQ49();
		break;	
	case 48:	// Sensor IRQ 4
	   	IRQ48();
		break;			
 	case 22:	// BUFCTL IRQ
	   	IRQ22();
		break;	
	case 30:
		IRQ30();
		break;
	}

   return;
}    

void intmsg(void)
{
   while(1);	
}

extern short	TempPCM[];
extern int Need_PCM_Flag;
extern void FillSoftFIFO(unsigned short *TempPCM);

void IRQ63(void)
{
/*	FillSoftFIFO(TempPCM);
	Need_PCM_Flag = 1;		// Set flag to start MP3 decoder
	*P_SPU_SoftIRQEN = 0xC000 | 0x0004 | 0x0003;	// for stereo, 8KBytes
	MP3_Service_Loop();		// add by jackie	
	MP3_Service_Loop();
	MP3_Service_Loop();		
//	print1("IRQ 63\n");*/
}

extern void SPU_IRQ_Service(void);
void IRQ62(void)		//SPU Beat Count ISR
{
//	unsigned int TempValue;
	
//	(*P_SPU_BeatCnt) 
//	(*P_SPU_BeatCnt) |= 0x4FFF;

//	TempValue  = (*P_SPU_BeatCnt);
//	TempValue &= 0x3FFF;			//Write 0 to BeatIRQEn to clear the Beat Count IRQ Flag.
//	*P_SPU_BeatCnt = TempValue;	

//	SPU_IRQ_Service();
}

void IRQ61(void)
{
}
void IRQ60(void)
{
}

void IRQ59(void)
{
}

void IRQ48(void)
{
	//if ((*P_CSI_IRQSTS & 0x63) == 0)
		//print2("CSI Wrong Interrupt 57: ", 0, *P_CSI_IRQSTS);

	if (*P_CSI_IRQSTS & 0x1) {
		//print1("TG_OF Int\n");
		*P_CSI_IRQSTS 		= 0x1;
	}

	if (*P_CSI_IRQSTS & 0x2) {
		//print1("CAP_ACK Int\n");
		*P_CSI_IRQSTS 		= 0x2;
	}

	if (*P_CSI_IRQSTS & 0x20) {
		//print1("CSI Frame Loss Int\n");
		*P_CSI_IRQSTS 		= 0x20;
	}

	if (*P_CSI_IRQSTS & 0x40) {
		//print1("CSI MD_UF Int\n");
		*P_CSI_IRQSTS 		= 0x40;
	}
}

void IRQ51(void)
{
	//if ((*P_CSI_IRQSTS & 0x4) == 0)
		//print2("CSI Wrong Interrupt 56: ", 0, *P_CSI_IRQSTS);

	*P_CSI_IRQSTS 			= 0x4;
	//framecnt++;
}

void IRQ49(void)
{
	//if ((*P_CSI_IRQSTS & 0x8) == 0)
		//print2("CSI Wrong Interrupt 55: ", 0, *P_CSI_IRQSTS);

	*P_CSI_IRQSTS 			= 0x8;
//	md_frame_int 			= 1;
	//CSI Motion Dectect FRAME 
}

void IRQ50(void)
{
//	U32 new_yuv, diff;

	//if ((*P_CSI_IRQSTS & 0x10) == 0)
		//print2("CSI Wrong Interrupt 54: ", 0, *P_CSI_IRQSTS);

	*P_CSI_IRQSTS 			= 0x10;

//	new_yuv 				= *P_CSI_MD_YUV;
//	new_yuv 				= (new_yuv>>16);
		
//	if (new_yuv >= old_yuv)
//		diff 				= new_yuv - old_yuv;
//	else
//		diff 				= old_yuv - new_yuv;
//		
//	print3("RGB = ", 0, *P_CSI_MD_RGB);

//	old_yuv 				= new_yuv;

}

void IRQ22(void)
{
//	print1("IRQ 22\n");
	
	*(U32*)(0x88090028) = 0;
}


void IRQ53(void)
{
//	print1("IRQ 53\n");
	*P_IRQ_STATUS = 0x00000001;		
	PPU_Service();
}


 void IRQ56(void)
{
	static int counter = 0;

//	print1("Timer 0 IRQ\n");  // 1~2ms
	counter+=1;
	if( counter == 5 )
	{
//		print1("Timer 1 IRQ\n");	// 5~10ms
		counter = 0;
	}
	*P_TM0_CTRL = TIMER_ON | TIMER_IRQ_ON | TIMER_IRQ_CLR;
} 

void IRQ30(void)
{
	unsigned int a,b;
	//P_Int_Mask
	a=*P_Int_clr;
	b=a&0x10;
	*P_Int_clr=a;
}

⌨️ 快捷键说明

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