📄 esr.c
字号:
/****************************************************************************
OMAP1510DC EVM Building project
Oct 23, 2001 China Digipro Copy Right Reserved.
File: esr.c
Content: ARM925T exception handler definitions.
Exception vectors jump to these functions.
Author: Zhu, Yaozong
*****************************************************************************/
#include "..\header\armperipherals.h"
extern unsigned short *fpga_intclear;
//typedef unsigned int *f(void) fp;
extern unsigned int SetIRQHandler( unsigned int a0 );
extern int SetupTimerHandler( unsigned int timerNO,
unsigned int LoadTime,
unsigned int OneShot_CLKSRC,
unsigned int Prescaler );
/* extern int SetupINTSourceHandler( unsigned int SourceNO,
unsigned int TriggerType,
unsigned int Priority,
unsigned int IRQorFIQ );
*/
extern int SetupUART1(unsigned int BaudRate);
extern int ReadUART1(unsigned char* Buffer, unsigned int Length);
extern int WriteUART1(unsigned char* Buffer, unsigned int Length);
void swi_idle()
{
printf("esr.c swi_idle\n");
return;
}
unsigned int syscalls[16] = { (unsigned int)SetIRQHandler,
(unsigned int)SetupTimerHandler,
(unsigned int)swi_idle,
(unsigned int)SetupUART1,
(unsigned int)ReadUART1,
(unsigned int)WriteUART1, };
__asm(" .global _syscalls");
__asm("SYSCALLS .word _syscalls");
#pragma INTERRUPT( soft_interrupt, SWI )
/* soft_interrupt is a relay function. */
void soft_interrupt( void ) {
asm("\tstmdb sp!, {r4, r5, lr}");
asm("\tmrs r4, spsr");
asm("\tstr r4, [sp, #-4]!"); /* Save spsr to enable re-entry of SWI. */
//asm("\tmrs r4, cpsr");
//asm("\tbic r4, r4, #0x80");
//asm("\tmsr cpsr, r4"); /* Enable IRQ. */
asm("\tldr r4, [lr, #-4]"); /* Get out the SWI instruction. */
asm("\tmov r5, #0xff000000");
asm("\tmvn r5, r5"); /* r5 = 0x00ffffff */
asm("\tand r4, r4, r5"); /* Now the system call number in r4. */
asm("\tldr r5, SYSCALLS");
asm("\tldr r5, [r5, r4, LSL#2]"); /* r4 contains the call entry now. */
asm("\tmov lr, pc");
asm("\tbx r5"); /* Call the syscall with r0-r3 intact. */
asm("\tldr r5, [sp], #4");
asm("\tcmp r4, #0"); // If SetupIRQ, then don't restore spsr
asm("\tmsrne spsr, r5"); /* Restore spsr. */
asm("\tldmia sp!, {r4, r5, lr}"); /* Restore the registers. */
}
#pragma INTERRUPT( undefined_instruction, UDEF )
void undefined_instruction() {
printf("undefined\n");
asm("undefined_instructionloop: b undefined_instructionloop");
return;
}
#pragma INTERRUPT( prefetch_abort, PABT )
void prefetch_abort() {
printf("prefetch_abort\n");
asm("prefetch_abortloop: b prefetch_abortloop");
return;
}
#pragma INTERRUPT( data_abort, DABT )
void data_abort() {
printf("data_abort\n");
asm("data_abortloop: b data_abortloop");
return;
}
#pragma INTERRUPT( FIQ_handler, FIQ )
void FIQ_handler() {
printf("Firq\n");
asm("FIQ_handlerloop: b FIQ_handlerloop");
return;
}
extern void Timer3Routine(void);
extern void UART1_interrupt(void);
extern void GPIORoutine(void);
extern void mbx_Service(void);
extern void USBInterrupt(void);
extern void Camera_mbx_Service(void);
extern void CAMERA_Service(void);
/*
extern unsigned long *vecs_end;
void fillvector()
{
unsigned long * vectoraddr = (unsigned long *)vecs_end;
int i= 0;
for(;i<3000;i++) {
*vectoraddr = 0xEAFFFFFE;
vectoraddr++;
}
return;
} */
void mbx_Service()
{
//you can do something,here.
Camera_mbx_Service();
return ;
}
//void *IRQRoutines[62](void);
unsigned long isr_table[64] = { 0,0,0,0,0,0,(unsigned long )USBInterrupt,0,\
0,0,0,0,0,0,(unsigned long)UART1_interrupt,0,\
0,0,0,0,0,0,0,0,\
0,0,0,0,0,0,0,0,\
0,(unsigned long)CAMERA_Service,0,0,0,0,0,0,\
0,0,(unsigned long)mbx_Service,0,0,0,(unsigned long)GPIORoutine,0,\
(unsigned long)Timer3Routine,0,0,0,0,0,0,0,\
0,0,0,0,0,0,0,0};
__asm(" .global _isr_table");
__asm("ISR_TABLE .word _isr_table");
/* #pragma INTERRUPT( IRQ_handler, IRQ ) */
/* IRQ_handler is a relay function. */
void IRQ_handler() {
unsigned int temp,TriggerType;
struct interrupt_handler_struct *pINTHandler[2] = {(struct interrupt_handler_struct*)0xFFFECB00,
(struct interrupt_handler_struct*)0xFFFE0000};
temp = (pINTHandler[0]->SIR_IRQ_CODE)&0x0000001f;
if (temp == 0) { /* Well, from handler 2. */
pINTHandler[0]->MIR |= (1<<temp);
temp = (pINTHandler[1]->SIR_IRQ_CODE)&0x0000001f;
pINTHandler[1]->MIR |= (1<<temp);
TriggerType = (pINTHandler[1]->ILR[temp])&(1<<TRIGGER_TYPE);
} else {
pINTHandler[0]->MIR |= (1<<temp);
TriggerType = (pINTHandler[0]->ILR[temp])&(1<<TRIGGER_TYPE);
temp += 32;
}
*fpga_intclear = 0;
/* Handler(); */
/* Play the trick with TI C compiler. The first local variable is located at [sp]. */
asm("\tldr r0, [sp]"); /* Now temp address is [sp]. */
asm("\tstr lr, [sp, #-4]!"); /* Save lr. */
asm("\tldr r1, ISR_TABLE");
asm("\tldr r0, [r1, r0, LSL#2]"); /* Well, get out the routine entry address. */
asm("\tmov lr, pc");
asm("\tbx r0");
asm("\tldr lr, [sp], #4"); /* Restore lr. */
/* Handler(); finished. */
if (temp < 31) {
//pINTHandler[0]->ITR &= ~(1<<temp);
pINTHandler[0]->ITR &= ~(1<<temp);
pINTHandler[1]->CONTROL_REG = 1<<NEW_IRQ_AGR;
//pINTHandler[0]->ITR &= ~(1<<0); // Clear the status
pINTHandler[0]->ITR &= ~(1<<0); // Clear the status
pINTHandler[0]->CONTROL_REG = 1<<NEW_IRQ_AGR;
pINTHandler[1]->MIR &= ~(1<<temp);
pINTHandler[0]->MIR &= ~(1<<0);
}
else {
pINTHandler[0]->ITR &= ~(1<<(temp - 32)); // Clear the status
pINTHandler[0]->CONTROL_REG = 1<<NEW_IRQ_AGR;
pINTHandler[0]->MIR &= ~(1<<(temp - 32));
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -