1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - OS
3 File: os_event.c
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-09-17#$
14 $Rev: 8556 $
15 $Author: okubata_ryoma $
16 *---------------------------------------------------------------------------*/
17 #ifdef SDK_TWL
18 #include <twl/memorymap.h>
19 #else
20 #include <nitro/memorymap.h>
21 #endif
22
23 #include <nitro/os.h>
24
25
26 #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
27 #include <nitro/itcm_begin.h>
28 #endif
29
30 /*---------------------------------------------------------------------------*
31 Name: OS_InitEvent
32
33 Description: initialize event struct
34
35 Arguments: event : pointer to event struct
36
37 Returns: none
38 *---------------------------------------------------------------------------*/
OS_InitEvent(OSEvent * event)39 void OS_InitEvent( OSEvent *event )
40 {
41 OS_InitThreadQueue( &event->queue );
42 event->flag = 0;
43 }
44
45 /*---------------------------------------------------------------------------*
46 Name: OS_WaitEvent
47
48 Description: sleep thread and wait event
49 if event is NULL, just sleep.
50
51 Arguments: event : pointer to event struct
52 pattern : event pattern
53 mode : event mode
54 OS_EVENT_MODE_AND ... wait for all event bit
55 OS_EVENT_MODE_OR ... wait for any event bit
56
57 Returns: none
58 *---------------------------------------------------------------------------*/
OS_WaitEvent(OSEvent * event,u32 pattern,OSEventMode mode)59 u32 OS_WaitEvent(OSEvent* event, u32 pattern, OSEventMode mode )
60 {
61 return OS_WaitEventEx(event, pattern, mode, 0);
62 }
63
64 /*---------------------------------------------------------------------------*
65 Name: OS_WaitEventEx
66
67 Description: sleep thread and wait event
68 if event is NULL, just sleep.
69
70 Arguments: event : pointer to event struct
71 pattern : event pattern
72 mode : event mode
73 OS_EVENT_MODE_AND ... wait for all event bit
74 OS_EVENT_MODE_OR ... wait for any event bit
75 clearBit : clear bits (in case of the end of waiting)
76
77 Returns: none
78 *---------------------------------------------------------------------------*/
OS_WaitEventEx(OSEvent * event,u32 pattern,OSEventMode mode,u32 clearBit)79 u32 OS_WaitEventEx(OSEvent* event, u32 pattern, OSEventMode mode, u32 clearBit )
80 {
81 u32 retval = 0;
82 OSIntrMode enable = OS_DisableInterrupts();
83
84 SDK_ASSERT( event );
85
86 switch( mode )
87 {
88 case OS_EVENT_MODE_AND:
89 while( (event->flag & pattern) != pattern )
90 {
91 OS_SleepThread(&event->queue);
92 }
93 retval = event->flag;
94 break;
95 case OS_EVENT_MODE_OR:
96 while( (event->flag & pattern) == 0 )
97 {
98 OS_SleepThread(&event->queue);
99 }
100 retval = event->flag;
101 break;
102 }
103
104 //---- clear flag
105 if ( retval )
106 {
107 event->flag &= ~clearBit;
108 }
109
110 (void)OS_RestoreInterrupts(enable);
111 return retval;
112 }
113
114 /*---------------------------------------------------------------------------*
115 Name: OS_SignalEvent
116
117 Description: set event bit and wakeup thread.
118 if setPattern == 0, do nothing
119
120 Arguments: event : pointer to event struct
121 setPattern : bit pattern to set
122
123 Returns: none
124 *---------------------------------------------------------------------------*/
OS_SignalEvent(OSEvent * event,u32 setPattern)125 void OS_SignalEvent(OSEvent* event, u32 setPattern)
126 {
127 OSIntrMode enable = OS_DisableInterrupts();
128 SDK_ASSERT( event );
129
130 if ( setPattern )
131 {
132 event->flag |= setPattern;
133 OS_WakeupThread( &event->queue );
134 }
135
136 (void)OS_RestoreInterrupts(enable);
137 }
138
139 /*---------------------------------------------------------------------------*
140 Name: OS_ClearAllEvent
141
142 Description: clear all event bits
143
144 Arguments: event : pointer to event struct
145
146 Returns: none
147 *---------------------------------------------------------------------------*/
OS_ClearAllEvent(OSEvent * event)148 void OS_ClearAllEvent(OSEvent* event)
149 {
150 SDK_ASSERT( event );
151 event->flag = 0;
152 }
153
154 /*---------------------------------------------------------------------------*
155 Name: OS_ClearEvent
156
157 Description: clear specified event bits
158
159 Arguments: event : pointer to event struct
160 clearBit : clear bits
161
162 Returns: none
163 *---------------------------------------------------------------------------*/
OS_ClearEvent(OSEvent * event,u32 clearBit)164 void OS_ClearEvent(OSEvent* event, u32 clearBit)
165 {
166 OSIntrMode enable = OS_DisableInterrupts();
167 SDK_ASSERT( event );
168
169 event->flag &= ~clearBit;
170
171 (void)OS_RestoreInterrupts(enable);
172 }
173
174 /*---------------------------------------------------------------------------*
175 Name: OS_PollEvent
176
177 Description: poll event struct if condition matches
178
179 Arguments: event : waiting condition
180 pattern : event pattern
181 mode : event mode
182 OS_EVENT_MODE_AND ... wait for all event bit
183 OS_EVENT_MODE_OR ... wait for any event bit
184
185 Returns: not 0 ... matched. return the event flag.
186 0 ... not match.
187 *---------------------------------------------------------------------------*/
OS_PollEvent(OSEvent * event,u32 pattern,OSEventMode mode)188 u32 OS_PollEvent(OSEvent* event, u32 pattern, OSEventMode mode )
189 {
190 return OS_PollEventEx( event, pattern, mode, 0 );
191 }
192
193 /*---------------------------------------------------------------------------*
194 Name: OS_PollEventEx
195
196 Description: poll event struct if condition matches
197
198 Arguments: event : pointer to event struct
199 pattern : event pattern
200 mode : event mode
201 OS_EVENT_MODE_AND ... wait for all event bit
202 OS_EVENT_MODE_OR ... wait for any event bit
203 clearBit : clear bits (in case of matching)
204
205 Returns: not 0 ... matched. return the event flag.
206 0 ... not match.
207 *---------------------------------------------------------------------------*/
OS_PollEventEx(OSEvent * event,u32 pattern,OSEventMode mode,u32 clearBit)208 u32 OS_PollEventEx(OSEvent* event, u32 pattern, OSEventMode mode, u32 clearBit )
209 {
210 u32 retval = 0;
211 OSIntrMode enable = OS_DisableInterrupts();
212
213 SDK_ASSERT( event );
214
215 switch( mode )
216 {
217 case OS_EVENT_MODE_AND:
218 if ( (event->flag & pattern) == pattern )
219 {
220 retval = event->flag;
221 }
222 break;
223 case OS_EVENT_MODE_OR:
224 if ( event->flag & pattern )
225 {
226 retval = event->flag;
227 }
228 break;
229 }
230
231 //---- clear flag
232 if ( retval )
233 {
234 event->flag &= ~clearBit;
235 }
236
237 (void)OS_RestoreInterrupts(enable);
238 return retval;
239 }
240
241 #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
242 #include <nitro/itcm_end.h>
243 #endif
244