Files
dspico-usb-examples/platform/tusb_os_custom.h
2025-11-23 14:07:30 +01:00

162 lines
3.7 KiB
C

#pragma once
#include "common.h"
#include "libtwl/rtos/rtosMutex.h"
#include "libtwl/rtos/rtosEvent.h"
typedef rtos_event_t osal_semaphore_def_t;
typedef rtos_event_t* osal_semaphore_t;
static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef)
{
rtos_createEvent(semdef);
return semdef;
}
static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl)
{
(void) semd_hdl;
return true;
}
static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr)
{
rtos_signalEvent(sem_hdl);
return true;
}
static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec)
{
(void) msec;
rtos_waitEvent(sem_hdl, false, true);
return true;
}
static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl)
{
rtos_clearEvent(sem_hdl);
}
typedef rtos_mutex_t osal_mutex_def_t;
typedef rtos_mutex_t* osal_mutex_t;
static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef)
{
rtos_createMutex(mdef);
return mdef;
}
static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl)
{
(void) mutex_hdl;
return true;
}
static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec)
{
if (msec == OSAL_TIMEOUT_NOTIMEOUT)
{
return rtos_tryLockMutex(mutex_hdl);
}
else
{
rtos_lockMutex(mutex_hdl);
return true;
}
}
static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl)
{
rtos_unlockMutex(mutex_hdl);
return true;
}
typedef struct
{
rtos_event_t event;
volatile uint32_t readPtr;
volatile uint32_t writePtr;
uint32_t elementSize;
uint32_t bufferSize;
uint8_t* buffer;
} osal_queue_def_t;
typedef osal_queue_def_t* osal_queue_t;
#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type) \
uint8_t _name##_buf[(_depth + 1)*sizeof(_type)]; \
osal_queue_def_t _name = { \
.readPtr = 0, \
.writePtr = 0, \
.elementSize = sizeof(_type), \
.bufferSize = (_depth + 1)*sizeof(_type), \
.buffer = _name##_buf \
}
static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef)
{
rtos_createEvent(&qdef->event);
qdef->readPtr = 0;
qdef->writePtr = 0;
return qdef;
}
static inline bool osal_queue_delete(osal_queue_t qhdl)
{
(void) qhdl;
return true;
}
static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec)
{
do
{
uint32_t readPtr = qhdl->readPtr;
uint32_t writePtr = qhdl->writePtr;
if (readPtr != writePtr)
{
memcpy(data, &qhdl->buffer[readPtr], qhdl->elementSize);
readPtr += qhdl->elementSize;
if (readPtr == qhdl->bufferSize)
{
readPtr = 0;
}
qhdl->readPtr = readPtr;
return true;
}
if (msec == OSAL_TIMEOUT_NOTIMEOUT)
{
return false;
}
rtos_waitEvent(&qhdl->event, false, true);
} while (true);
}
static inline bool osal_queue_send(osal_queue_t qhdl, const void* data, bool in_isr)
{
uint32_t readPtr = qhdl->readPtr;
uint32_t writePtr = qhdl->writePtr;
uint32_t newWritePtr = writePtr + qhdl->elementSize;
if (newWritePtr == qhdl->bufferSize)
{
newWritePtr = 0;
}
if (newWritePtr == readPtr)
{
return false;
}
memcpy(&qhdl->buffer[writePtr], data, qhdl->elementSize);
qhdl->writePtr = newWritePtr;
rtos_signalEvent(&qhdl->event);
return true;
}
static inline bool osal_queue_empty(osal_queue_t qhdl)
{
qhdl->readPtr = 0;
qhdl->writePtr = 0;
return true;
}