?? irq.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 + -