mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@282 b871894f-2f95-9b40-918c-086798483c85
245 lines
6.9 KiB
C
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
|