2 * interrupts.c - arm exception handling
4 * author: hackbard@hackdaworld.org
8 #include "interrupts.h"
10 // 'module global' interrupt variable
11 static t_interrupt interrupt;
17 void interrupt_init(void) {
19 memset(&interrupt,0,sizeof(t_interrupt));
25 void interrupt_set_default_callback(u32 callback_addr) {
27 VICDefVectAddr=callback_addr;
30 void interrupt_set_soft_callback(void (*callback)(void)) {
32 interrupt->default_soft_callback=callback;
35 void interrupt_soft_clear(u8 src_number) {
37 VICSoftIntClear=(1<<src_number);
39 void interrupt_clear(u8 src_number) {
45 VICIntEnClear=(1<<src_number);
46 VICIntSelect&=~(1<<src_number);
51 for(cnt=0;cnt<INTERRUPT_MAX_VIC;cnt++) {
52 if(cntl[cnt]&0x1f==src_number) {
53 *((volatile u32 *)(addr+cnt))=0;
54 *((volatile u32 *)(cntl+cnt))=0;
59 void interrupt_soft_enable(u8 src_number) {
61 VICSoftInt=(1<<src_number);
64 int interrupt_enable(u8 src_number,u8 mode,u8 priority,u32 callback_addr) {
72 /* check whether this ir source is allready assigned */
73 if(VICIntEnable&(1<<src_number))
74 return INTERRUPT_USED;
77 VICIntEnable=(1<<src_number);
80 case INTERRUPT_MODE_FIQ:
81 VICIntSelect|=(1<<src_number);
83 case INTERRUPT_MODE_VIRQ:
85 return INTERRUP_PRIORITY_USED;
86 *((volatile u32 *)(addr+p))=callback_addr;
87 *((volatile u32 *)(cntl+p))=src_number&0x1f+(1<<5);
88 case INTERRUPT_MODE_IRQ:
95 void interrupt_ext_ir_config(u8 eint,u8 wakeup,u8 mode,u8 polarity) {
101 EXTWAKE=(EXTWAKE&0xf)|(1<<eint);
103 EXTMODE=(EXTMODE&0xf)|(mode<<eint);
104 EXTPOLAR=(EXTPOLAR&0xf)|(polarity<<eint);
105 EXTINT=(EXTINT&0xf)|(1<<eint);
109 * the actual exception handlers (as defined in startup.s)
113 void interrupt_handler_reset(void) {
116 // undefined instruction
117 void interrupt_handler_undef_instruction(void) {
120 // software interrupt
121 void interrupt_handler_soft_ir(void) {
123 if(interrupt.default_soft_callback)
124 interrupt.default_soft_callback();
128 void interrupt_handler_prefetch_abort(void) {
132 void interrupt_handler_data_abort(void) {
136 void interrupt_handler_fiq(void) {