261 lines
4.8 KiB
C
261 lines
4.8 KiB
C
#include "lwip/opt.h"
|
|
#include "lwip/arch.h"
|
|
#include "lwip/sys.h"
|
|
#include "osal.h"
|
|
|
|
/* Initialize the system architecture */
|
|
void sys_init(void)
|
|
{
|
|
/* OSAL should be initialized before calling this */
|
|
}
|
|
|
|
/* Semaphore functions */
|
|
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
|
|
{
|
|
*sem = osal_sem_create("lwip_sem", count);
|
|
if (*sem == NULL)
|
|
{
|
|
return ERR_MEM;
|
|
}
|
|
return ERR_OK;
|
|
}
|
|
|
|
void sys_sem_free(sys_sem_t *sem)
|
|
{
|
|
if (sem != NULL && *sem != NULL)
|
|
{
|
|
osal_sem_delete(*sem);
|
|
*sem = NULL;
|
|
}
|
|
}
|
|
|
|
void sys_sem_signal(sys_sem_t *sem)
|
|
{
|
|
if (sem != NULL && *sem != NULL)
|
|
{
|
|
osal_sem_release(*sem);
|
|
}
|
|
}
|
|
|
|
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
|
|
{
|
|
osal_tick_t start_tick = osal_tick_get();
|
|
osal_err_t ret;
|
|
osal_int32_t osal_timeout;
|
|
|
|
if (timeout == 0)
|
|
{
|
|
osal_timeout = -1; /* Wait forever */
|
|
}
|
|
else
|
|
{
|
|
osal_timeout = (osal_int32_t)timeout;
|
|
}
|
|
|
|
ret = osal_sem_take(*sem, osal_timeout);
|
|
|
|
if (ret == OSAL_OK)
|
|
{
|
|
return osal_tick_get() - start_tick;
|
|
}
|
|
else
|
|
{
|
|
return SYS_ARCH_TIMEOUT;
|
|
}
|
|
}
|
|
|
|
/* Check if a sem is valid */
|
|
int sys_sem_valid(sys_sem_t *sem)
|
|
{
|
|
if (sem != NULL && *sem != NULL)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
/* Set a sem to invalid */
|
|
void sys_sem_set_invalid(sys_sem_t *sem)
|
|
{
|
|
if (sem != NULL)
|
|
*sem = NULL;
|
|
}
|
|
|
|
/* Mutex functions */
|
|
err_t sys_mutex_new(sys_mutex_t *mutex)
|
|
{
|
|
*mutex = osal_mutex_create("lwip_mutex");
|
|
if (*mutex == NULL)
|
|
{
|
|
return ERR_MEM;
|
|
}
|
|
return ERR_OK;
|
|
}
|
|
|
|
void sys_mutex_free(sys_mutex_t *mutex)
|
|
{
|
|
if (mutex != NULL && *mutex != NULL)
|
|
{
|
|
osal_mutex_delete(*mutex);
|
|
*mutex = NULL;
|
|
}
|
|
}
|
|
|
|
void sys_mutex_lock(sys_mutex_t *mutex)
|
|
{
|
|
if (mutex != NULL && *mutex != NULL)
|
|
{
|
|
osal_mutex_take(*mutex, -1);
|
|
}
|
|
}
|
|
|
|
void sys_mutex_unlock(sys_mutex_t *mutex)
|
|
{
|
|
if (mutex != NULL && *mutex != NULL)
|
|
{
|
|
osal_mutex_release(*mutex);
|
|
}
|
|
}
|
|
|
|
/* Mailbox functions */
|
|
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
|
|
{
|
|
/* LwIP messages are pointers */
|
|
*mbox = osal_mq_create("lwip_mbox", sizeof(void*), size);
|
|
if (*mbox == NULL)
|
|
{
|
|
return ERR_MEM;
|
|
}
|
|
return ERR_OK;
|
|
}
|
|
|
|
void sys_mbox_free(sys_mbox_t *mbox)
|
|
{
|
|
if (mbox != NULL && *mbox != NULL)
|
|
{
|
|
osal_mq_delete(*mbox);
|
|
*mbox = NULL;
|
|
}
|
|
}
|
|
|
|
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
|
|
{
|
|
if (mbox != NULL && *mbox != NULL)
|
|
{
|
|
osal_mq_send(*mbox, &msg, sizeof(void*));
|
|
}
|
|
}
|
|
|
|
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
|
|
{
|
|
/* OSAL MQ doesn't strictly separate blocking/non-blocking send in current API wrapper,
|
|
but we assume osal_mq_send is blocking if full.
|
|
However, sys_mbox_trypost expects non-blocking.
|
|
For now, we just call send. If you need true non-blocking, OSAL needs an update.
|
|
Assuming OSAL queue has space.
|
|
*/
|
|
/* TODO: Implement non-blocking send in OSAL if needed */
|
|
if (mbox != NULL && *mbox != NULL)
|
|
{
|
|
if (osal_mq_send(*mbox, &msg, sizeof(void*)) == OSAL_OK)
|
|
{
|
|
return ERR_OK;
|
|
}
|
|
}
|
|
return ERR_MEM;
|
|
}
|
|
|
|
err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg)
|
|
{
|
|
return sys_mbox_trypost(mbox, msg);
|
|
}
|
|
|
|
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
|
|
{
|
|
osal_tick_t start_tick = osal_tick_get();
|
|
osal_err_t ret;
|
|
osal_int32_t osal_timeout;
|
|
void *dummy_msg;
|
|
|
|
if (msg == NULL)
|
|
{
|
|
msg = &dummy_msg;
|
|
}
|
|
|
|
if (timeout == 0)
|
|
{
|
|
osal_timeout = -1;
|
|
}
|
|
else
|
|
{
|
|
osal_timeout = (osal_int32_t)timeout;
|
|
}
|
|
|
|
ret = osal_mq_recv(*mbox, msg, sizeof(void*), osal_timeout);
|
|
|
|
if (ret == OSAL_OK)
|
|
{
|
|
return osal_tick_get() - start_tick;
|
|
}
|
|
else
|
|
{
|
|
return SYS_ARCH_TIMEOUT;
|
|
}
|
|
}
|
|
|
|
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
|
|
{
|
|
osal_err_t ret;
|
|
void *dummy_msg;
|
|
|
|
if (msg == NULL)
|
|
{
|
|
msg = &dummy_msg;
|
|
}
|
|
|
|
ret = osal_mq_recv(*mbox, msg, sizeof(void*), 0); /* 0 timeout */
|
|
|
|
if (ret == OSAL_OK)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
return SYS_MBOX_EMPTY;
|
|
}
|
|
}
|
|
|
|
/* Check if an mbox is valid */
|
|
int sys_mbox_valid(sys_mbox_t *mbox)
|
|
{
|
|
if (mbox != NULL && *mbox != NULL)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
/* Set an mbox to invalid */
|
|
void sys_mbox_set_invalid(sys_mbox_t *mbox)
|
|
{
|
|
if (mbox != NULL)
|
|
*mbox = NULL;
|
|
}
|
|
|
|
/* Thread functions */
|
|
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
|
|
{
|
|
osal_thread_t t;
|
|
|
|
t = osal_thread_create(name, (osal_thread_entry)thread, arg, stacksize, (osal_priority_t)prio);
|
|
|
|
if (t != NULL)
|
|
{
|
|
osal_thread_start(t);
|
|
}
|
|
|
|
return t;
|
|
}
|
|
|
|
/* Time functions */
|
|
u32_t sys_now(void)
|
|
{
|
|
return osal_tick_get();
|
|
}
|