isr.c

来自「S3C4510B的例程」· C语言 代码 · 共 136 行

C
136
字号
/***********************************************************************
 *  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 + =
减小字号Ctrl + -
显示快捷键?