1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - OS - include
3   File:     system.h
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 #ifndef NITRO_OS_SYSTEM_H_
18 #define NITRO_OS_SYSTEM_H_
19 
20 #ifndef SDK_ASM
21 #include  <nitro/types.h>
22 #include  <nitro/os/common/systemCall.h>
23 
24 #include  <nitro/os/common/tick.h>
25 #include  <nitro/os/common/thread.h>
26 #include  <nitro/os/common/alarm.h>
27 #include  <nitro/os/common/arena.h>
28 #include  <nitro/os/common/valarm.h>
29 #endif
30 
31 #include  <nitro/hw/common/armArch.h>
32 
33 #ifdef SDK_TWL
34 #include  <twl/os/common/system.h>
35 #endif
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 //----------------------------------------------------------------------------
42 #ifndef SDK_ASM
43 #define		OS_EXIT_STRING_1		"*** Exit Nitro/Twl program (status="
44 #define		OS_EXIT_STRING_2		"%d).\n"
45 #define		OS_EXIT_STRING			OS_EXIT_STRING_1 OS_EXIT_STRING_2
46 
47 typedef enum
48 {
49     OS_PROCMODE_USER = HW_PSR_USER_MODE,
50     OS_PROCMODE_FIQ = HW_PSR_FIQ_MODE,
51     OS_PROCMODE_IRQ = HW_PSR_IRQ_MODE,
52     OS_PROCMODE_SVC = HW_PSR_SVC_MODE,
53     OS_PROCMODE_ABORT = HW_PSR_ABORT_MODE,
54     OS_PROCMODE_UNDEF = HW_PSR_UNDEF_MODE,
55     OS_PROCMODE_SYS = HW_PSR_SYS_MODE
56 }
57 OSProcMode;
58 
59 
60 typedef enum
61 {
62     OS_INTRMODE_IRQ_DISABLE = HW_PSR_IRQ_DISABLE,
63     OS_INTRMODE_IRQ_ENABLE = 0
64 }
65 OSIntrMode_Irq;
66 
67 typedef enum
68 {
69     OS_INTRMODE_FIQ_DISABLE = HW_PSR_FIQ_DISABLE,
70     OS_INTRMODE_FIQ_ENABLE = 0
71 }
72 OSIntrMode_Fiq;
73 
74 typedef u32 OSIntrMode;
75 
76 #ifdef SDK_ARM9
77 typedef void (*OSTerminateCallback)(void*);
78 #endif
79 
80 //============================================================================
81 //          CONTROL INTERRUPT
82 //============================================================================
83 /*---------------------------------------------------------------------------*
84   Name:         OS_EnableInterrupts
85 
86   Description:  Set CPSR to enable irq interrupts
87 
88   Arguments:    None.
89 
90   Returns:      last state of HW_PSR_IRQ_DISABLE
91  *---------------------------------------------------------------------------*/
92 extern OSIntrMode OS_EnableInterrupts(void);
93 
94 /*---------------------------------------------------------------------------*
95   Name:         OS_DisableInterrupts
96 
97   Description:  Set CPSR to disable irq interrupts
98 
99   Arguments:    None.
100 
101   Returns:      last state of HW_PSR_IRQ_DISABLE
102  *---------------------------------------------------------------------------*/
103 extern OSIntrMode OS_DisableInterrupts(void);
104 
105 /*---------------------------------------------------------------------------*
106   Name:         OS_RestoreInterrupts
107 
108   Description:  Restore CPSR irq interrupt
109 
110   Arguments:    state of irq interrupt bit
111 
112   Returns:      last state of HW_PSR_IRQ_DISABLE
113  *---------------------------------------------------------------------------*/
114 extern OSIntrMode OS_RestoreInterrupts(OSIntrMode state);
115 
116 /*---------------------------------------------------------------------------*
117   Name:         OS_EnableInterrupts_IrqAndFiq
118 
119   Description:  Set CPSR to enable irq and fiq interrupts
120 
121   Arguments:    None.
122 
123   Returns:      last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
124  *---------------------------------------------------------------------------*/
125 extern OSIntrMode OS_EnableInterrupts_IrqAndFiq(void);
126 
127 /*---------------------------------------------------------------------------*
128   Name:         OS_DisableInterrupts_IrqAndFiq
129 
130   Description:  Set CPSR to disable irq and fiq interrupts
131 
132   Arguments:    None.
133 
134   Returns:      last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
135  *---------------------------------------------------------------------------*/
136 extern OSIntrMode OS_DisableInterrupts_IrqAndFiq(void);
137 
138 /*---------------------------------------------------------------------------*
139   Name:         OS_RestoreInterrupts_IrqAndFiq
140 
141   Description:  Restore CPSR irq and fiq interrupt
142 
143   Arguments:    state of irq and fiq interrupt bit
144 
145   Returns:      last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
146  *---------------------------------------------------------------------------*/
147 extern OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state);
148 
149 /*---------------------------------------------------------------------------*
150   Name:         OS_GetCpsrIrq
151 
152   Description:  Get current state of CPSR irq interrupt
153 
154   Arguments:    None
155 
156   Returns:      last state of HW_PSR_IRQ_DISABLE
157  *---------------------------------------------------------------------------*/
158 extern OSIntrMode_Irq OS_GetCpsrIrq(void);
159 
160 //============================================================================
161 //          PROCESSER MODE
162 //============================================================================
163 /*---------------------------------------------------------------------------*
164   Name:         OS_GetProcMode
165 
166   Description:  Get processor mode from CPSR
167 
168   Arguments:    None.
169 
170   Returns:      CPU processor mode (field 0x10-0x1f)
171  *---------------------------------------------------------------------------*/
172 extern OSProcMode OS_GetProcMode(void);
173 
174 
175 //============================================================================
176 //          TERMINATE and HALT
177 //============================================================================
178 /*---------------------------------------------------------------------------*
179   Name:         OS_Terminate
180 
181   Description:  finalize and terminate
182 
183   Arguments:    None
184 
185   Returns:      None
186  *---------------------------------------------------------------------------*/
187 extern void OS_Terminate(void);
188 
189 /*---------------------------------------------------------------------------*
190   Name:         OSi_TerminateCore
191 
192   Description:  Halt CPU and loop
193 
194   Arguments:    None
195 
196   Returns:      None
197  *---------------------------------------------------------------------------*/
198 extern void OSi_TerminateCore(void);
199 
200 #ifdef SDK_ARM9
201 /*---------------------------------------------------------------------------*
202   Name:         OSi_SetTerminateCallback
203 
204   Description:  set terminate callback
205                 (internal function. don't use)
206 
207   Arguments:    callback : callback
208                 arg      : callback argument
209 
210   Returns:      None
211  *---------------------------------------------------------------------------*/
212 extern void OSi_SetTerminateCallback( OSTerminateCallback callback, void* arg );
213 #endif
214 
215 /*---------------------------------------------------------------------------*
216   Name:         OS_Halt
217 
218   Description:  Halt CPU
219 
220   Arguments:    None
221 
222   Returns:      None
223  *---------------------------------------------------------------------------*/
224 #ifdef  SDK_ARM9
225 extern void OS_Halt(void);
226 #else
OS_Halt(void)227 static inline void OS_Halt(void)
228 {
229     SVC_Halt();
230 }
231 #endif
232 
233 /*---------------------------------------------------------------------------*
234   Name:         OS_Exit / OS_FExit
235 
236   Description:  Display exit string and Terminate.
237                 This is useful for 'loadrun' tool command.
238 
239   Arguments:    console : console to output string
240                 status  : exit status
241 
242   Returns:      --  (Never return)
243  *---------------------------------------------------------------------------*/
244 extern void OS_Exit(int status);
245 extern void OS_FExit(int console, int status);
246 
247 //============================================================================
248 //          WAIT
249 //============================================================================
250 /*---------------------------------------------------------------------------*
251   Name:         OS_SpinWaitCpuCycles
252 
253   Description:  Spin and Wait for specified CPU cycles at least
254 
255   Arguments:    cycles      waiting CPU cycle
256 
257   Returns:      None
258  *---------------------------------------------------------------------------*/
259 extern void OS_SpinWaitCpuCycles(u32 cycle);
260 
261 /*---------------------------------------------------------------------------*
262   Name:         OS_SpinWaitSysCycles
263 
264   Description:  Spin and Wait for specified SYSTEM cycles at least
265 
266   Arguments:    cycles      waiting SYSTEM cycle
267 
268   Returns:      None
269  *---------------------------------------------------------------------------*/
270 extern void OS_SpinWaitSysCycles(u32 cycle);
271 
272 /*---------------------------------------------------------------------------*
273   Name:         OS_SpinWait
274 
275   Description:  Spin and Wait for specified CPU cycles at least
276 
277   Arguments:    cycles      waiting SYSTEM/2 cycle
278 
279   Returns:      None
280  *---------------------------------------------------------------------------*/
281 #ifdef SDK_ARM9
282 #define OS_SpinWait(cycle)		OS_SpinWaitSysCycles((cycle)>>1)
283 #else
284 #define OS_SpinWait(cycle)		OS_SpinWaitSysCycles(cycle)
285 #endif
286 
287 /*---------------------------------------------------------------------------*
288   Name:         OS_WaitInterrupt
289 
290   Description:  wait specified interrupt
291                 the difference between OS_WaitIrq and OS_WaitInterrupt,
292                 in waiting interrupt
293                 OS_WaitIrq does switch thread,
294                 OS_WaitInterrupt doesn't switch thread.
295                 OS_WaitIrq wait by using OS_SleepThread() with threadQueue,
296                 OS_WaitInterrupt wait by using OS_Halt().
297                 if SDK_NO_THREAD defined, 2 functions become same.
298 
299   Arguments:    clear      TRUE if want to clear interrupt flag before wait.
300                            FALSE if not.
301                 irqFlags   bit of interrupts to wait for
302 
303   Returns:      None
304  *---------------------------------------------------------------------------*/
305 #ifndef OSi_OSIRQMASK_DEFINED
306 typedef u32 OSIrqMask;
307 #define OSi_OSIRQMASK_DEFINED
308 #endif
309 extern void OS_WaitInterrupt(BOOL clear, OSIrqMask irqFlags);
310 
311 /*---------------------------------------------------------------------------*
312   Name:         OS_WaitVBlankIntr
313 
314   Description:  wait till vblank interrupt occurred.
315 				the difference between SVC_WaitVBlankIntr and OS_WaitVBlankIntr is:
316                 OS_WaitVBlankIntr does switch thread,
317                 SVC_WaitVBlankIntr doesn't switch thread.
318 
319   Arguments:    None
320 
321   Returns:      None
322  *---------------------------------------------------------------------------*/
323 extern void OS_WaitVBlankIntr(void);
324 
325 
326 #endif /* SDK_ASM */
327 
328 #ifdef __cplusplus
329 } /* extern "C" */
330 #endif
331 
332 /*NITRO_OS_SYSTEM_H_*/
333 #endif
334