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