ctr_firmware/trunk/bootrom/build/libraries/os/common/os_event.c
(no author) 56c174c989 (shirait) イベント追加
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@282 b871894f-2f95-9b40-918c-086798483c85
2009-02-12 11:41:26 +00:00

245 lines
6.9 KiB
C

/*---------------------------------------------------------------------------*
Project: TwlSDK - OS
File: os_event.c
Copyright 2007-2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
/*
#ifdef SDK_TWL
#include <twl/memorymap.h>
#else
#include <nitro/memorymap.h>
#endif*/
#include <brom/os.h>
#if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
#include <nitro/itcm_begin.h>
#endif
/*---------------------------------------------------------------------------*
Name: OS_InitEvent
Description: initialize event struct
Arguments: event : pointer to event struct
Returns: none
*---------------------------------------------------------------------------*/
void osInitEvent( OSEvent *event )
{
osInitThreadQueue( &event->queue );
event->flag = 0;
}
/*---------------------------------------------------------------------------*
Name: osWaitEvent
Description: sleep thread and wait event
if event is NULL, just sleep.
Arguments: event : pointer to event struct
pattern : event pattern
mode : event mode
OS_EVENT_MODE_AND ... wait for all event bit
OS_EVENT_MODE_OR ... wait for any event bit
Returns: none
*---------------------------------------------------------------------------*/
u32 osWaitEvent(OSEvent* event, u32 pattern, OSEventMode mode )
{
return osWaitEventEx(event, pattern, mode, 0);
}
/*---------------------------------------------------------------------------*
Name: osWaitEventEx
Description: sleep thread and wait event
if event is NULL, just sleep.
Arguments: event : pointer to event struct
pattern : event pattern
mode : event mode
OS_EVENT_MODE_AND ... wait for all event bit
OS_EVENT_MODE_OR ... wait for any event bit
clearBit : clear bits (in case of the end of waiting)
Returns: none
*---------------------------------------------------------------------------*/
u32 osWaitEventEx(OSEvent* event, u32 pattern, OSEventMode mode, u32 clearBit )
{
u32 retval = 0;
OSIntrMode enable = osDisableInterrupts();
SDK_ASSERT( event );
switch( mode )
{
case OS_EVENT_MODE_AND:
while( (event->flag & pattern) != pattern )
{
osSleepThread(&event->queue);
}
retval = event->flag;
break;
case OS_EVENT_MODE_OR:
while( (event->flag & pattern) == 0 )
{
osSleepThread(&event->queue);
}
retval = event->flag;
break;
}
//---- clear flag
if ( retval )
{
event->flag &= ~clearBit;
}
(void)osRestoreInterrupts(enable);
return retval;
}
/*---------------------------------------------------------------------------*
Name: osSignalEvent
Description: set event bit and wakeup thread.
if setPattern == 0, do nothing
Arguments: event : pointer to event struct
setPattern : bit pattern to set
Returns: none
*---------------------------------------------------------------------------*/
void osSignalEvent(OSEvent* event, u32 setPattern)
{
OSIntrMode enable = osDisableInterrupts();
SDK_ASSERT( event );
if ( setPattern )
{
event->flag |= setPattern;
osWakeupThread( &event->queue );
}
(void)osRestoreInterrupts(enable);
}
/*---------------------------------------------------------------------------*
Name: osClearAllEvent
Description: clear all event bits
Arguments: event : pointer to event struct
Returns: none
*---------------------------------------------------------------------------*/
void osClearAllEvent(OSEvent* event)
{
SDK_ASSERT( event );
event->flag = 0;
}
/*---------------------------------------------------------------------------*
Name: osClearEvent
Description: clear specified event bits
Arguments: event : pointer to event struct
clearBit : clear bits
Returns: none
*---------------------------------------------------------------------------*/
void osClearEvent(OSEvent* event, u32 clearBit)
{
OSIntrMode enable = osDisableInterrupts();
SDK_ASSERT( event );
event->flag &= ~clearBit;
(void)osRestoreInterrupts(enable);
}
/*---------------------------------------------------------------------------*
Name: osPollEvent
Description: poll event struct if condition matches
Arguments: event : waiting condition
pattern : event pattern
mode : event mode
OS_EVENT_MODE_AND ... wait for all event bit
OS_EVENT_MODE_OR ... wait for any event bit
Returns: not 0 ... matched. return the event flag.
0 ... not match.
*---------------------------------------------------------------------------*/
u32 osPollEvent(OSEvent* event, u32 pattern, OSEventMode mode )
{
return osPollEventEx( event, pattern, mode, 0 );
}
/*---------------------------------------------------------------------------*
Name: osPollEventEx
Description: poll event struct if condition matches
Arguments: event : pointer to event struct
pattern : event pattern
mode : event mode
OS_EVENT_MODE_AND ... wait for all event bit
OS_EVENT_MODE_OR ... wait for any event bit
clearBit : clear bits (in case of matching)
Returns: not 0 ... matched. return the event flag.
0 ... not match.
*---------------------------------------------------------------------------*/
u32 osPollEventEx(OSEvent* event, u32 pattern, OSEventMode mode, u32 clearBit )
{
u32 retval = 0;
OSIntrMode enable = osDisableInterrupts();
SDK_ASSERT( event );
switch( mode )
{
case OS_EVENT_MODE_AND:
if ( (event->flag & pattern) == pattern )
{
retval = event->flag;
}
break;
case OS_EVENT_MODE_OR:
if ( event->flag & pattern )
{
retval = event->flag;
}
break;
}
//---- clear flag
if ( retval )
{
event->flag &= ~clearBit;
}
(void)osRestoreInterrupts(enable);
return retval;
}
#if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
#include <nitro/itcm_end.h>
#endif