void gpio_init(gpio_t *obj, PinName pin) { MBED_ASSERT(obj); obj->pin = pin; obj->dir = PIN_INPUT; obj->mode = PullNone; if (pin == NC) { return; } MBED_ASSERT(CY_PIN(obj->pin) < 8); // PSoC6 architecture supports 8 pins per port. /* * Perform i/o reservation only if this is called outside of critical section/interrupt context. * This is a workaround for mbed_die() implementation, which configures LED1 inside critical section. * Normally user is advised to perform all of the i/o configuration at the program beginning, * or elsewhere in the running thread context. when we detect that we are in the wrong context here, * we assume it's explicitly called from mbed_die() or other fault handling, so eventual forcing * of the pin mode is deliberate and should not cause more problems. */ if (!(IsIrqMode() || IsIrqMasked())) { if (cy_reserve_io_pin(pin)) { error("GPIO pin reservation conflict."); } } obj->port = Cy_GPIO_PortToAddr(CY_PORT(obj->pin)); const uint32_t outputVal = 0; Cy_GPIO_Pin_FastInit(obj->port, CY_PIN(obj->pin), CY_GPIO_DM_HIGHZ, outputVal, HSIOM_SEL_GPIO); }
/// Resume the RTOS Kernel scheduler. void osKernelResume (uint32_t sleep_ticks) { EvrRtxKernelResume(sleep_ticks); if (IsIrqMode() || IsIrqMasked()) { EvrRtxKernelError((int32_t)osErrorISR); } else { __svcKernelResume(sleep_ticks); } }
/// Get the current RTOS Kernel state. osKernelState_t osKernelGetState (void) { osKernelState_t state; if (IsPrivileged() || IsIrqMode() || IsIrqMasked()) { state = svcRtxKernelGetState(); } else { state = __svcKernelGetState(); } return state; }
/// Get the RTOS kernel system timer count. uint32_t osKernelGetSysTimerCount (void) { uint32_t count; if (IsIrqMode() || IsIrqMasked()) { count = svcRtxKernelGetSysTimerCount(); } else { count = __svcKernelGetSysTimerCount(); } return count; }
/// Get the RTOS kernel system timer frequency. uint32_t osKernelGetSysTimerFreq (void) { uint32_t freq; if (IsIrqMode() || IsIrqMasked()) { freq = svcRtxKernelGetSysTimerFreq(); } else { freq = __svcKernelGetSysTimerFreq(); } return freq; }
/// Get RTOS Kernel Information. osStatus_t osKernelGetInfo (osVersion_t *version, char *id_buf, uint32_t id_size) { osStatus_t status; EvrRtxKernelGetInfo(version, id_buf, id_size); if (IsPrivileged() || IsIrqMode() || IsIrqMasked()) { status = svcRtxKernelGetInfo(version, id_buf, id_size); } else { status = __svcKernelGetInfo(version, id_buf, id_size); } return status; }
/// Check if a timer is running. uint32_t osTimerIsRunning (osTimerId_t timer_id) { uint32_t is_running; if (IsIrqMode() || IsIrqMasked()) { EvrRtxTimerIsRunning(timer_id, 0U); is_running = 0U; } else { is_running = __svcTimerIsRunning(timer_id); } return is_running; }
/// Get name of a timer. const char *osTimerGetName (osTimerId_t timer_id) { const char *name; if (IsIrqMode() || IsIrqMasked()) { EvrRtxTimerGetName(timer_id, NULL); name = NULL; } else { name = __svcTimerGetName(timer_id); } return name; }
/// Get name of a Mutex object. const char *osMutexGetName (osMutexId_t mutex_id) { const char *name; if (IsIrqMode() || IsIrqMasked()) { EvrRtxMutexGetName(mutex_id, NULL); name = NULL; } else { name = __svcMutexGetName(mutex_id); } return name; }
/// Get Thread which owns a Mutex object. osThreadId_t osMutexGetOwner (osMutexId_t mutex_id) { osThreadId_t thread; if (IsIrqMode() || IsIrqMasked()) { EvrRtxMutexGetOwner(mutex_id, NULL); thread = NULL; } else { thread = __svcMutexGetOwner(mutex_id); } return thread; }
/// Delete a timer. osStatus_t osTimerDelete (osTimerId_t timer_id) { osStatus_t status; EvrRtxTimerDelete(timer_id); if (IsIrqMode() || IsIrqMasked()) { EvrRtxTimerError(timer_id, (int32_t)osErrorISR); status = osErrorISR; } else { status = __svcTimerDelete(timer_id); } return status; }
/// Create and Initialize a Mutex object. osMutexId_t osMutexNew (const osMutexAttr_t *attr) { osMutexId_t mutex_id; EvrRtxMutexNew(attr); if (IsIrqMode() || IsIrqMasked()) { EvrRtxMutexError(NULL, (int32_t)osErrorISR); mutex_id = NULL; } else { mutex_id = __svcMutexNew(attr); } return mutex_id; }
/// Initialize the RTOS Kernel. osStatus_t osKernelInitialize (void) { osStatus_t status; EvrRtxKernelInitialize(); if (IsIrqMode() || IsIrqMasked()) { EvrRtxKernelError((int32_t)osErrorISR); status = osErrorISR; } else { status = __svcKernelInitialize(); } return status; }
/// Acquire a Mutex or timeout if it is locked. osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) { osStatus_t status; EvrRtxMutexAcquire(mutex_id, timeout); if (IsIrqMode() || IsIrqMasked()) { EvrRtxMutexError(mutex_id, (int32_t)osErrorISR); status = osErrorISR; } else { status = __svcMutexAcquire(mutex_id, timeout); } return status; }
/// Suspend the RTOS Kernel scheduler. uint32_t osKernelSuspend (void) { uint32_t ticks; EvrRtxKernelSuspend(); if (IsIrqMode() || IsIrqMasked()) { EvrRtxKernelError((int32_t)osErrorISR); ticks = 0U; } else { ticks = __svcKernelSuspend(); } return ticks; }
/// Create and Initialize a timer. osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr) { osTimerId_t timer_id; EvrRtxTimerNew(func, type, argument, attr); if (IsIrqMode() || IsIrqMasked()) { EvrRtxTimerError(NULL, (int32_t)osErrorISR); timer_id = NULL; } else { timer_id = __svcTimerNew(func, type, argument, attr); } return timer_id; }
/// Unlock the RTOS Kernel scheduler. int32_t osKernelUnlock (void) { int32_t lock; EvrRtxKernelUnlock(); if (IsIrqMode() || IsIrqMasked()) { EvrRtxKernelError((int32_t)osErrorISR); lock = (int32_t)osErrorISR; } else { lock = __svcKernelUnlock(); } return lock; }
/// Delete a Mutex object. osStatus_t osMutexDelete (osMutexId_t mutex_id) { osStatus_t status; EvrRtxMutexDelete(mutex_id); if (IsIrqMode() || IsIrqMasked()) { EvrRtxMutexError(mutex_id, (int32_t)osErrorISR); status = osErrorISR; } else { status = __svcMutexDelete(mutex_id); } return status; }
/// Restore the RTOS Kernel scheduler lock state. int32_t osKernelRestoreLock (int32_t lock) { int32_t lock_new; EvrRtxKernelRestoreLock(lock); if (IsIrqMode() || IsIrqMasked()) { EvrRtxKernelError((int32_t)osErrorISR); lock_new = (int32_t)osErrorISR; } else { lock_new = __svcKernelRestoreLock(lock); } return lock_new; }
/// Start the RTOS Kernel scheduler. osStatus_t osKernelStart (void) { osStatus_t status; EvrRtxKernelStart(); if (IsIrqMode() || IsIrqMasked()) { EvrRtxKernelError((int32_t)osErrorISR); status = osErrorISR; } else { /* Call the pre-start event (from unprivileged mode) if the handler exists * and the kernel is not running. */ /* FIXME osEventObs needs to be readable but not writable from unprivileged * code. */ if (osKernelGetState() != osKernelRunning && osEventObs && osEventObs->pre_start) { osEventObs->pre_start(); } status = __svcKernelStart(); } return status; }