2013-05-24 15:26:52 +00:00
/*
2013-06-15 11:37:22 +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 :
*
2013-07-21 20:20:37 +00:00
* http : //ugfx.org/license.html
2013-06-15 11:37:22 +00:00
*/
2013-05-24 15:26:52 +00:00
# include "gfx.h"
# if GFX_USE_OS_CHIBIOS
2013-07-20 11:57:01 +00:00
# include <string.h>
2014-04-18 11:20:50 +00:00
# if CH_KERNEL_MAJOR == 2
# if !CH_USE_MUTEXES
# error "GOS: CH_USE_MUTEXES must be defined in chconf.h"
# endif
# if !CH_USE_SEMAPHORES
# error "GOS: CH_USE_SEMAPHORES must be defined in chconf.h"
# endif
# elif CH_KERNEL_MAJOR == 3
# if !CH_CFG_USE_MUTEXES
2014-10-09 02:29:55 +00:00
# error "GOS: CH_CFG_USE_MUTEXES must be defined in chconf.h"
2014-04-18 11:20:50 +00:00
# endif
# if !CH_CFG_USE_SEMAPHORES
2014-10-09 02:29:55 +00:00
# error "GOS: CH_CFG_USE_SEMAPHORES must be defined in chconf.h"
2014-04-18 11:20:50 +00:00
# endif
2015-03-10 14:16:09 +00:00
# else
# error "GOS: Unsupported version of ChibiOS"
2013-05-24 15:26:52 +00:00
# endif
2014-02-02 18:24:43 +00:00
void _gosInit ( void )
{
2015-08-16 15:21:01 +00:00
# if !GFX_OS_NO_INIT
2014-07-29 02:00:47 +00:00
/* Don't Initialize if the user already has */
# if CH_KERNEL_MAJOR == 2
if ( ! chThdSelf ( ) ) {
halInit ( ) ;
chSysInit ( ) ;
}
# elif CH_KERNEL_MAJOR == 3
if ( ! chThdGetSelfX ( ) ) {
halInit ( ) ;
chSysInit ( ) ;
}
# endif
2015-07-16 09:02:59 +00:00
# elif !GFX_OS_INIT_NO_WARNING
2014-07-29 02:00:47 +00:00
# warning "GOS: Operating System initialization has been turned off. Make sure you call halInit() and chSysInit() before gfxInit() in your application!"
2014-04-18 11:20:50 +00:00
# endif
2013-05-24 15:26:52 +00:00
}
2014-02-02 18:24:43 +00:00
void _gosDeinit ( void )
{
/* ToDo */
}
2014-04-18 11:20:50 +00:00
void * gfxRealloc ( void * ptr , size_t oldsz , size_t newsz )
{
2013-07-20 11:57:01 +00:00
void * np ;
if ( newsz < = oldsz )
return ptr ;
np = gfxAlloc ( newsz ) ;
if ( ! np )
return 0 ;
if ( oldsz )
memcpy ( np , ptr , oldsz ) ;
return np ;
}
2014-04-18 11:20:50 +00:00
void gfxSleepMilliseconds ( delaytime_t ms )
{
2013-05-24 15:26:52 +00:00
switch ( ms ) {
2013-12-07 21:01:57 +00:00
case TIME_IMMEDIATE : chThdYield ( ) ; return ;
case TIME_INFINITE : chThdSleep ( TIME_INFINITE ) ; return ;
default : chThdSleepMilliseconds ( ms ) ; return ;
2013-05-24 15:26:52 +00:00
}
}
2014-04-18 11:20:50 +00:00
void gfxSleepMicroseconds ( delaytime_t ms )
{
2013-05-24 15:26:52 +00:00
switch ( ms ) {
2013-12-07 21:01:57 +00:00
case TIME_IMMEDIATE : return ;
case TIME_INFINITE : chThdSleep ( TIME_INFINITE ) ; return ;
default : chThdSleepMicroseconds ( ms ) ; return ;
2013-05-24 15:26:52 +00:00
}
}
2013-12-07 21:01:57 +00:00
2014-04-18 11:20:50 +00:00
void gfxSemInit ( gfxSem * psem , semcount_t val , semcount_t limit )
{
2013-12-07 21:01:57 +00:00
if ( val > limit )
val = limit ;
2013-05-24 15:26:52 +00:00
psem - > limit = limit ;
2014-04-18 11:20:50 +00:00
# if CH_KERNEL_MAJOR == 2
chSemInit ( & psem - > sem , val ) ;
# elif CH_KERNEL_MAJOR == 3
chSemObjectInit ( & psem - > sem , val ) ;
# endif
2013-05-24 15:26:52 +00:00
}
2013-12-07 21:01:57 +00:00
2014-04-18 11:20:50 +00:00
void gfxSemDestroy ( gfxSem * psem )
{
2013-05-25 16:06:55 +00:00
chSemReset ( & psem - > sem , 1 ) ;
}
2013-12-07 21:01:57 +00:00
2014-04-18 11:20:50 +00:00
bool_t gfxSemWait ( gfxSem * psem , delaytime_t ms )
{
# if CH_KERNEL_MAJOR == 2
switch ( ms ) {
case TIME_IMMEDIATE : return chSemWaitTimeout ( & psem - > sem , TIME_IMMEDIATE ) ! = RDY_TIMEOUT ;
case TIME_INFINITE : chSemWait ( & psem - > sem ) ; return TRUE ;
default : return chSemWaitTimeout ( & psem - > sem , MS2ST ( ms ) ) ! = RDY_TIMEOUT ;
}
# elif CH_KERNEL_MAJOR == 3
switch ( ms ) {
case TIME_IMMEDIATE : return chSemWaitTimeout ( & psem - > sem , TIME_IMMEDIATE ) ! = MSG_TIMEOUT ;
case TIME_INFINITE : chSemWait ( & psem - > sem ) ; return TRUE ;
default : return chSemWaitTimeout ( & psem - > sem , MS2ST ( ms ) ) ! = MSG_TIMEOUT ;
}
# endif
2013-05-24 15:26:52 +00:00
}
2014-04-18 11:20:50 +00:00
bool_t gfxSemWaitI ( gfxSem * psem )
{
2014-03-11 07:10:11 +00:00
if ( chSemGetCounterI ( & psem - > sem ) < = 0 )
return FALSE ;
chSemFastWaitI ( & psem - > sem ) ;
return TRUE ;
}
2014-04-18 11:20:50 +00:00
void gfxSemSignal ( gfxSem * psem )
{
2013-05-24 15:26:52 +00:00
chSysLock ( ) ;
2013-12-07 21:01:57 +00:00
2013-05-24 15:26:52 +00:00
if ( gfxSemCounterI ( psem ) < psem - > limit )
chSemSignalI ( & psem - > sem ) ;
2013-12-07 21:01:57 +00:00
2013-05-24 15:26:52 +00:00
chSchRescheduleS ( ) ;
chSysUnlock ( ) ;
}
2014-04-18 11:20:50 +00:00
void gfxSemSignalI ( gfxSem * psem )
{
2013-05-24 15:26:52 +00:00
if ( gfxSemCounterI ( psem ) < psem - > limit )
chSemSignalI ( & psem - > sem ) ;
}
2014-04-18 11:20:50 +00:00
gfxThreadHandle gfxThreadCreate ( void * stackarea , size_t stacksz , threadpriority_t prio , DECLARE_THREAD_FUNCTION ( ( * fn ) , p ) , void * param )
{
2013-05-24 15:26:52 +00:00
if ( ! stackarea ) {
if ( ! stacksz ) stacksz = 256 ;
2015-10-05 15:13:11 +00:00
return chThdCreateFromHeap ( 0 , stacksz , prio , ( tfunc_t ) fn , param ) ;
2013-05-24 15:26:52 +00:00
}
2013-12-07 21:01:57 +00:00
if ( ! stacksz )
2013-12-21 03:21:59 +00:00
return 0 ;
2013-12-07 21:01:57 +00:00
2015-10-05 15:13:11 +00:00
return chThdCreateStatic ( stackarea , stacksz , prio , ( tfunc_t ) fn , param ) ;
2013-05-24 15:26:52 +00:00
}
# endif /* GFX_USE_OS_CHIBIOS */