📄 isr.c
字号:
/*************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* isr.c KS32C50100 : version 1.0 */
/* */
/* COMPONENT */
/* */
/* */
/* DESCRIPTION */
/* */
/* */
/* AUTHOR */
/* */
/* */
/* DATA STRUCTURES */
/* */
/* */
/* FUNCTIONS */
/* */
/* Interrupt handler */
/* */
/* DEPENDENCIES */
/* */
/*************************************************************************/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "snds.h"
#include "isr.h"
#include "uart.h"
#include "pollio.h"
#include "sysconf.h"
void DRAMTOROM_MAP_RESTORE(void);
volatile U32 IntOffSet;
/***************************************************************/
/* Dummy Function Prototype for Interrupt Service Vector Table */
/***************************************************************/
static void DummyIsr(void) {}
void (*InterruptHandlers[MAXHNDLRS])(void);
void ClrIntStatus(void)
{
INTMASK = 0x3fffff; // All interrupt disabled include global bit
INTPEND = 0x1fffff; // All clear pending
INTMODE = 0x1fffff; // All FIQ mode
/*
* 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
}
/******************************************/
/**** Exception Handler Function ****/
/******************************************/
void ISR_UndefHandler(REG32 *adr)
{
//Print("\n** Trap : Undefined Handler\n") ;
i_printf("\rUndefined Address : %08x ",adr);
i_printf("\rUndefined Data : %08x ",*adr);
}
void ISR_PrefetchHandler(REG32 *adr)
{
//Print("\n** Trap : Prefetch Abort Handler\n") ;
i_printf("\rPrefetch Abort Address : %08x ",adr);
i_printf("\rPrefetch Abort Data : %08x ",*adr);
}
void ISR_AbortHandler(REG32 *adr)
{
//Print("\n** Trap : Data Abort Handler\n") ;
i_printf("\rData Abort Address : %08x ",adr);
i_printf("\rData Abort Data : %08x ",*adr);
}
void ISR_SwiHandler(void)
{
i_printf("\r** Trap : SWI Handler\n") ;
}
void ISR_IrqHandler(void)
{
IntOffSet = (U32)INTOFFSET;
Clear_PendingBit(IntOffSet>>2) ;
(*InterruptHandlers[IntOffSet>>2])(); // Call interrupt service routine
}
void ISR_FiqHandler(void)
{
IntOffSet = (U32)INTOFFSET;
Clear_PendingBit(IntOffSet>>2) ;
(*InterruptHandlers[IntOffSet>>2])(); // Call interrupt service routine
}
/***********************************************************************/
/* InitIntHandlerTable: Initialize the interrupt handler table */
/* NOTE(S): This should be called during system initialization */
/***********************************************************************/
void InitIntHandlerTable(void)
{
REG32 i;
for (i = 0; i < MAXHNDLRS; i++)
InterruptHandlers[i] = DummyIsr;
}
/*********************************************************/
/* SysSetInterrupt: Setup Interrupt Handler Vector Table */
/*********************************************************/
void SysSetInterrupt(REG32 vector, void (*handler)())
{
InterruptHandlers[vector] = handler;
}
/*********************************************************/
/* InitInterrupt: Initialize Interrupt */
/*********************************************************/
void InitInterrupt(void)
{
ClrIntStatus(); // Clear All interrupt
InitIntHandlerTable() ;
}
/* =================================================
* Monitoring the interrupt related system register
* =================================================
*/
void IntConfig(void)
{
}
/* =================================================
* Set interrupt priority function
* =================================================
*/
#define nPRIREG 6
void SetPriority(void)
{
int pReg;
int bCnt;
int nPri;
U32 rINTPRI;
volatile unsigned int *pINTPRI[6] = {
&INTPRI0,
&INTPRI1,
&INTPRI2,
&INTPRI3,
&INTPRI4,
&INTPRI5
};
ClrIntStatus(); // Clear All interrupt
/* Clear Interrupt priority register */
for(pReg=0;pReg<nPRIREG;pReg++) {
*pINTPRI[pReg] = 0x0;
}
i_printf("\r\rAssign Interrupt source to priority!");
i_printf("\r>Interrupt source index is two hexdigit.\r\r");
for(pReg=0,nPri=0;pReg<nPRIREG;pReg++) {
for(bCnt=0;(bCnt<4)&&(nPri<MAXHNDLRS); bCnt++,nPri++) {
i_printf("\rInterrupt Priority %d = ",nPri);
rINTPRI = gethex2dec(2); get_byte();
*pINTPRI[pReg] |= (rINTPRI <<(bCnt*8));
}
}
}
void SetIntMode(void)
{
U32 rINTMASK;
//U32 rINTPEND;
U32 rINTMODE;
INTMASK = 0x3fffff; // All interrupt disabled include global bit
INTMODE = 0x1fffff; // All FIQ mode
i_printf("\r> Set INTMODE register[6 hexdigit]_");
rINTMODE = gethex2dec(6); get_byte();
i_printf("\r - INTMODE input is 0x%08x\r",rINTMODE);
i_printf("\r> Set INTMASK register[6 hexdigit]_");
rINTMASK = gethex2dec(6); get_byte();
i_printf("\r - INTMASK input is 0x%08x\r",rINTMASK);
INTMODE = rINTMODE;
INTPEND = 0x1fffff; // All clear pending
INTMASK = rINTMASK;
i_printf("\rAll interrupt pending cleared!!!\r\r");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -