1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - libraries - OS
3 File: os_irqTable.c
4
5 Copyright 2003-2008 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Date:: 2008-09-17#$
14 $Rev: 8556 $
15 $Author: okubata_ryoma $
16
17 *---------------------------------------------------------------------------*/
18 #include <nitro/os.h>
19
20 void OSi_IrqCallback(int dmaNo);
21
22 void OSi_IrqTimer0(void);
23 void OSi_IrqTimer1(void);
24 void OSi_IrqTimer2(void);
25 void OSi_IrqTimer3(void);
26
27 void OSi_IrqDma0(void);
28 void OSi_IrqDma1(void);
29 void OSi_IrqDma2(void);
30 void OSi_IrqDma3(void);
31
32 #ifdef SDK_ARM7
33 void OSi_IrqVBlank(void);
34 #endif
35
36 #ifdef SDK_TWL
37 void OSi_IrqNDma0(void);
38 void OSi_IrqNDma1(void);
39 void OSi_IrqNDma2(void);
40 void OSi_IrqNDma3(void);
41 #endif
42
43 //---------------- Default jump table for IRQ interrupt
44 //---- for Nitro
45 #ifdef SDK_NITRO
46 #ifdef SDK_ARM9
47 #include <nitro/dtcm_begin.h>
48 #endif // SDK_ARM9
49 OSIrqFunction OS_IRQTable[OS_IRQ_TABLE_MAX] = {
50 #ifdef SDK_ARM9
51 OS_IrqDummy, // 0 VBlank (for ARM9)
52 #else
53 OSi_IrqVBlank, // 0 VBlank (for ARM7)
54 #endif // SDK_ARM9
55 OS_IrqDummy, // 1 HBlank
56 OS_IrqDummy, // 2 VCounter
57 OSi_IrqTimer0, // 3 timer0
58 OSi_IrqTimer1, // 4 timer1
59 OSi_IrqTimer2, // 5 timer2
60 OSi_IrqTimer3, // 6 timer3
61 OS_IrqDummy, // 7 serial communication (will not occur)
62 OSi_IrqDma0, // 8 DMA0
63 OSi_IrqDma1, // 9 DMA1
64 OSi_IrqDma2, // 10 DMA2
65 OSi_IrqDma3, // 11 DMA3
66 OS_IrqDummy, // 12 key
67 OS_IrqDummy, // 13 cartridge
68 OS_IrqDummy, // 14 (not used)
69 OS_IrqDummy, // 15 (not used)
70 OS_IrqDummy, // 16 sub processor
71 OS_IrqDummy, // 17 sub processor send FIFO empty
72 OS_IrqDummy, // 18 sub processor receive FIFO not empty
73 OS_IrqDummy, // 19 card data transfer finish
74 OS_IrqDummy, // 20 card IREQ
75 #ifdef SDK_ARM9
76 OS_IrqDummy, // 21 geometry command FIFO
77 #else
78 OS_IrqDummy, // 21 (not used)
79 OS_IrqDummy, // 22 Power Management IC
80 OS_IrqDummy, // 23 SPI data transfer
81 OS_IrqDummy // 24 Wireless module
82 #endif // SDK_ARM9
83 };
84 #ifdef SDK_ARM9
85 #include <nitro/dtcm_end.h>
86 #endif // SDK_ARM9
87 #else
88
89 //---- for Twl
90 #ifdef SDK_ARM9
91 #include <twl/dtcm_begin.h>
92 #endif // SDK_ARM9
93 OSIrqFunction OS_IRQTable[OS_IRQ_TABLE_MAX] = {
94 #ifdef SDK_ARM9
95 OS_IrqDummy, // 0 VBlank (for ARM9)
96 #else
97 OSi_IrqVBlank, // 0 VBlank (for ARM7)
98 #endif // SDK_ARM9
99 OS_IrqDummy, // 1 HBlank
100 OS_IrqDummy, // 2 VCounter
101 OSi_IrqTimer0, // 3 timer0
102 OSi_IrqTimer1, // 4 timer1
103 OSi_IrqTimer2, // 5 timer2
104 OSi_IrqTimer3, // 6 timer3
105 OS_IrqDummy, // 7 serial communication (will not occur)
106 OSi_IrqDma0, // 8 DMA0
107 OSi_IrqDma1, // 9 DMA1
108 OSi_IrqDma2, // 10 DMA2
109 OSi_IrqDma3, // 11 DMA3
110 OS_IrqDummy, // 12 key
111 OS_IrqDummy, // 13 cartridge
112 OS_IrqDummy, // 14 memory card(A) MC_DET low
113 OS_IrqDummy, // 15 memory card(B) MC_DET low
114 OS_IrqDummy, // 16 sub processor
115 OS_IrqDummy, // 17 sub processor send FIFO empty
116 OS_IrqDummy, // 18 sub processor receive FIFO not empty
117 OS_IrqDummy, // 19 card(A) data transfer finish
118 OS_IrqDummy, // 20 card(B) IREQ
119 #ifdef SDK_ARM9
120 OS_IrqDummy, // 21 geometry command FIFO
121 OS_IrqDummy, // 22 read debug channel RECV buffer
122 OS_IrqDummy, // 23 write debug channel SEND buffer
123 OS_IrqDummy, // 24 DSP
124 OS_IrqDummy, // 25 camera
125 #else // (for ARM7)
126 OS_IrqDummy, // 21 read debug channel RECV buffer
127 OS_IrqDummy, // 22 Power Management IC
128 OS_IrqDummy, // 23 SPI data transfer
129 OS_IrqDummy, // 24 Wireless module
130 OS_IrqDummy, // 25 write debug channel SEND buffer
131 #endif // SDK_ARM9
132 OS_IrqDummy, // 26 card(B) data transfer finished
133 OS_IrqDummy, // 27 card(B) IREQ
134 OSi_IrqNDma0, // 28 new DMA0
135 OSi_IrqNDma1, // 29 new DMA1
136 OSi_IrqNDma2, // 30 new DMA2
137 OSi_IrqNDma3, // 31 new DMA3
138 };
139
140 #ifdef SDK_ARM7
141 OSIrqFunction OS_IRQTable2[OS_IRQ_TABLE2_MAX] = {
142 OSi_IrqNDma3, // 0 GPIO18[0]
143 OSi_IrqNDma3, // 1 GPIO18[1]
144 OSi_IrqNDma3, // 2 GPIO18[2]
145 OSi_IrqNDma3, // 3 (not used)
146 OSi_IrqNDma3, // 4 GPIO33[0]
147 OSi_IrqNDma3, // 5 GPIO33[1]
148 OSi_IrqNDma3, // 6 GPIO33[2]
149 OSi_IrqNDma3, // 7 GPIO33[3]
150 OSi_IrqNDma3, // 8 SD card 1
151 OSi_IrqNDma3, // 9 SDIO card 1 async
152 OSi_IrqNDma3, // 10 SD card 2
153 OSi_IrqNDma3, // 11 SDIO card 2 async
154 OSi_IrqNDma3, // 12 AES process finished
155 OSi_IrqNDma3, // 13 I2C transfer finished
156 OSi_IrqNDma3, // 14 MIC
157 };
158 #endif
159 #ifdef SDK_ARM9
160 #include <twl/dtcm_end.h>
161 #endif // SDK_ARM9
162 #endif // SDK_NITRO
163
164
165
166 #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
167 #include <nitro/dtcm_begin.h>
168 #endif
169 #ifdef SDK_NITRO
170 //---- for Nitro
171 //---------------- Jump table for DMA & TIMER & VBLANK interrupts
172 OSIrqCallbackInfo OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NUM] = {
173 {NULL, 0, 0,}, // dma0
174 {NULL, 0, 0,}, // dma1
175 {NULL, 0, 0,}, // dma2
176 {NULL, 0, 0,}, // dma3
177
178 {NULL, 0, 0,}, // timer0
179 {NULL, 0, 0,}, // timer1
180 {NULL, 0, 0,}, // timer2
181 {NULL, 0, 0,}, // timer3
182 #ifdef SDK_ARM7
183 {NULL, 0, 0,} // vblank
184 #endif // SDK_ARM7
185 };
186
187 //----------------
188 static u16 OSi_IrqCallbackInfoIndex[OSi_IRQCALLBACK_NUM] = {
189 REG_OS_IE_D0_SHIFT, REG_OS_IE_D1_SHIFT, REG_OS_IE_D2_SHIFT, REG_OS_IE_D3_SHIFT,
190 REG_OS_IE_T0_SHIFT, REG_OS_IE_T1_SHIFT, REG_OS_IE_T2_SHIFT, REG_OS_IE_T3_SHIFT,
191 #ifdef SDK_ARM7
192 REG_OS_IE_VB_SHIFT
193 #endif // SDK_ARM7
194 };
195 #else // SDK_NITRO
196 //---- for Twl
197 //---------------- Jump table for DMA & TIMER & VBLANK interrupts
198 OSIrqCallbackInfo OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NUM] = {
199 {NULL, 0, 0,}, // dma0
200 {NULL, 0, 0,}, // dma1
201 {NULL, 0, 0,}, // dma2
202 {NULL, 0, 0,}, // dma3
203
204 {NULL, 0, 0,}, // new dma0
205 {NULL, 0, 0,}, // new dma1
206 {NULL, 0, 0,}, // new dma2
207 {NULL, 0, 0,}, // new dma3
208
209 {NULL, 0, 0,}, // timer0
210 {NULL, 0, 0,}, // timer1
211 {NULL, 0, 0,}, // timer2
212 {NULL, 0, 0,}, // timer3
213 #ifdef SDK_ARM7
214 {NULL, 0, 0,}, // vblank
215 #endif // SDK_ARM7
216 };
217
218 //----------------
219 static u16 OSi_IrqCallbackInfoIndex[OSi_IRQCALLBACK_NUM] = {
220 REG_OS_IE_D0_SHIFT, REG_OS_IE_D1_SHIFT, REG_OS_IE_D2_SHIFT, REG_OS_IE_D3_SHIFT,
221 REG_OS_IE_ND0_SHIFT, REG_OS_IE_ND1_SHIFT, REG_OS_IE_ND2_SHIFT, REG_OS_IE_ND3_SHIFT,
222 REG_OS_IE_T0_SHIFT, REG_OS_IE_T1_SHIFT, REG_OS_IE_T2_SHIFT, REG_OS_IE_T3_SHIFT,
223 #ifdef SDK_ARM7
224 REG_OS_IE_VB_SHIFT
225 #endif // SDK_ARM7
226 };
227 #endif // SDK_NITRO
228 #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
229 #include <nitro/dtcm_end.h>
230 #endif
231
232
233
234 #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
235 #include <nitro/itcm_begin.h>
236 #endif
237 /*---------------------------------------------------------------------------*
238 Name: OS_IrqDummy
239
240 Description: Dummy interrupt handler
241
242 Arguments: None.
243
244 Returns: None.
245 *---------------------------------------------------------------------------*/
OS_IrqDummy(void)246 void OS_IrqDummy(void)
247 {
248 // do nothing
249 }
250
251
252 /*---------------------------------------------------------------------------*
253 Name: OSi_IrqCallback
254
255 Description: System interrupt handler
256
257 Arguments: system irq index
258
259 Returns: None.
260 *---------------------------------------------------------------------------*/
OSi_IrqCallback(int index)261 void OSi_IrqCallback(int index)
262 {
263 OSIrqMask imask = (1UL << OSi_IrqCallbackInfoIndex[index]);
264 void (*callback) (void *) = OSi_IrqCallbackInfo[index].func;
265 u32 enable = OSi_IrqCallbackInfo[index].enable;
266
267 //OS_Printf( "irq %d\n", index );
268 //---- clear callback
269 OSi_IrqCallbackInfo[index].func = NULL;
270
271 //---- call callback
272 if (callback)
273 {
274 (callback) (OSi_IrqCallbackInfo[index].arg);
275 }
276
277 //---- check IRQMask
278 OS_SetIrqCheckFlag(imask);
279
280 //---- restore IRQEnable
281 if (!enable)
282 {
283 (void)OS_DisableIrqMask(imask);
284 }
285 }
286
287 /*---------------------------------------------------------------------------*
288 Name: OSi_IrqDma0 - OSi_IrqDma3
289
290 Description: DMA0 - DMA3 interrupt handler
291
292 Arguments: None.
293
294 Returns: None.
295 *---------------------------------------------------------------------------*/
OSi_IrqDma0(void)296 void OSi_IrqDma0(void)
297 {
298 OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA0);
299 }
300
301 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqDma1(void)302 void OSi_IrqDma1(void)
303 {
304 OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA1);
305 }
306
307 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqDma2(void)308 void OSi_IrqDma2(void)
309 {
310 OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA2);
311 }
312
313 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqDma3(void)314 void OSi_IrqDma3(void)
315 {
316 OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA3);
317 }
318
319 /*---------------------------------------------------------------------------*
320 Name: OSi_IrqTimer0 - OSi_IrqTimer3
321
322 Description: TIMER0 - TIMER3 interrupt handler
323
324 Arguments: None.
325
326 Returns: None.
327 *---------------------------------------------------------------------------*/
328 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqTimer0(void)329 void OSi_IrqTimer0(void)
330 {
331 OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER0);
332 }
333
334 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqTimer1(void)335 void OSi_IrqTimer1(void)
336 {
337 OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER1);
338 }
339
340 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqTimer2(void)341 void OSi_IrqTimer2(void)
342 {
343 OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER2);
344 }
345
346 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqTimer3(void)347 void OSi_IrqTimer3(void)
348 {
349 OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER3);
350 }
351
352 #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
353 #include <nitro/itcm_end.h>
354 #endif
355
356
357 /*---------------------------------------------------------------------------*
358 Name: OSi_VBlank
359
360 Description: VBLANK interrupt handler (for ARM7)
361
362 Arguments: None.
363
364 Returns: None.
365 *---------------------------------------------------------------------------*/
366 #ifdef SDK_ARM7
OSi_IrqVBlank(void)367 void OSi_IrqVBlank(void)
368 {
369 void (*callback) (void) =
370 (void (*)(void))OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NO_VBLANK].func;
371
372 //---- vblank counter
373 (*(u32 *)HW_VBLANK_COUNT_BUF)++;
374
375 //---- call callback
376 if (callback)
377 {
378 (callback) ();
379 }
380
381 //---- check IRQMask
382 OS_SetIrqCheckFlag(1UL << REG_OS_IE_VB_SHIFT);
383 }
384 #endif
385
386 #ifdef SDK_TWL
387 /*---------------------------------------------------------------------------*
388 Name: OSi_IrqNDma0 - OSi_IrqNDma3
389
390 Description: NDMA0 - NDMA3 interrupt handler
391
392 Arguments: None.
393
394 Returns: None.
395 *---------------------------------------------------------------------------*/
OSi_IrqNDma0(void)396 void OSi_IrqNDma0(void)
397 {
398 OSi_IrqCallback(OSi_IRQCALLBACK_NO_NDMA0);
399 }
400
401 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqNDma1(void)402 void OSi_IrqNDma1(void)
403 {
404 OSi_IrqCallback(OSi_IRQCALLBACK_NO_NDMA1);
405 }
406
407 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqNDma2(void)408 void OSi_IrqNDma2(void)
409 {
410 OSi_IrqCallback(OSi_IRQCALLBACK_NO_NDMA2);
411 }
412
413 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqNDma3(void)414 void OSi_IrqNDma3(void)
415 {
416 OSi_IrqCallback(OSi_IRQCALLBACK_NO_NDMA3);
417 }
418 #endif
419