* Move UART code into its own file
* Set up vectored interrupt controller * Set up timer interrupt
This commit is contained in:
84
interrupt.c
Normal file
84
interrupt.c
Normal file
@@ -0,0 +1,84 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user