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