2 * interrupts.c - arm exception handling
4 * author: hackbard@hackdaworld.org
8 #include "interrupts.h"
11 * module static interrupt variable
14 static t_interrupt interrupt;
20 void interrupt_init(void) {
22 memset(&interrupt,0,sizeof(t_interrupt));
28 void interrupt_set_default_callback(u32 callback_addr) {
30 VICDefVectAddr=callback_addr;
33 void interrupt_set_soft_callback(void (*callback)(void)) {
35 interrupt->default_soft_callback=callback;
38 void interrupt_soft_clear(u8 src_number) {
40 VICSoftIntClear=(1<<src_number);
42 void interrupt_clear(u8 src_number) {
48 VICIntEnClear=(1<<src_number);
49 VICIntSelect&=~(1<<src_number);
54 for(cnt=0;cnt<INTERRUPT_MAX_VIC;cnt++) {
55 if(cntl[cnt]&0x1f==src_number) {
56 *((volatile u32 *)(addr+cnt))=0;
57 *((volatile u32 *)(cntl+cnt))=0;
62 void interrupt_soft_enable(u8 src_number) {
64 VICSoftInt=(1<<src_number);
67 int interrupt_enable(u8 src_number,u8 mode,u8 priority,u32 callback_addr) {
75 /* check whether this ir source is allready assigned */
76 if(VICIntEnable&(1<<src_number))
77 return INTERRUPT_USED;
80 VICIntEnable=(1<<src_number);
84 VICIntSelect|=(1<<src_number);
88 return INTERRUP_PRIORITY_USED;
89 *((volatile u32 *)(addr+p))=callback_addr;
90 *((volatile u32 *)(cntl+p))=src_number&0x1f+(1<<5);
99 * the actual exception handlers (as defined in startup.s)
103 void interrupt_handler_reset(void) {
106 // undefined instruction
107 void interrupt_handler_undef_instruction(void) {
110 // software interrupt
111 void interrupt_handler_soft_ir(void) {
113 if(interrupt.default_soft_callback)
114 interrupt.default_soft_callback();
118 void interrupt_handler_prefetch_abort(void) {
122 void interrupt_handler_data_abort(void) {
126 void interrupt_handler_fiq(void) {