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

📄 irq.c

📁 samsung 9908DVD源代码,
💻 C
字号:
/**********************************************************************************
 * IRQ.c                                                                         
 * hspark@pplab.ce.cnu.ac.kr
 * 
 **********************************************************************************/

#include "kernel\\mk_sys.h"
#include "CalmRISC16\\CalmRISC16.h"
#include "CalmRISC16\\irq.h"
#include "kernel\\mk_task.h"

MK_voidFuncVoid MK_INTFunc[32];
extern VOID MK_TimeTick(INT id);
extern INT MK_ContextSwitchDisable(VOID);
extern VOID MK_ContextSwitchRestore(INT ContextSwitchFlags);
extern void 	IO_WData32(unsigned char *addr,unsigned int high,unsigned int low);
extern void    IO_WData32_EX(unsigned char *addr,unsigned int high,unsigned int low);
extern unsigned long IO_RData32_EX(unsigned char *addr);
extern VOID WRITE32SETMASK ( unsigned char *ui8Addr, unsigned long ui32Val );
extern VOID WRITE32CLRMASK ( unsigned char *ui8Addr, unsigned long ui32Val );

//#define _LISR_MONITOR	
#ifdef _LISR_MONITOR
unsigned long	*pLisr_Ptr;
unsigned long	gLisrStartPointer = 0x273e20;
int	gLisrBufNo, gLisrOffset;
void	ScrTimeChkStart(unsigned long *timer);
#endif

VOID
MK_DefaultINTFunc(INT argc)
{
#if MK_DEBUG_PRINT
	// MK_InfoPrintf(MK_TASK_WARNING, "INT-0x%x\n", argc);
#endif
}

VOID
MK_InterruptInitialize(VOID)
{
	INT vector;

	//IMR0L = 0x0;

	IO_WData32_EX((unsigned char *)&rINTMOD_H, 0, 0);  //IRQ肺 窍绊 
	IO_WData32_EX((unsigned char *)&rINTMASK_H, 0, 0); //老窜篮 傈何 MASK 矫挪促 .
	
	for(vector=0; vector<32; vector++)
	{
		MK_INTFunc[vector] = MK_DefaultINTFunc;
	}
}

INT
MK_IRQInstall(INT Num, MK_voidFuncVoid Func)
{
	unsigned long temp1,temp2;

	if(Num < 0 || Num >= 32)
	{
#if MK_DEBUG_PRINT
		MK_KernelInfoPrintf((MK_TASK_WARNING, "MK_IRQInstall() - Wrong Vector! %x\n", Num));
#endif
		return MK_ERROR;
	}

	temp1 = (~((unsigned long)1<<(Num)));

	//rINTMOD &= (~((unsigned int)1<<(Num)));		/* 0 = IRQ	*/

	IO_WData32_EX((unsigned char *)&rINTMOD_H,0,0);
	
	//R0L |= (1<<(Num));
	MK_INTFunc[Num] = Func;
	
	return MK_NO_ERROR;
}
 
INT
MK_FIQInstall(INT Num, MK_voidFuncVoid Func)
{
	if(Num < 0 || Num >= 32)
	{
#if MK_DEBUG_PRINT	
		MK_KernelInfoPrintf((MK_TASK_WARNING, "MK_FIQInstall() - Wrong Vector! %x\n", Num));
#endif		
		return MK_ERROR;
	}
	
	IMR0L |= (1<<(Num));
	MK_INTFunc[Num] = Func;
	
	return MK_NO_ERROR;
}

// #pragma function=beforeaddr 0x10000 
VOID MK_ServiceIRQ(VOID)
{
	// INT vector;
	unsigned long temp, temp2,temp3,temp4,temp5,temp6,temp7;
	unsigned int phk1,phk2;
	INT flags;
	MK_voidFuncVoid Func;

	temp = IO_RData32_EX((unsigned char *)&rINTOFFSET_H);

	/* 2004/03/26, HeeSang Park - Move to MK_TimeTick() */
	if ( temp == INT_TIMERC )
	{
		phk1 = rTCCON_H & 0xffff;
		phk2 = rTCCON_L & 0xffff;	/* Clear Interrupt Source Status */
		IO_WData32_EX((unsigned char *)&rTCCON_H, phk1, phk2);
		IO_WData32_EX((unsigned char *)&rTCCON_H, 5, 0x1000);//timer c pending bit clear 
	}
#if 0
	if (temp != INT_TIMERC && temp != INT_FIU && temp != INT_TIMERD && temp != INT_NTSC )
	{
		MK_Printf ( "\nINT[%ld]",
							temp );
	}
#endif	
	temp6 =~((unsigned long)1<<(temp));
       temp5 =IO_RData32_EX((unsigned char *)&rINTMASK_H);

	temp7 =   temp5 & temp6;

	IO_WData32_EX((unsigned char *)&rINTMASK_H,(unsigned int)(temp7>>16), (unsigned int)temp7);

	Func = MK_INTFunc[temp];
	
	flags = MK_ContextSwitchDisable();
#ifdef _LISR_MONITOR
	{
		unsigned long start, end;

		ScrTimeChkStart(&start);
		(*Func)(temp);
		ScrTimeChkStart(&end);

#if 0
		gLisrOffset++;
		if ( gLisrOffset >= 10000 )
			gLisrOffset = 0;			
#endif		
		gLisrOffset = (gLisrOffset+1)%1000;
#if 1
		pLisr_Ptr = (unsigned long*)(gLisrStartPointer + gLisrOffset*4);
		*pLisr_Ptr = temp;
		*(pLisr_Ptr+1)=start;
		*(pLisr_Ptr+2)=end;
		*(pLisr_Ptr+3)=end-start;
#endif		
	}
#else
	(*Func)(temp);
#endif
	MK_ContextSwitchRestore(flags);

	

		temp2 = ((unsigned long)1<<(temp));

		temp3 =IO_RData32_EX((unsigned char *)&rINTPND_H);
		temp4 = temp3 | temp2; 
	    IO_WData32_EX((unsigned char *)&rSRCPND_H,(unsigned int)(temp2>>16), (unsigned int) temp2);
		//rSRCPND = ((unsigned int)1<<(temp));			/* 1 = Source Pending clear	*/
		
		//rINTPND |= ((unsigned int)1<<(temp));			/* 1 = Pending clear */
	    IO_WData32_EX((unsigned char *)&rINTPND_H,(unsigned int)(temp4>>16), (unsigned int) temp4);
		
		temp6 =((unsigned long)1<<(temp));
       temp5 =IO_RData32_EX((unsigned char *)&rINTMASK_H);

	temp7 =   temp5 | temp6;

	IO_WData32_EX((unsigned char *)&rINTMASK_H,(unsigned int)(temp7>>16), (unsigned int)temp7);
	
	
}

VOID MK_ServiceFIQ(VOID)
{
	INT vector;
	INT flags;
	MK_voidFuncVoid Func;

	vector = IIR/2;
	Func = MK_INTFunc[vector];
	
	flags = MK_ContextSwitchDisable();
	(*Func)(vector);
	MK_ContextSwitchRestore(flags);
}




⌨️ 快捷键说明

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