You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.9 KiB
85 lines
1.9 KiB
13 years ago
|
#include "interrupt.h"
|
||
|
|
||
|
#define VICBASE 0xFFFFF000
|
||
|
|
||
|
#define IRQStatus 0x00
|
||
|
#define FIQStatus 0x04
|
||
|
#define RawIntr 0x08
|
||
|
#define IntSelect 0x0c
|
||
|
#define IntEnable 0x10
|
||
|
#define IntEnClr 0x14
|
||
|
#define SoftInt 0x18
|
||
|
#define SoftIntClear 0x1c
|
||
|
#define Protection 0x20
|
||
|
#define VectAddr 0x30
|
||
|
#define DefVectAddr 0x34
|
||
|
#define VectAddr0 0x100
|
||
|
#define VectAddr1 0x104
|
||
|
#define VectAddr2 0x108
|
||
|
#define VectAddr3 0x10c
|
||
|
#define VectAddr4 0x110
|
||
|
#define VectAddr5 0x114
|
||
|
#define VectAddr6 0x118
|
||
|
#define VectAddr7 0x11c
|
||
|
#define VectAddr8 0x120
|
||
|
#define VectAddr9 0x124
|
||
|
#define VectAddr10 0x128
|
||
|
#define VectAddr11 0x12c
|
||
|
#define VectAddr12 0x130
|
||
|
#define VectAddr13 0x134
|
||
|
#define VectAddr14 0x138
|
||
|
#define VectAddr15 0x13c
|
||
|
#define VectCntl0 0x200
|
||
|
#define VectCntl1 0x204
|
||
|
#define VectCntl2 0x208
|
||
|
#define VectCntl3 0x20c
|
||
|
#define VectCntl4 0x210
|
||
|
#define VectCntl5 0x214
|
||
|
#define VectCntl6 0x218
|
||
|
#define VectCntl7 0x21c
|
||
|
#define VectCntl8 0x220
|
||
|
#define VectCntl9 0x224
|
||
|
#define VectCntl10 0x228
|
||
|
#define VectCntl11 0x22c
|
||
|
#define VectCntl12 0x230
|
||
|
#define VectCntl13 0x234
|
||
|
#define VectCntl14 0x238
|
||
|
#define VectCntl15 0x23c
|
||
|
|
||
|
#define VWREG(x) (((volatile unsigned int *)VICBASE)[(x)/sizeof(unsigned int)])
|
||
|
#define VADDRREG(x) VWREG(VectAddr0 + (x) * 4)
|
||
|
#define VCNTLREG(x) VWREG(VectCntl0 + (x) * 4)
|
||
|
|
||
|
#define IRQslot_en (1<<5)
|
||
|
|
||
|
|
||
|
void __attribute__((interrupt("IRQ"))) interrupt_default_handler(void);
|
||
|
|
||
|
|
||
|
void init_interrupt(void)
|
||
|
{
|
||
|
VWREG(IntSelect) = 0;
|
||
|
VWREG(IntEnable) = 0;
|
||
|
VWREG(DefVectAddr) = (unsigned int) &interrupt_default_handler;
|
||
|
}
|
||
|
|
||
|
void __attribute__((interrupt("IRQ"))) interrupt_default_handler(void)
|
||
|
{
|
||
|
/* Do nothing. Assume that if there is a genuine interrupt
|
||
|
* request that it will be asserted again soon.
|
||
|
*/
|
||
|
interrupt_clear();
|
||
|
}
|
||
|
|
||
|
|
||
|
/* Call as interrupt_register(SOURCE, fn) */
|
||
|
|
||
|
void interrupt_register_code(unsigned int source, unsigned int priority,
|
||
|
void(*handler)(void))
|
||
|
{
|
||
|
VADDRREG(priority) = (unsigned int) handler;
|
||
|
VCNTLREG(priority) = source | IRQslot_en;
|
||
|
VWREG(IntEnable) |= (1<<source);
|
||
|
}
|
||
|
|