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:: 2009-07-14#$
14 $Rev: 10898 $
15 $Author: yada $
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
266 //---- clear callback
267 OSi_IrqCallbackInfo[index].func = NULL;
268
269 //---- call callback
270 if (callback)
271 {
272 (callback) (OSi_IrqCallbackInfo[index].arg);
273 }
274
275 //---- check IRQMask
276 OS_SetIrqCheckFlag(imask);
277
278 //---- restore IRQEnable
279 if (!OSi_IrqCallbackInfo[index].enable)
280 {
281 (void)OS_DisableIrqMask(imask);
282 }
283 }
284
285 /*---------------------------------------------------------------------------*
286 Name: OSi_IrqDma0 - OSi_IrqDma3
287
288 Description: DMA0 - DMA3 interrupt handler
289
290 Arguments: None.
291
292 Returns: None.
293 *---------------------------------------------------------------------------*/
OSi_IrqDma0(void)294 void OSi_IrqDma0(void)
295 {
296 OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA0);
297 }
298
299 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqDma1(void)300 void OSi_IrqDma1(void)
301 {
302 OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA1);
303 }
304
305 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqDma2(void)306 void OSi_IrqDma2(void)
307 {
308 OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA2);
309 }
310
311 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqDma3(void)312 void OSi_IrqDma3(void)
313 {
314 OSi_IrqCallback(OSi_IRQCALLBACK_NO_DMA3);
315 }
316
317 /*---------------------------------------------------------------------------*
318 Name: OSi_IrqTimer0 - OSi_IrqTimer3
319
320 Description: TIMER0 - TIMER3 interrupt handler
321
322 Arguments: None.
323
324 Returns: None.
325 *---------------------------------------------------------------------------*/
326 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqTimer0(void)327 void OSi_IrqTimer0(void)
328 {
329 OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER0);
330 }
331
332 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqTimer1(void)333 void OSi_IrqTimer1(void)
334 {
335 OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER1);
336 }
337
338 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqTimer2(void)339 void OSi_IrqTimer2(void)
340 {
341 OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER2);
342 }
343
344 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqTimer3(void)345 void OSi_IrqTimer3(void)
346 {
347 OSi_IrqCallback(OSi_IRQCALLBACK_NO_TIMER3);
348 }
349
350 #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
351 #include <nitro/itcm_end.h>
352 #endif
353
354
355 /*---------------------------------------------------------------------------*
356 Name: OSi_VBlank
357
358 Description: VBLANK interrupt handler (for ARM7)
359
360 Arguments: None.
361
362 Returns: None.
363 *---------------------------------------------------------------------------*/
364 #ifdef SDK_ARM7
OSi_IrqVBlank(void)365 void OSi_IrqVBlank(void)
366 {
367 void (*callback) (void) =
368 (void (*)(void))OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NO_VBLANK].func;
369
370 //---- vblank counter
371 (*(u32 *)HW_VBLANK_COUNT_BUF)++;
372
373 //---- call callback
374 if (callback)
375 {
376 (callback) ();
377 }
378
379 //---- check IRQMask
380 OS_SetIrqCheckFlag(1UL << REG_OS_IE_VB_SHIFT);
381 }
382 #endif
383
384 #ifdef SDK_TWL
385 /*---------------------------------------------------------------------------*
386 Name: OSi_IrqNDma0 - OSi_IrqNDma3
387
388 Description: NDMA0 - NDMA3 interrupt handler
389
390 Arguments: None.
391
392 Returns: None.
393 *---------------------------------------------------------------------------*/
OSi_IrqNDma0(void)394 void OSi_IrqNDma0(void)
395 {
396 OSi_IrqCallback(OSi_IRQCALLBACK_NO_NDMA0);
397 }
398
399 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqNDma1(void)400 void OSi_IrqNDma1(void)
401 {
402 OSi_IrqCallback(OSi_IRQCALLBACK_NO_NDMA1);
403 }
404
405 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqNDma2(void)406 void OSi_IrqNDma2(void)
407 {
408 OSi_IrqCallback(OSi_IRQCALLBACK_NO_NDMA2);
409 }
410
411 /*- - - - - - - - - - - - - - - - - - - - - - - */
OSi_IrqNDma3(void)412 void OSi_IrqNDma3(void)
413 {
414 OSi_IrqCallback(OSi_IRQCALLBACK_NO_NDMA3);
415 }
416 #endif
417