1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - OS - include
3   File:     interrupt.h
4 
5   Copyright 2007-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-11-19#$
14   $Rev: 9345 $
15   $Author: okubata_ryoma $
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef TWL_OS_INTERRUPT_H_
19 #define TWL_OS_INTERRUPT_H_
20 
21 #ifdef SDK_TWL
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #include <twl/misc.h>
28 #include <twl/types.h>
29 #include <twl/memorymap.h>
30 #include <twl/ioreg.h>
31 #include <nitro/os/common/thread.h>
32 
33 //---- for DMA, TIMER
34 void    OSi_EnterDmaCallback(u32 dmaNo, void (*callback) (void *), void *arg);
35 void    OSi_EnterNDmaCallback(u32 dmaNo, void (*callback) (void *), void *arg);
36 void    OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), void *arg);
37 
38 //----------------------------------------------------------------------
39 //                  ENABLE/DISABLE flag for IME
40 //----------------------------------------------------------------------
41 #define OS_IME_DISABLE      (0UL << REG_OS_IME_IME_SHIFT)
42 #define OS_IME_ENABLE       (1UL << REG_OS_IME_IME_SHIFT)
43 
44 //----------------------------------------------------------------------
45 //                  IE/IF flags
46 //----------------------------------------------------------------------
47 #define OS_IE_V_BLANK       (1UL << REG_OS_IE_VB_SHIFT)         //  0 VBlank
48 #define OS_IE_H_BLANK       (1UL << REG_OS_IE_HB_SHIFT)         //  1 HBlank
49 #define OS_IE_V_COUNT       (1UL << REG_OS_IE_VE_SHIFT)         //  2 VCounter
50 #define OS_IE_TIMER0        (1UL << REG_OS_IE_T0_SHIFT)         //  3 timer0
51 #define OS_IE_TIMER1        (1UL << REG_OS_IE_T1_SHIFT)         //  4 timer1
52 #define OS_IE_TIMER2        (1UL << REG_OS_IE_T2_SHIFT)         //  5 timer2
53 #define OS_IE_TIMER3        (1UL << REG_OS_IE_T3_SHIFT)         //  6 timer3
54 #define OS_IE_SIO           (1UL << 7                 )         //  7 serial communication (will not occur)
55 #define OS_IE_DMA0          (1UL << REG_OS_IE_D0_SHIFT)         //  8 DMA0
56 #define OS_IE_DMA1          (1UL << REG_OS_IE_D1_SHIFT)         //  9 DMA1
57 #define OS_IE_DMA2          (1UL << REG_OS_IE_D2_SHIFT)         // 10 DMA2
58 #define OS_IE_DMA3          (1UL << REG_OS_IE_D3_SHIFT)         // 11 DMA3
59 #define OS_IE_KEY           (1UL << REG_OS_IE_K_SHIFT)          // 12 key
60 #define OS_IE_CARTRIDGE     (1UL << REG_OS_IE_I_D_SHIFT)        // 13 cartridge
61 #define OS_IE_CARD_A_DET    (1UL << REG_OS_IE_MCADET_SHIFT)     // 14 memory card(A) MC_DET low
62 #define OS_IE_CARD_B_DET    (1UL << REG_OS_IE_MCBDET_SHIFT)     // 15 memory card(B) MC_DET low
63 #define OS_IE_SUBP          (1UL << REG_OS_IE_A7_SHIFT)         // 16 sub processor
64 #define OS_IE_SPFIFO_SEND   (1UL << REG_OS_IE_IFE_SHIFT)        // 17 sub processor send FIFO empty
65 #define OS_IE_SPFIFO_RECV   (1UL << REG_OS_IE_IFN_SHIFT)        // 18 sub processor receive FIFO not empty
66 #define OS_IE_CARD_DATA     (1UL << REG_OS_IE_MC_SHIFT)         // 19 card data transfer finish
67 #define OS_IE_CARD_IREQ     (1UL << REG_OS_IE_MI_SHIFT)         // 20 card IREQ
68 #define OS_IE_CARD_A_DATA   (1UL << REG_OS_IE_MCA_SHIFT)        // 19(dup.) card(A) data transfer finish
69 #define OS_IE_CARD_A_IREQ   (1UL << REG_OS_IE_MIA_SHIFT)        // 20(dup.) card(A) IREQ
70 
71 #ifdef SDK_ARM9
72 #define OS_IE_GXFIFO        (1UL << REG_OS_IE_GF_SHIFT)         // 21 geometry command FIFO
73 #define OS_IE_DEBUG_RECV    (1UL << REG_OS_IE_DRE_SHIFT)        // 22 read debug channel RECV buffer
74 #define OS_IE_DEBUG_SEND    (1UL << REG_OS_IE_DWE_SHIFT)        // 23 write debug channel SEND buffer
75 #define OS_IE_DSP           (1UL << REG_OS_IE_DSP_SHIFT)        // 24 DSP
76 #define OS_IE_CAMERA        (1UL << REG_OS_IE_CAM_SHIFT)        // 25 camera
77 #define OS_IE_CARD_B_DATA   (1UL << REG_OS_IE_MCB_SHIFT)        // 26 card(B) data transfer finished
78 #define OS_IE_CARD_B_IREQ   (1UL << REG_OS_IE_MIB_SHIFT)        // 27 card(B) IREQ
79 #define OS_IE_NDMA0         (1UL << REG_OS_IE_ND0_SHIFT)        // 28 new DMA0
80 #define OS_IE_NDMA1         (1UL << REG_OS_IE_ND1_SHIFT)        // 29 new DMA1
81 #define OS_IE_NDMA2         (1UL << REG_OS_IE_ND2_SHIFT)        // 30 new DMA2
82 #define OS_IE_NDMA3         (1UL << REG_OS_IE_ND3_SHIFT)        // 31 new DMA3
83 #else  //SDK_ARM7
84 #define OS_IE_DEBUG_RECV    (1UL << REG_OS_IE_DRE_SHIFT)        // 21 read debug channel RECV buffer
85 #define OS_IE_POWERMAN      (1UL << REG_OS_IE_PM_SHIFT)         // 22 Power Management IC
86 #define OS_IE_SPI           (1UL << REG_OS_IE_SPI_SHIFT)        // 23 SPI data transfer
87 #define OS_IE_WIRELESS      (1UL << REG_OS_IE_WL_SHIFT)         // 24 Wireless module
88 #define OS_IE_DEBUG_SEND    (1UL << REG_OS_IE_DWE_SHIFT)        // 25 write debug channel SEND buffer
89 #define OS_IE_CARD_B_DATA   (1UL << REG_OS_IE_MCB_SHIFT)        // 26 card(B) data transfer finished
90 #define OS_IE_CARD_B_IREQ   (1UL << REG_OS_IE_MIB_SHIFT)        // 27 card(B) IREQ
91 #define OS_IE_NDMA0         (1UL << REG_OS_IE_ND0_SHIFT)        // 28 new DMA0
92 #define OS_IE_NDMA1         (1UL << REG_OS_IE_ND1_SHIFT)        // 29 new DMA1
93 #define OS_IE_NDMA2         (1UL << REG_OS_IE_ND2_SHIFT)        // 30 new DMA2
94 #define OS_IE_NDMA3         (1UL << REG_OS_IE_ND3_SHIFT)        // 31 new DMA3
95 #endif
96 
97 #ifdef SDK_ARM7
98 // for IE2
99 // bit 3, 15 are not used
100 #define OS_IE_GPIO18_0      (1UL << REG_OS_IE2_GPIO18_0_SHIFT)  //  0 GPIO18[0]
101 #define OS_IE_GPIO18_1      (1UL << REG_OS_IE2_GPIO18_1_SHIFT)  //  1 GPIO18[1]
102 #define OS_IE_GPIO18_2      (1UL << REG_OS_IE2_GPIO18_2_SHIFT)  //  2 GPIO18[2]
103 #define OS_IE_GPIO33_0      (1UL << REG_OS_IE2_GPIO33_0_SHIFT)  //  4 GPIO33[0]
104 #define OS_IE_GPIO33_1      (1UL << REG_OS_IE2_GPIO33_1_SHIFT)  //  5 GPIO33[1]
105 #define OS_IE_GPIO33_2      (1UL << REG_OS_IE2_GPIO33_2_SHIFT)  //  6 GPIO33[2]
106 #define OS_IE_GPIO33_3      (1UL << REG_OS_IE2_GPIO33_3_SHIFT)  //  7 GPIO33[3]
107 #define OS_IE_SD1           (1UL << REG_OS_IE2_SD1_SHIFT)       //  8 SD card 1
108 #define OS_IE_SD1ASYNC      (1UL << REG_OS_IE2_SD1A_SHIFT)      //  9 SDIO card 1 async
109 #define OS_IE_SD2           (1UL << REG_OS_IE2_SD2_SHIFT)       // 10 SD card 2
110 #define OS_IE_SD2ASYNC      (1UL << REG_OS_IE2_SD2A_SHIFT)      // 11 SDIO card 2 async
111 #define OS_IE_AES           (1UL << REG_OS_IE2_AES_SHIFT)       // 12 AES process finished
112 #define OS_IE_I2C           (1UL << REG_OS_IE2_I2C_SHIFT)       // 13 I2C transfer finished
113 #define OS_IE_MIC           (1UL << REG_OS_IE2_MIC_SHIFT)       // 14 MIC
114 
115 // Aliases to SUBP->MAINP
116 #define OS_IE_MAINP             OS_IE_SUBP
117 #define OS_IE_MPFIFO_SEND       OS_IE_SPFIFO_SEND
118 #define OS_IE_MPFIFO_RECV       OS_IE_SPFIFO_RECV
119 #define REG_OS_IE_A9_SHIFT      REG_OS_IE_A7_SHIFT
120 #endif // SDK_ARM7
121 
122 // Aliases to common name
123 #define OS_IE_FIFO_SEND         OS_IE_SPFIFO_SEND
124 #define OS_IE_FIFO_RECV         OS_IE_SPFIFO_RECV
125 
126 // number of irq factor
127 #ifdef SDK_ARM9
128 #define OS_IRQ_TABLE_MAX    			32
129 #else
130 #define OS_IRQ_TABLE_MAX    			32
131 #define OS_IRQ_TABLE2_MAX				15
132 #endif
133 
134 // all mask
135 #ifdef SDK_ARM9
136 #define OS_IE_MASK_ALL                  ((OSIrqMask)((1<<OS_IRQ_TABLE_MAX)-1))
137 #else
138 #define OS_IE_MASK_ALL                  ((OSIrqMask)((1<<OS_IRQ_TABLE_MAX)-1))
139 #define OS_IE2_MASK_ALL                 ((OSIrqMask)((1<<OS_IRQ_TABLE2_MAX)-1))
140 #endif
141 
142 //---- These may be able to use on TWL mode.
143 // Dummy irq check flag for user own use
144 #define OS_IE_USER_FLAG0_SHIFT  		31
145 #define OS_IE_USER_FLAG1_SHIFT  		30
146 #define OS_IE_USER_FLAG0        		(1UL << OS_IE_USER_FLAG0_SHIFT) // user 0
147 #define OS_IE_USER_FLAG1        		(1UL << OS_IE_USER_FLAG1_SHIFT) // user 1
148 
149 
150 //---- used for internal functions
151 #define OSi_IRQCALLBACK_NO_DMA0    		0
152 #define OSi_IRQCALLBACK_NO_DMA1    		1
153 #define OSi_IRQCALLBACK_NO_DMA2    		2
154 #define OSi_IRQCALLBACK_NO_DMA3    		3
155 #define OSi_IRQCALLBACK_NO_NDMA0    	4
156 #define OSi_IRQCALLBACK_NO_NDMA1    	5
157 #define OSi_IRQCALLBACK_NO_NDMA2    	6
158 #define OSi_IRQCALLBACK_NO_NDMA3    	7
159 #define OSi_IRQCALLBACK_NO_TIMER0  		8
160 #define OSi_IRQCALLBACK_NO_TIMER1  		9
161 #define OSi_IRQCALLBACK_NO_TIMER2  		10
162 #define OSi_IRQCALLBACK_NO_TIMER3  		11
163 #ifdef SDK_ARM7
164 #define OSi_IRQCALLBACK_NO_VBLANK  		12
165 #endif
166 #ifdef SDK_ARM9
167 #define OSi_IRQCALLBACK_NUM       		(11+1)
168 #else
169 #define OSi_IRQCALLBACK_NUM       		(12+1)
170 #endif
171 
172 //----------------------------------------------------------------
173 #define OS_IRQ_MAIN_BUFFER_SIZE         (0x200)
174 
175 
176 //---- interrupt handler type
177 typedef void (*OSIrqFunction) (void);
178 
179 //---- for irq callback (internal use)
180 typedef struct
181 {
182     void    (*func) (void *);
183     u32     enable;
184     void   *arg;
185 }
186 OSIrqCallbackInfo;
187 
188 //---- irq factor type define
189 #ifndef OSi_OSIRQMASK_DEFINED
190 typedef u32 OSIrqMask;
191 #define OSi_OSIRQMASK_DEFINED
192 #endif
193 
194 //---- table of irq functions
195 extern OSIrqFunction OS_IRQTable[];
196 #ifdef SDK_ARM7
197 extern OSIrqFunction OS_IRQTable2[];
198 #endif
199 
200 //---- for DMA, TIMER, VBLANK(arm7) interrupt */
201 extern OSIrqCallbackInfo OSi_IrqCallbackInfo[OSi_IRQCALLBACK_NUM];
202 
203 
204 void    OS_IrqDummy(void);
205 void    OS_IrqHandler(void);
206 asm void OS_BreakIrqHandler(void);
207 asm void    OS_IrqHandler_ThreadSwitch(void);
208 
209 //================================================================================
210 //              IRQ MASTER ENABLE
211 //================================================================================
212 /*---------------------------------------------------------------------------*
213   Name:         OS_EnableIrq
214 
215   Description:  enable master enable
216 
217   Arguments:    None
218 
219   Returns:      previous state of master enable.
220                 OS_IME_ENABLE or OS_IME_DISABLE.
221  *---------------------------------------------------------------------------*/
OS_EnableIrq(void)222 static inline BOOL OS_EnableIrq(void)
223 {
224     u16     prep = reg_OS_IME;
225     reg_OS_IME = OS_IME_ENABLE;
226     return (BOOL)prep;
227 }
228 
229 /*---------------------------------------------------------------------------*
230   Name:         OS_DisableIrq
231 
232   Description:  disable master enable
233 
234   Arguments:    None
235 
236   Returns:      previous status of master enable.
237                 OS_IME_ENABLE or OS_IME_DISABLE.
238  *---------------------------------------------------------------------------*/
OS_DisableIrq(void)239 static inline BOOL OS_DisableIrq(void)
240 {
241     u16     prep = reg_OS_IME;
242     reg_OS_IME = OS_IME_DISABLE;
243     return (BOOL)prep;
244 }
245 
246 /*---------------------------------------------------------------------------*
247   Name:         OS_RestoreIrq
248 
249   Description:  set master enable.
250                 this function is mainly used for restore previous state
251                 from OS_EnableIrq() or OS_DisableIrq().
252 
253   Arguments:    enable    OS_IME_ENABLE or OS_IME_DISABLE
254 
255   Returns:      previous state of master enable
256 
257  *---------------------------------------------------------------------------*/
OS_RestoreIrq(BOOL enable)258 static inline BOOL OS_RestoreIrq(BOOL enable)
259 {
260     u16     prep = reg_OS_IME;
261     reg_OS_IME = (u16)enable;
262     return (BOOL)prep;
263 }
264 
265 /*---------------------------------------------------------------------------*
266   Name:         OS_GetIrq
267 
268   Description:  get master enable.
269 
270   Arguments:    None
271 
272   Returns:      status of master enable.
273                 OS_IME_ENABLE or OS_IME_DISABLE.
274 
275  *---------------------------------------------------------------------------*/
OS_GetIrq(void)276 static inline BOOL OS_GetIrq(void)
277 {
278     return (BOOL)reg_OS_IME;
279 }
280 
281 
282 //================================================================================
283 //              IRQ FACTORS
284 //================================================================================
285 /*---------------------------------------------------------------------------*
286   Name:         OS_SetIrqMask
287 
288   Description:  set irq factor
289 
290   Arguments:    intr        irq factor
291 
292   Returns:      previous factors
293  *---------------------------------------------------------------------------*/
294 OSIrqMask OS_SetIrqMask(OSIrqMask intr);
295 #ifdef SDK_ARM7
296 OSIrqMask OS_SetIrqMaskEx(OSIrqMask intr);
297 #endif
298 
299 /*---------------------------------------------------------------------------*
300   Name:         OS_GetIrqMask
301 
302   Description:  get irq factor
303 
304   Arguments:    None
305 
306   Returns:      irq factor which is set now
307  *---------------------------------------------------------------------------*/
OS_GetIrqMask(void)308 static inline OSIrqMask OS_GetIrqMask(void)
309 {
310     return reg_OS_IE;
311 }
312 
313 /*---------------------------------------------------------------------------*
314   Name:         OS_EnableIrqMask
315 
316   Description:  set specified irq factor
317 
318   Arguments:    intr        irq factor
319 
320   Returns:      previous factors
321  *---------------------------------------------------------------------------*/
322 OSIrqMask OS_EnableIrqMask(OSIrqMask intr);
323 #ifdef SDK_ARM7
324 OSIrqMask OS_EnableIrqMaskEx(OSIrqMask intr);
325 #endif
326 
327 /*---------------------------------------------------------------------------*
328   Name:         OS_DisableIrqMask
329 
330   Description:  unset specified irq factor
331 
332   Arguments:    intr        irq factor
333 
334   Returns:      previous factors
335  *---------------------------------------------------------------------------*/
336 OSIrqMask OS_DisableIrqMask(OSIrqMask intr);
337 #ifdef SDK_ARM7
338 OSIrqMask OS_DisableIrqMaskEx(OSIrqMask intr);
339 #endif
340 
341 //================================================================================
342 //              IF
343 //================================================================================
344 /*---------------------------------------------------------------------------*
345   Name:         OS_ResetRequestIrqMask
346 
347   Description:  reset IF bit
348                 (setting bit causes to clear bit for interrupt)
349 
350   Arguments:    intr        irq factor
351 
352   Returns:      previous factors
353  *---------------------------------------------------------------------------*/
354 OSIrqMask OS_ResetRequestIrqMask(OSIrqMask intr);
355 #ifdef SDK_ARM7
356 OSIrqMask OS_ResetRequestIrqMaskEx(OSIrqMask intr);
357 #endif
358 
359 /*---------------------------------------------------------------------------*
360   Name:         OS_GetReuestIrqMask
361 
362   Description:  get IF bit
363 
364   Arguments:    None
365 
366   Returns:      value of IF
367  *---------------------------------------------------------------------------*/
OS_GetRequestIrqMask(void)368 static inline OSIrqMask OS_GetRequestIrqMask(void)
369 {
370     return reg_OS_IF;
371 }
372 
373 //================================================================================
374 //              IRQ HANDLER
375 //================================================================================
376 /*---------------------------------------------------------------------------*
377   Name:         OS_InitIrqTable
378 
379   Description:  initialize irq table
380 
381   Arguments:    None
382 
383   Returns:      None
384  *---------------------------------------------------------------------------*/
385 void    OS_InitIrqTable(void);
386 
387 /*---------------------------------------------------------------------------*
388   Name:         OS_SetIrqFunction
389 
390   Description:  set irq handler for specified interrupt
391 
392   Arguments:    intrBit    irq factor
393                 function   irq handler for specified interrupt
394 
395   Returns:      None
396  *---------------------------------------------------------------------------*/
397 void    OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function);
398 #ifdef SDK_ARM7
399 void OS_SetIrqFunctionEx(OSIrqMask intrBit, OSIrqFunction function);
400 #endif
401 
402 /*---------------------------------------------------------------------------*
403   Name:         OS_GetIrqFunction
404 
405   Description:  get irq handler for specified interrupt
406 
407   Arguments:    intrBit    irq factor
408 
409   Returns:      irq handler for specified interrupt
410  *---------------------------------------------------------------------------*/
411 OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit);
412 #ifdef SDK_ARM7
413 OSIrqFunction OS_GetIrqFunctionEx(OSIrqMask intrBit);
414 #endif
415 
416 //================================================================================
417 //              IRQ CHEKE BUFFER
418 //================================================================================
419 /*---------------------------------------------------------------------------*
420   Name:         OS_SetIrqCheckFlag
421 
422   Description:  set irq flag to check being called
423 
424   Arguments:    irq factors to be set
425 
426   Returns:      None
427  *---------------------------------------------------------------------------*/
OS_SetIrqCheckFlag(OSIrqMask intr)428 static inline void OS_SetIrqCheckFlag(OSIrqMask intr)
429 {
430     *(vu32 *)HW_INTR_CHECK_BUF |= (u32)intr;
431 }
432 #ifdef SDK_ARM7
OS_SetIrqCheckFlagEx(OSIrqMask intr)433 static inline void OS_SetIrqCheckFlagEx(OSIrqMask intr)
434 {
435     *(vu32 *)HW_INTR_CHECK2_BUF |= (u32)intr;
436 }
437 #endif
438 
439 /*---------------------------------------------------------------------------*
440   Name:         OS_ClearIrqCheckFlag
441 
442   Description:  clear irq flag stored in HW_INTR_CHECK_BUF
443 
444   Arguments:    irq factors to be cleared
445 
446   Returns:      None
447  *---------------------------------------------------------------------------*/
OS_ClearIrqCheckFlag(OSIrqMask intr)448 static inline void OS_ClearIrqCheckFlag(OSIrqMask intr)
449 {
450     *(vu32 *)HW_INTR_CHECK_BUF &= (u32)~intr;
451 }
452 #ifdef SDK_ARM7
OS_ClearIrqCheckFlagEx(OSIrqMask intr)453 static inline void OS_ClearIrqCheckFlagEx(OSIrqMask intr)
454 {
455     *(vu32 *)HW_INTR_CHECK2_BUF &= (u32)~intr;
456 }
457 #endif
458 
459 /*---------------------------------------------------------------------------*
460   Name:         OS_GetIrqCheckFlag
461 
462   Description:  get irq factors stored in HW_INTR_CHECK_BUF
463 
464   Arguments:    None
465 
466   Returns:      irq flags factors in HW_INTR_CHECK_BUG
467  *---------------------------------------------------------------------------*/
OS_GetIrqCheckFlag(void)468 static inline volatile OSIrqMask OS_GetIrqCheckFlag(void)
469 {
470     return *(volatile OSIrqMask *)HW_INTR_CHECK_BUF;
471 }
472 #ifdef SDK_ARM7
OS_GetIrqCheckFlagEx(void)473 static inline volatile OSIrqMask OS_GetIrqCheckFlagEx(void)
474 {
475     return *(volatile OSIrqMask *)HW_INTR_CHECK2_BUF;
476 }
477 #endif
478 
479 
480 //================================================================================
481 //              WAIT IRQ
482 //================================================================================
483 /*---------------------------------------------------------------------------*
484   Name:         OS_WaitIrq
485 
486   Description:  wait specified interrupt
487                 the difference between OS_WaitIrq and OS_WaitInterrupt,
488                 in waiting interrupt
489                 OS_WaitIrq does switch thread,
490                 OS_WaitInterrupt doesn't switch thread.
491                 OS_WaitIrq wait by using OS_SleepThread() with threadQueue,
492                 OS_WaitInterrupt wait by using OS_Halt().
493                 if SDK_NO_THREAD defined, 2 functions become same.
494 
495   Arguments:    clear       TRUE if want to clear interrupt flag before wait
496                             FALSE if not
497                 irqFlags    bit of interrupts to wait for
498 
499   Returns:      None
500  *---------------------------------------------------------------------------*/
501 void    OS_WaitIrq(BOOL clear, OSIrqMask irqFlags);
502 #ifdef SDK_ARM7
503 void    OS_WaitIrqEx(BOOL clear, OSIrqMask irqFlags);
504 #endif
505 
506 /*---------------------------------------------------------------------------*
507   Name:         OS_WaitAnyIrq
508 
509   Description:  wait any interrupt
510 
511   Arguments:    None
512 
513   Returns:      None
514  *---------------------------------------------------------------------------*/
515 void    OS_WaitAnyIrq(void);
516 #ifdef SDK_ARM7
517 void    OS_WaitAnyIrqEx(void);
518 #endif
519 
520 
521 //================================================================================
522 //              VBLANK COUNTER
523 //================================================================================
524 /*---------------------------------------------------------------------------*
525   Name:         OS_GetVBlankCount
526 
527   Description:  get VBlankCount
528 
529   Arguments:    None
530 
531   Returns:      VBlankCount
532  *---------------------------------------------------------------------------*/
OS_GetVBlankCount(void)533 static inline vu32 OS_GetVBlankCount(void)
534 {
535     return *(vu32 *)HW_VBLANK_COUNT_BUF;
536 }
537 
538 /*---------------------------------------------------------------------------*
539   Name:         OSi_SetVBlankCount
540 
541   Description:  set VBlankCount
542                 *** internal function. don't use this.
543 
544   Arguments:    count : VBlankCount
545 
546   Returns:      None
547  *---------------------------------------------------------------------------*/
OSi_SetVBlankCount(u32 count)548 static inline void OSi_SetVBlankCount(u32 count)
549 {
550     *(u32 *)HW_VBLANK_COUNT_BUF = count;
551 }
552 
553 //================================================================================
554 //              IRQ STACK CHECKER
555 //================================================================================
556 /*---------------------------------------------------------------------------*
557   Name:         OS_SetIrqStackWarningOffset
558 
559   Description:  Set warning level for irq stack checker
560 
561   Arguments:    offset     offset from stack top. must be multiple of 4
562 
563   Returns:      None
564  *---------------------------------------------------------------------------*/
565 extern void OS_SetIrqStackWarningOffset(u32 offset);
566 
567 /*---------------------------------------------------------------------------*
568   Name:         OS_GetIrqStackStatus
569 
570   Description:  check irq stack. check each CheckNUM.
571                 return result.
572 
573   Arguments:    None
574 
575   Returns:      0 (OS_STACK_NO_ERROR)        no error
576                 OS_STACK_OVERFLOW            overflow
577                 OS_STACK_ABOUT_TO_OVERFLOW   about to overflow
578                 OS_STACK_UNDERFLOW           underflow
579  *---------------------------------------------------------------------------*/
580 extern OSStackStatus OS_GetIrqStackStatus(void);
581 
582 /*---------------------------------------------------------------------------*
583   Name:         OS_SetIrqStackChecker
584 
585   Description:  set irq stack check number to irq stack
586 
587   Arguments:    None
588 
589   Returns:      None
590  *---------------------------------------------------------------------------*/
591 extern void OS_SetIrqStackChecker(void);
592 
593 /*---------------------------------------------------------------------------*
594   Name:         OS_CheckIrqStack
595 
596   Description:  check irq stack. check each CheckNum.
597                 if changed, display warning and halt.
598 
599   Arguments:    None
600 
601   Returns:      None.
602                 ( if error occurred, never return )
603  *---------------------------------------------------------------------------*/
604 void    OSi_CheckIrqStack(char *file, int line);
605 #if !defined(SDK_FINALROM) && !defined(SDK_NO_MESSAGE)
606 #define  OS_CheckIrqStack()  OSi_CheckIrqStack( __FILE__, __LINE__ );
607 #else
608 #define  OS_CheckIrqStack()  ((void)0)
609 #endif
610 
611 
612 #ifdef __cplusplus
613 } /* extern "C" */
614 #endif
615 
616 #endif
617 /* SDK_TWL */
618 
619 /* TWL_OS_INTERRUPT_H_ */
620 #endif
621