Files
TAIXIN/sdk/osal/ohos/event.c

163 lines
3.5 KiB
C
Raw Normal View History

#include "typesdef.h"
#include "errno.h"
#include "list.h"
#include "osal/event.h"
#include "osal/string.h"
#ifdef OHOS
#include "los_event.h"
#include "los_membox.h"
#include "los_memory.h"
#include "los_interrupt.h"
#include "los_mux.h"
#include "los_queue.h"
#include "los_sem.h"
#include "los_swtmr.h"
#include "los_task.h"
#include "los_timer.h"
#include "los_debug.h"
#if (LOSCFG_MUTEX_CREATE_TRACE == 1)
#include "los_arch.h"
#endif
#define EVENT_MAGIC (0xa67b3cd4)
int32 os_event_init(os_event_t *evt)
{
UINT32 ret;
PEVENT_CB_S pstEventCB;
if(evt->magic == EVENT_MAGIC){
os_printf(KERN_WARNING"event repeat initialization ????\r\n");
}
pstEventCB = (PEVENT_CB_S)os_malloc(sizeof(EVENT_CB_S));
if (pstEventCB == NULL) {
return RET_ERR;
}
ret = LOS_EventInit(pstEventCB);
if (ret == LOS_OK) {
evt->hdl = pstEventCB;
evt->magic = EVENT_MAGIC;
return RET_OK;
} else {
os_free(pstEventCB);
return RET_ERR;
}
}
int32 os_event_del(os_event_t *evt)
{
ASSERT(evt && evt->magic == EVENT_MAGIC);
int32 ret = LOS_EventDestroy((PEVENT_CB_S)evt->hdl);
os_free(evt->hdl);
evt->hdl = NULL;
evt->magic = 0;
return ret;
}
int32 os_event_set(os_event_t *evt, uint32 flags, uint32 *rflags)
{
PEVENT_CB_S pstEventCB = (PEVENT_CB_S)evt->hdl;
UINT32 ret;
ASSERT(evt && evt->magic == EVENT_MAGIC);
if (pstEventCB == NULL) {
return -EINVAL;
}
ret = LOS_EventWrite(pstEventCB, (UINT32)flags);
if (ret == LOS_OK) {
*rflags = pstEventCB->uwEventID;
return ret;
} else {
return RET_ERR;
}
}
int32 os_event_clear(os_event_t *evt, uint32 flags, uint32 *rflags)
{
PEVENT_CB_S pstEventCB = (PEVENT_CB_S)evt->hdl;
UINT32 intSave;
UINT32 ret;
if (pstEventCB == NULL) {
return RET_ERR;
}
intSave = LOS_IntLock();
*rflags = pstEventCB->uwEventID;
ret = LOS_EventClear(pstEventCB, ~flags);
LOS_IntRestore(intSave);
return ret;
}
int32 os_event_get(os_event_t *evt, uint32 *rflags)
{
PEVENT_CB_S pstEventCB = (PEVENT_CB_S)evt->hdl;
UINT32 intSave;
if (pstEventCB == NULL) {
return RET_ERR;
}
intSave = LOS_IntLock();
*rflags = pstEventCB->uwEventID;
LOS_IntRestore(intSave);
return 0;
}
int32 os_event_wait(os_event_t *evt, uint32 flags, uint32 *rflags, uint32 mode, int32 timeout)
{
PEVENT_CB_S pstEventCB = (PEVENT_CB_S)evt->hdl;
UINT32 imode = 0;
UINT32 ret;
if (pstEventCB == NULL) {
return RET_ERR;
}
if (OS_INT_ACTIVE && (timeout != 0)) {
return RET_ERR;
}
if (mode & OS_EVENT_WMODE_OR) {
imode |= LOS_WAITMODE_OR;
}
if (mode & OS_EVENT_WMODE_AND) {
imode |= LOS_WAITMODE_AND;
}
if (mode & OS_EVENT_WMODE_CLEAR) {
imode &= ~LOS_WAITMODE_CLR;
} else {
imode |= LOS_WAITMODE_CLR;
}
ret = LOS_EventRead(pstEventCB, (UINT32)flags, imode, (UINT32)timeout);
switch (ret) {
case LOS_ERRNO_EVENT_PTR_NULL:
case LOS_ERRNO_EVENT_EVENTMASK_INVALID:
case LOS_ERRNO_EVENT_FLAGS_INVALID:
case LOS_ERRNO_EVENT_SETBIT_INVALID:
return RET_ERR;
case LOS_ERRNO_EVENT_READ_IN_INTERRUPT:
case LOS_ERRNO_EVENT_READ_IN_LOCK:
return RET_ERR;
case LOS_ERRNO_EVENT_READ_TIMEOUT:
return -ETIMEDOUT;
default:
*rflags = (uint32_t)ret;
return RET_OK;
}
}
#endif