Merge over core library changes from the MultiArchDemos branch.
[pub/lufa.git] / LUFA / Platform / UC3 / InterruptManagement.c
diff --git a/LUFA/Platform/UC3/InterruptManagement.c b/LUFA/Platform/UC3/InterruptManagement.c
new file mode 100644 (file)
index 0000000..b1dda74
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+#include "InterruptManagement.h"\r
+\r
+/** Interrupt vector table, containing the ISR to call for each interrupt group */\r
+InterruptHandlerPtr_t InterruptHandlers[AVR32_INTC_NUM_INT_GRPS];\r
+\r
+/** ISR for unhandled interrupt groups */\r
+ISR(Unhandled_Interrupt)\r
+{\r
+       while (true);\r
+}\r
+\r
+/** Retrieves the associated interrupt handler for the interrupt currently being fired. This is\r
+ *  called directly from the exception handler routine before dispatching to the ISR.\r
+ */\r
+InterruptHandlerPtr_t INTC_GetInterruptHandler(const uint_reg_t InterruptLevel)\r
+{\r
+       return InterruptHandlers[AVR32_INTC.icr[AVR32_INTC_INT3 - InterruptLevel]];\r
+}\r
+\r
+/** Initializes the interrupt controller ready to handle interrupts. This must be called at the\r
+ *  start of the user program before any interrupts are registered or enabled.\r
+ */\r
+void INTC_Init(void)\r
+{\r
+       for (uint8_t InterruptGroup = 0; InterruptGroup < AVR32_INTC_NUM_INT_GRPS; InterruptGroup++)\r
+       {\r
+               InterruptHandlers[InterruptGroup] = Unhandled_Interrupt;\r
+               AVR32_INTC.ipr[InterruptGroup]    = Autovector_Table[AVR32_INTC_INT0];\r
+       }\r
+\r
+       __builtin_mtsr(AVR32_EVBA, (uintptr_t)&EVBA_Table);\r
+}\r