From 4b655364d426f8429b063d9746c754beca6f7d1f Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Wed, 14 Mar 2018 18:31:22 +0100 Subject: fixed concerning new asm trap entry --- code/fe310/eos/event.c | 82 +++++++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 37 deletions(-) (limited to 'code/fe310/eos/event.c') diff --git a/code/fe310/eos/event.c b/code/fe310/eos/event.c index 25f1fa1..a1cf591 100644 --- a/code/fe310/eos/event.c +++ b/code/fe310/eos/event.c @@ -1,56 +1,65 @@ +#include #include +#include #include "encoding.h" #include "platform.h" -#include "eos.h" -#include "msgq.h" #include "net.h" -#include "timer.h" +#include "msgq.h" #include "event.h" -static EOSMsgQ event_q; +EOSMsgQ _eos_event_q; static EOSMsgItem event_q_array[EOS_EVT_SIZE_Q]; -static eos_evt_fptr_t evt_net_handler[EOS_NET_MAX_CMD]; -static eos_evt_fptr_t evt_timer_handler = NULL; -static eos_evt_fptr_t evt_ui_handler = NULL; - -static void bad_handler(unsigned char cmd, unsigned char *buffer, uint16_t len) { - printf("bad handler: %d\n", cmd); -} +static eos_evt_fptr_t evt_handler[EOS_EVT_MAX_EVT]; +static uint16_t evt_handler_wrapper_acq = 0; +static uint16_t evt_handler_wrapper_en = 0; void eos_evtq_init(void) { int i; - for (i=0; i> 4) > EOS_EVT_MAX_EVT) { + eos_evtq_bad_handler(cmd, buffer, len); + } else { + unsigned char idx = ((cmd & EOS_EVT_MASK) >> 4) - 1; + uint16_t flag = (uint16_t)1 << idx; + if (flag & evt_handler_wrapper_en) { + eos_evtq_handler_wrapper(cmd, buffer, len, &evt_handler_wrapper_acq, flag, evt_handler[idx]); } else { - bad_handler(cmd, buffer, len); + evt_handler[idx](cmd, buffer, len); } - } else if (cmd == EOS_EVT_TIMER) { - evt_timer_handler(cmd, buffer, len); - } else if (cmd == EOS_EVT_UI) { - evt_ui_handler(cmd, buffer, len); } } @@ -58,7 +67,7 @@ void eos_evtq_loop(void) { unsigned char cmd; unsigned char *buffer; uint16_t len; - volatile int foo = 1; + int foo = 1; while(foo) { clear_csr(mstatus, MSTATUS_MIE); @@ -68,18 +77,17 @@ void eos_evtq_loop(void) { eos_evtq_handle(cmd, buffer, len); clear_csr(mstatus, MSTATUS_MIE); } else { - // asm volatile ("wfi"); + asm volatile ("wfi"); } set_csr(mstatus, MSTATUS_MIE); } } -void eos_evtq_set_handler(unsigned char cmd, eos_evt_fptr_t handler) { - if (cmd & EOS_EVT_MASK_NET) { - evt_net_handler[cmd & ~EOS_EVT_MASK_NET] = handler; - } else if (cmd == EOS_EVT_TIMER) { - evt_timer_handler = handler; - } else if (cmd == EOS_EVT_UI) { - evt_ui_handler = handler; +void eos_evtq_set_handler(unsigned char cmd, eos_evt_fptr_t handler, uint8_t flags) { + if (flags & EOS_EVT_FLAG_WRAP) { + uint16_t flag = (uint16_t)1 << (((cmd & EOS_EVT_MASK) >> 4) - 1); + evt_handler_wrapper_en |= flag; } -} \ No newline at end of file + evt_handler[((cmd & EOS_EVT_MASK) >> 4) - 1] = handler; +} + -- cgit v1.2.3