[49a40165] | 1 | /*--------------------------------------------------------------------------------- |
---|
| 2 | $Id$ |
---|
| 3 | |
---|
| 4 | Interrupt registers and vector pointers |
---|
| 5 | |
---|
| 6 | Copyright (C) 2005 |
---|
| 7 | Jason Rogers (dovoto) |
---|
| 8 | Dave Murphy (WinterMute) |
---|
| 9 | |
---|
| 10 | This software is provided 'as-is', without any express or implied |
---|
| 11 | warranty. In no event will the authors be held liable for any |
---|
| 12 | damages arising from the use of this software. |
---|
| 13 | |
---|
| 14 | Permission is granted to anyone to use this software for any |
---|
| 15 | purpose, including commercial applications, and to alter it and |
---|
| 16 | redistribute it freely, subject to the following restrictions: |
---|
| 17 | |
---|
| 18 | 1. The origin of this software must not be misrepresented; you |
---|
| 19 | must not claim that you wrote the original software. If you use |
---|
| 20 | this software in a product, an acknowledgment in the product |
---|
| 21 | documentation would be appreciated but is not required. |
---|
| 22 | |
---|
| 23 | 2. Altered source versions must be plainly marked as such, and |
---|
| 24 | must not be misrepresented as being the original software. |
---|
| 25 | |
---|
| 26 | 3. This notice may not be removed or altered from any source |
---|
| 27 | distribution. |
---|
| 28 | |
---|
| 29 | |
---|
| 30 | ---------------------------------------------------------------------------------*/ |
---|
| 31 | |
---|
| 32 | /*! \file interrupts.h |
---|
| 33 | |
---|
| 34 | \brief nds interrupt support. |
---|
| 35 | |
---|
| 36 | */ |
---|
| 37 | |
---|
| 38 | #ifndef NDS_INTERRUPTS_INCLUDE |
---|
| 39 | #define NDS_INTERRUPTS_INCLUDE |
---|
| 40 | |
---|
| 41 | #include <nds/jtypes.h> |
---|
| 42 | |
---|
| 43 | /*! \enum IRQ_MASKS |
---|
| 44 | \brief values allowed for REG_IE and REG_IF |
---|
| 45 | |
---|
| 46 | */ |
---|
| 47 | enum IRQ_MASKS { |
---|
| 48 | IRQ_VBLANK = BIT(0), /*!< vertical blank interrupt mask */ |
---|
| 49 | IRQ_HBLANK = BIT(1), /*!< horizontal blank interrupt mask */ |
---|
| 50 | IRQ_VCOUNT = BIT(2), /*!< vcount match interrupt mask */ |
---|
| 51 | IRQ_TIMER0 = BIT(3), /*!< timer 0 interrupt mask */ |
---|
| 52 | IRQ_TIMER1 = BIT(4), /*!< timer 1 interrupt mask */ |
---|
| 53 | IRQ_TIMER2 = BIT(5), /*!< timer 2 interrupt mask */ |
---|
| 54 | IRQ_TIMER3 = BIT(6), /*!< timer 3 interrupt mask */ |
---|
| 55 | IRQ_NETWORK = BIT(7), /*!< serial interrupt mask */ |
---|
| 56 | IRQ_DMA0 = BIT(8), /*!< DMA 0 interrupt mask */ |
---|
| 57 | IRQ_DMA1 = BIT(9), /*!< DMA 1 interrupt mask */ |
---|
| 58 | IRQ_DMA2 = BIT(10), /*!< DMA 2 interrupt mask */ |
---|
| 59 | IRQ_DMA3 = BIT(11), /*!< DMA 3 interrupt mask */ |
---|
| 60 | IRQ_KEYS = BIT(12), /*!< Keypad interrupt mask */ |
---|
| 61 | IRQ_CART = BIT(13), /*!< GBA cartridge interrupt mask */ |
---|
| 62 | IRQ_IPC_SYNC = BIT(16), /*!< IPC sync interrupt mask */ |
---|
| 63 | IRQ_FIFO_EMPTY = BIT(17), /*!< Send FIFO empty interrupt mask */ |
---|
| 64 | IRQ_FIFO_NOT_EMPTY = BIT(18), /*!< Receive FIFO empty interrupt mask */ |
---|
| 65 | IRQ_CARD = BIT(19), /*!< interrupt mask */ |
---|
| 66 | IRQ_CARD_LINE = BIT(20), /*!< interrupt mask */ |
---|
| 67 | IRQ_GEOMETRY_FIFO = BIT(21), /*!< geometry FIFO interrupt mask */ |
---|
| 68 | IRQ_LID = BIT(22), /*!< interrupt mask */ |
---|
| 69 | IRQ_SPI = BIT(23), /*!< SPI interrupt mask */ |
---|
| 70 | IRQ_WIFI = BIT(24), /*!< WIFI interrupt mask (ARM7)*/ |
---|
| 71 | IRQ_ALL = (~0) |
---|
| 72 | }; |
---|
| 73 | |
---|
| 74 | #define MAX_INTERRUPTS 25 |
---|
| 75 | |
---|
| 76 | typedef enum IRQ_MASKS IRQ_MASK; |
---|
| 77 | |
---|
| 78 | /*! \def REG_IE |
---|
| 79 | |
---|
| 80 | \brief Interrupt Enable Register. |
---|
| 81 | |
---|
| 82 | This is the activation mask for the internal interrupts. Unless |
---|
| 83 | the corresponding bit is set, the IRQ will be masked out. |
---|
| 84 | */ |
---|
| 85 | #define REG_IE (*(vuint32*)0x04000210) |
---|
| 86 | |
---|
| 87 | /*! \def REG_IF |
---|
| 88 | |
---|
| 89 | \brief Interrupt Flag Register. |
---|
| 90 | |
---|
| 91 | Since there is only one hardware interrupt vector, the IF register |
---|
| 92 | contains flags to indicate when a particular of interrupt has occured. |
---|
| 93 | To acknowledge processing interrupts, set IF to the value of the |
---|
| 94 | interrupt handled. |
---|
| 95 | |
---|
| 96 | */ |
---|
| 97 | #define REG_IF (*(vuint32*)0x04000214) |
---|
| 98 | |
---|
| 99 | /*! \def REG_IME |
---|
| 100 | |
---|
| 101 | \brief Interrupt Master Enable Register. |
---|
| 102 | |
---|
| 103 | When bit 0 is clear, all interrupts are masked. When it is 1, |
---|
| 104 | interrupts will occur if not masked out in REG_IE. |
---|
| 105 | |
---|
| 106 | */ |
---|
| 107 | #define REG_IME (*(vuint16*)0x04000208) |
---|
| 108 | |
---|
| 109 | /*! \enum IME_VALUE |
---|
| 110 | \brief values allowed for REG_IME |
---|
| 111 | */ |
---|
| 112 | enum IME_VALUE { |
---|
| 113 | IME_DISABLE = 0, /*!< Disable all interrupts. */ |
---|
| 114 | IME_ENABLE = 1, /*!< Enable all interrupts not masked out in REG_IE */ |
---|
| 115 | }; |
---|
| 116 | |
---|
| 117 | |
---|
| 118 | #ifdef __cplusplus |
---|
| 119 | extern "C" { |
---|
| 120 | #endif |
---|
| 121 | |
---|
| 122 | |
---|
| 123 | extern VoidFunctionPointer __irq_vector[]; |
---|
| 124 | extern vuint32 __irq_flags[]; |
---|
| 125 | #define VBLANK_INTR_WAIT_FLAGS *(__irq_flags) |
---|
| 126 | #define IRQ_HANDLER *(__irq_vector) |
---|
| 127 | |
---|
| 128 | struct IntTable{IntFn handler; u32 mask;}; |
---|
| 129 | |
---|
| 130 | /*! \fn irqInit(void) |
---|
| 131 | \brief Initialise the libnds interrupt system. |
---|
| 132 | |
---|
| 133 | Call this function at the start of any application which requires interrupt support. |
---|
| 134 | This function should be used in preference to irqInitHandler. |
---|
| 135 | |
---|
| 136 | */ |
---|
| 137 | void irqInit(void); |
---|
| 138 | /*! \fn irqSet(IRQ_MASK irq, VoidFunctionPointer handler) |
---|
| 139 | \brief Add a handler for the given interrupt mask. |
---|
| 140 | |
---|
| 141 | Specify the handler to use for the given interrupt. This only works with |
---|
| 142 | the default interrupt handler, do not mix the use of this routine with a |
---|
| 143 | user-installed IRQ handler. |
---|
| 144 | \param irq Mask associated with the interrupt. |
---|
| 145 | \param handler Address of the function to use as an interrupt service routine |
---|
| 146 | \note |
---|
| 147 | When any handler specifies using IRQ_VBLANK or IRQ_HBLANK, DISP_SR |
---|
| 148 | is automatically updated to include the corresponding DISP_VBLANK_IRQ or DISP_HBLANK_IRQ. |
---|
| 149 | |
---|
| 150 | \warning Only one IRQ_MASK can be specified with this function. |
---|
| 151 | */ |
---|
| 152 | void irqSet(IRQ_MASK irq, VoidFunctionPointer handler); |
---|
| 153 | /*! \fn irqClear(IRQ_MASK irq) |
---|
| 154 | \brief remove the handler associated with the interrupt mask irq. |
---|
| 155 | \param irq Mask associated with the interrupt. |
---|
| 156 | */ |
---|
| 157 | void irqClear(IRQ_MASK irq); |
---|
| 158 | /*! \fn irqInitHandler(VoidFunctionPointer handler) |
---|
| 159 | \brief Install a user interrupt dispatcher. |
---|
| 160 | |
---|
| 161 | This function installs the main interrupt function, all interrupts are serviced through this routine. For most |
---|
| 162 | purposes the libnds interrupt dispacther should be used in preference to user code unless you know *exactly* what you're doing. |
---|
| 163 | |
---|
| 164 | \param handler Address of the function to use as an interrupt dispatcher |
---|
| 165 | \note the function *must* be ARM code |
---|
| 166 | */ |
---|
| 167 | void irqInitHandler(VoidFunctionPointer handler); |
---|
| 168 | /*! \fn irqEnable(uint32 irq) |
---|
| 169 | \brief Allow the given interrupt to occur. |
---|
| 170 | \param irq The set of interrupt masks to enable. |
---|
| 171 | \note Specify multiple interrupts to enable by ORing several IRQ_MASKS. |
---|
| 172 | */ |
---|
| 173 | void irqEnable(uint32 irq); |
---|
| 174 | /*! \fn irqDisable(uint32 irq) |
---|
| 175 | \brief Prevent the given interrupt from occuring. |
---|
| 176 | \param irq The set of interrupt masks to disable. |
---|
| 177 | \note Specify multiple interrupts to disable by ORing several IRQ_MASKS. |
---|
| 178 | */ |
---|
| 179 | void irqDisable(uint32 irq); |
---|
| 180 | |
---|
| 181 | |
---|
| 182 | #ifdef __cplusplus |
---|
| 183 | } |
---|
| 184 | #endif |
---|
| 185 | |
---|
| 186 | #endif //NDS_INTERRUPTS_INCLUDE |
---|
| 187 | |
---|