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