📄 isr.c
字号:
/***********************************************************************
* MODULE: isr.c
* Description: Interrupt utility codes in C
* Runtime Env: ARM7TDMI
* Company:
* Change History:
* 05-20-02 Create (Yadong Wang)
***********************************************************************/
#include <stdio.h>
#include "common_types.h"
#include "samsung4510.h"
#include "main.h"
static volatile tU32 IntOffSet;
static void DummyIsr(void) {}
static void (*InterruptHandlers[MAXHNDLRS])(void);
void InitInterrupt(void)
{
REG32 i;
INTMASK = 0x3fffff; // All interrupt disabled include global bit
INTPEND = 0x1fffff; // All clear pending
INTMODE = 0x020000; // Ethernet Rx in FIQ, all other in IRQ
/*
* Interrupt Priority Reset value. Need to be changed priority,
* Set interrupt priority register. In this case, Global interrupt
* mask bit must be disabled.
*
*/
//INTPRI0 = 0x03020100;
//INTPRI1 = 0x07060504;
//INTPRI2 = 0x0b0a0908;
//INTPRI3 = 0x0f0e0d0c;
//INTPRI4 = 0x13121110;
//INTPRI5 = 0x00000014;
//INTOFFSET = Read Only Register
// Install default IRQ handler
for (i = 0; i < MAXHNDLRS; i++)
InterruptHandlers[i] = DummyIsr;
}
void SysSetInterrupt(REG32 vector, void (*handler)())
{
InterruptHandlers[vector] = handler;
}
void ISR_IrqHandler(void)
{
IntOffSet = (U32)INTOFFSET;
Clear_PendingBit(IntOffSet>>2) ;
(*InterruptHandlers[IntOffSet>>2])();
}
void ISR_FiqHandler(void)
{
IntOffSet = (U32)INTOFFSET;
Clear_PendingBit(IntOffSet>>2) ;
(*InterruptHandlers[IntOffSet>>2])(); // Call interrupt service routine
}
void ISR_UndefHandler(tU32 adr)
{
tS8 s[80];
Print("\n** Trap : Undefined Handler\n") ;
sprintf(s, "\rUndefined Address : %lx ", adr);
Print(s);
sprintf(s, "\rUndefined Data : %lx ",*((tU32 *)adr));
Print(s);
IOPMOD = 0x0000FFFF;
while(1)
{
IOPDATA |= 0x00000002;
IOPDATA &= !0x00000002;
}
}
void ISR_PrefetchHandler(tU32 adr)
{
tS8 s[80];
Print("\n** Trap : Prefetch Handler\n") ;
sprintf(s, "\rPrefetch Abort Address : %lx ", adr);
Print(s);
sprintf(s, "\rPrefetch Abort Data : %lx ",*((tU32 *)adr));
Print(s);
IOPMOD = 0x0000FFFF;
while(1)
{
IOPDATA |= 0x00000004;
IOPDATA &= !0x00000004;
}
}
void ISR_AbortHandler(tU32 adr)
{
tS8 s[80];
Print("\n** Trap : Data Abort Handler\n") ;
sprintf(s, "\rData Abort Address : %08lx ",adr);
Print(s);
sprintf(s, "\rData Abort Data : %08lx ",*((tU32*)adr));
Print(s);
IOPMOD = 0x0000FFFF;
while(1)
{
IOPDATA |= 0x00000008;
IOPDATA &= !0x00000008;
}
}
void ISR_SwiHandler(void)
{
IOPMOD = 0x0000FFFF;
while(1)
{
IOPDATA |= 0x00000010;
IOPDATA &= !0x00000010;
}
Print("\r** Trap : SWI Handler\n") ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -