00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00037 #ifndef NDS_INTERRUPTS_INCLUDE
00038 #define NDS_INTERRUPTS_INCLUDE
00039
00040 #include <nds/ndstypes.h>
00041
00046 enum IRQ_MASKS {
00047 IRQ_VBLANK = BIT(0),
00048 IRQ_HBLANK = BIT(1),
00049 IRQ_VCOUNT = BIT(2),
00050 IRQ_TIMER0 = BIT(3),
00051 IRQ_TIMER1 = BIT(4),
00052 IRQ_TIMER2 = BIT(5),
00053 IRQ_TIMER3 = BIT(6),
00054 IRQ_NETWORK = BIT(7),
00055 IRQ_DMA0 = BIT(8),
00056 IRQ_DMA1 = BIT(9),
00057 IRQ_DMA2 = BIT(10),
00058 IRQ_DMA3 = BIT(11),
00059 IRQ_KEYS = BIT(12),
00060 IRQ_CART = BIT(13),
00061 IRQ_IPC_SYNC = BIT(16),
00062 IRQ_FIFO_EMPTY = BIT(17),
00063 IRQ_FIFO_NOT_EMPTY = BIT(18),
00064 IRQ_CARD = BIT(19),
00065 IRQ_CARD_LINE = BIT(20),
00066 IRQ_GEOMETRY_FIFO = BIT(21),
00067 IRQ_LID = BIT(22),
00068 IRQ_SPI = BIT(23),
00069 IRQ_WIFI = BIT(24),
00070 IRQ_ALL = (~0)
00071 };
00072
00077 enum IRQ_MASKSAUX {
00078 IRQ_POWER = BIT(6)
00079 };
00080
00081 #define IRQ_TIMER(n) (1 << ((n) + 3))
00082
00083 #define MAX_INTERRUPTS 25
00084
00085 typedef enum IRQ_MASKS IRQ_MASK;
00086
00094 #define REG_IE (*(vuint32*)0x04000210)
00095
00096 #define REG_AUXIE (*(vuint32*)0x04000218)
00097
00108 #define REG_IF (*(vuint32*)0x04000214)
00109
00110 #define REG_AUXIF (*(vuint32*)0x0400021C)
00111
00120 #define REG_IME (*(vuint32*)0x04000208)
00121
00125 enum IME_VALUE {
00126 IME_DISABLE = 0,
00127 IME_ENABLE = 1,
00128 };
00129
00130
00131 #ifdef __cplusplus
00132 extern "C" {
00133 #endif
00134
00135
00136 extern VoidFn __irq_vector[];
00137 extern vuint32 __irq_flags[];
00138 extern vuint32 __irq_flagsaux[];
00139
00140 #define INTR_WAIT_FLAGS *(__irq_flags)
00141 #define INTR_WAIT_FLAGSAUX *(__irq_flagsaux)
00142 #define IRQ_HANDLER *(__irq_vector)
00143
00144 struct IntTable{IntFn handler; u32 mask;};
00145
00154 void irqInit();
00169 void irqSet(u32 irq, VoidFn handler);
00170 void irqSetAUX(u32 irq, VoidFn handler);
00171
00176 void irqClear(u32 irq);
00177 void irqClearAUX(u32 irq);
00187 void irqInitHandler(VoidFn handler);
00193 void irqEnable(u32 irq);
00194 void irqEnableAUX(u32 irq);
00200 void irqDisable(u32 irq);
00201 void irqDisableAUX(u32 irq);
00202
00215 void swiIntrWait(u32 waitForSet, uint32 flags);
00216
00225 void swiWaitForVBlank(void);
00226
00227 static inline int enterCriticalSection() {
00228 int oldIME = REG_IME;
00229 REG_IME = 0;
00230 return oldIME;
00231 }
00232
00233 static inline void leaveCriticalSection(int oldIME) {
00234 REG_IME = oldIME;
00235 }
00236
00237
00238 #ifdef __cplusplus
00239 }
00240 #endif
00241
00242 #endif //NDS_INTERRUPTS_INCLUDE
00243