Quadrotor from scratch
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

#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);
}