2014-06-24 14:51:05 +00:00
/*
* This file is subject to the terms of the GFX License . If a copy of
* the license was not distributed with this file , you can obtain one at :
*
2018-10-01 15:32:39 +00:00
* http : //ugfx.io/license.html
2014-06-24 14:51:05 +00:00
*/
2015-11-21 09:27:08 +00:00
# include "../../gfx.h"
2014-06-24 14:51:05 +00:00
# if GFX_USE_OS_ECOS
void _gosInit ( void )
{
2015-08-16 15:21:01 +00:00
# if !GFX_OS_NO_INIT
2018-02-27 07:44:21 +00:00
# error "GOS: Operating System initialization for eCos is not yet implemented in uGFX. Please set GFX_OS_NO_INIT to GFXON in your gfxconf.h"
2015-07-16 09:02:59 +00:00
# endif
# if !GFX_OS_INIT_NO_WARNING
2017-06-30 09:43:51 +00:00
# if GFX_COMPILER_WARNING_TYPE == GFX_COMPILER_WARNING_DIRECT
# warning "GOS: Operating System initialization has been turned off. Make sure you call cyg_scheduler_start() before gfxInit() in your application!"
# elif GFX_COMPILER_WARNING_TYPE == GFX_COMPILER_WARNING_MACRO
COMPILER_WARNING ( " GOS: Operating System initialization has been turned off. Make sure you call cyg_scheduler_start() before gfxInit() in your application! " )
# endif
2014-07-29 02:00:47 +00:00
# endif
2014-06-24 14:51:05 +00:00
}
2017-03-04 05:02:55 +00:00
void _gosPostInit ( void )
{
}
2014-06-24 14:51:05 +00:00
void _gosDeinit ( void )
{
/* ToDo */
}
2018-07-08 04:30:31 +00:00
void gfxSleepMilliseconds ( gDelay ms )
2014-06-24 14:51:05 +00:00
{
switch ( ms ) {
2018-07-08 05:15:15 +00:00
case gDelayNone : cyg_thread_yield ( ) ; return ;
case gDelayForever : cyg_thread_suspend ( cyg_thread_self ( ) ) ; return ;
2014-06-24 14:51:05 +00:00
default : cyg_thread_delay ( gfxMillisecondsToTicks ( ms ) ) ; return ;
}
}
2018-07-08 04:30:31 +00:00
void gfxSleepMicroseconds ( gDelay ms )
2014-06-24 14:51:05 +00:00
{
switch ( ms ) {
2018-07-08 05:15:15 +00:00
case gDelayNone : return ;
case gDelayForever : cyg_thread_suspend ( cyg_thread_self ( ) ) ; return ;
2014-06-24 14:51:05 +00:00
default : cyg_thread_delay ( gfxMillisecondsToTicks ( ms / 1000 ) ) ; return ;
}
}
2018-11-03 02:29:30 +00:00
void gfxSemInit ( gSem * psem , gSemcount val , gSemcount limit )
2014-06-24 14:51:05 +00:00
{
if ( val > limit )
val = limit ;
psem - > limit = limit ;
cyg_semaphore_init ( & psem - > sem , val ) ;
}
2018-11-03 02:29:30 +00:00
void gfxSemDestroy ( gSem * psem )
2014-06-24 14:51:05 +00:00
{
cyg_semaphore_destroy ( & psem - > sem ) ;
}
2018-11-03 02:29:30 +00:00
gBool gfxSemWait ( gSem * psem , gDelay ms )
2014-06-24 14:51:05 +00:00
{
switch ( ms ) {
2018-07-08 05:15:15 +00:00
case gDelayNone : return cyg_semaphore_trywait ( & psem - > sem ) ;
case gDelayForever : return cyg_semaphore_wait ( & psem - > sem ) ;
2014-06-24 14:51:05 +00:00
default : return cyg_semaphore_timed_wait ( & psem - > sem , gfxMillisecondsToTicks ( ms ) + cyg_current_time ( ) ) ;
}
}
2018-11-03 02:29:30 +00:00
gBool gfxSemWaitI ( gSem * psem )
2014-06-24 14:51:05 +00:00
{
return cyg_semaphore_trywait ( & psem - > sem ) ;
}
2018-11-03 02:29:30 +00:00
void gfxSemSignal ( gSem * psem )
2014-06-24 14:51:05 +00:00
{
2018-11-03 02:29:30 +00:00
if ( psem - > limit = = gSemMaxCount )
2014-06-24 14:51:05 +00:00
cyg_semaphore_post ( & psem - > sem ) ;
else {
cyg_scheduler_lock ( ) ;
2017-08-16 06:49:02 +00:00
if ( cyg_semaphore_peek ( & psem - > sem , & cnt ) < psem - > limit )
2014-06-24 14:51:05 +00:00
cyg_semaphore_post ( & psem - > sem ) ;
cyg_scheduler_unlock ( ) ;
}
}
2018-11-03 02:29:30 +00:00
void gfxSemSignalI ( gSem * psem )
2014-06-24 14:51:05 +00:00
{
2018-11-03 02:29:30 +00:00
if ( psem - > limit = = gSemMaxCount | | cyg_semaphore_peek ( & psem - > sem , & cnt ) < psem - > limit )
2014-06-24 14:51:05 +00:00
cyg_semaphore_post ( & psem - > sem ) ;
}
2018-11-03 02:29:30 +00:00
gThread gfxThreadCreate ( void * stackarea , gMemSize stacksz , gThreadpriority prio , GFX_THREAD_FUNCTION ( ( * fn ) , p ) , void * param )
2014-06-24 14:51:05 +00:00
{
2018-07-08 05:40:27 +00:00
gThread th ;
2014-06-24 14:51:05 +00:00
if ( ! stackarea ) {
if ( ! stacksz ) stacksz = CYGNUM_HAL_STACK_SIZE_TYPICAL ;
if ( ! ( stackarea = gfxAlloc ( stacksz + sizeof ( cyg_thread ) ) ) )
return 0 ;
}
if ( ! stacksz )
return 0 ;
cyg_thread_create ( prio , fn , param , " uGFX " , ( ( ( cyg_thread * ) stackarea ) + 1 ) , stacksz , & th , ( cyg_thread * ) stackarea ) ;
cyg_thread_resume ( th ) ;
return th ;
}
# endif /* GFX_USE_OS_ECOS */