2 * interrupts.c - arm exception handling
4 * author: hackbard@hackdaworld.org
8 #include "interrupts.h"
11 // 'module global' interrupt variable
12 static t_interrupt interrupt;
18 void interrupt_init(void) {
20 interrupt.default_soft_callback=0;
21 VICSoftIntClr=0xffffffff;
22 VICIntEnClr=0xffffffff;
26 void interrupt_set_default_callback(u32 callback_addr) {
28 VICDefVectAddr=callback_addr;
31 void interrupt_set_soft_callback(void (*callback)(void)) {
33 interrupt.default_soft_callback=callback;
36 void interrupt_soft_clear(u8 src_number) {
38 VICSoftIntClr=(1<<src_number);
40 void interrupt_clear(u8 src_number) {
46 VICIntEnClr=(1<<src_number);
47 VICIntSelect&=~(1<<src_number);
49 addr=(u32 *)&VICVectAddr0;
50 cntl=(u32 *)&VICVectCntl0;
52 for(cnt=0;cnt<INTERRUPT_MAX_VIC;cnt++) {
53 if((cntl[cnt]&0x1f)==src_number) {
54 *((volatile u32 *)(addr+cnt))=0;
55 *((volatile u32 *)(cntl+cnt))=0;
60 void interrupt_soft_enable(u8 src_number) {
62 VICSoftInt=(1<<src_number);
65 int interrupt_enable(u8 src_number,u8 mode,u8 priority,u32 callback_addr) {
70 addr=(u32 *)&VICVectAddr0;
71 cntl=(u32 *)&VICVectCntl0;
73 /* check whether this ir source is allready assigned */
74 if(VICIntEnable&(1<<src_number))
75 return INTERRUPT_USED;
77 /* prepare depending on mode */
79 case INTERRUPT_MODE_FIQ:
80 VICIntSelect|=(1<<src_number);
82 case INTERRUPT_MODE_VIRQ:
83 if(addr[priority]&0x3f)
84 return INTERRUPT_PRIORITY_USED;
85 *((volatile u32 *)(addr+priority))=callback_addr;
86 *((volatile u32 *)(cntl+priority))=(src_number&0x1f)+0x20;
87 case INTERRUPT_MODE_IRQ:
93 VICIntEnable=(1<<src_number);
98 int interrupt_change_callback(u8 src_number,u32 callback) {
103 cntl=(u32 *)&VICVectCntl0;
104 addr=(u32 *)&VICVectAddr0;
107 while(i<INTERRUPT_MAX_VIC) {
108 if((*cntl&0x1f)==src_number) {
110 return INTERRUPT_CALLBACK_CHANGED;
115 return INTERRUPT_SRC_NOT_USED;
118 void interrupt_ext_ir_config(u8 eint,u8 wakeup,u8 mode,u8 polarity) {
124 EXTWAKE=(EXTWAKE&0xf)|(1<<eint);
126 EXTMODE=(EXTMODE&0xf)|(mode<<eint);
127 EXTPOLAR=(EXTPOLAR&0xf)|(polarity<<eint);
130 void interrupt_ext_ir_set(u8 eint) {
138 void interrupt_ack(void) {
144 * the actual exception handlers (as defined in startup.s)
148 void interrupt_handler_reset(void) {
151 // undefined instruction
152 void interrupt_handler_undef_instruction(void) {
155 // software interrupt
156 void interrupt_handler_soft_ir(void) {
158 if(interrupt.default_soft_callback)
159 interrupt.default_soft_callback();
163 void interrupt_handler_prefetch_abort(void) {
167 void interrupt_handler_data_abort(void) {
171 void interrupt_handler_fiq(void) {