diff options
Diffstat (limited to 'code/fe310/eos/timer.c')
| -rw-r--r-- | code/fe310/eos/timer.c | 131 | 
1 files changed, 0 insertions, 131 deletions
| diff --git a/code/fe310/eos/timer.c b/code/fe310/eos/timer.c deleted file mode 100644 index e07b9a6..0000000 --- a/code/fe310/eos/timer.c +++ /dev/null @@ -1,131 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> - -#include "encoding.h" -#include "platform.h" - -#include "msgq.h" -#include "event.h" -#include "timer.h" - -#define MIN(X, Y)               (((X) < (Y)) ? (X) : (Y)) -#define MAX(X, Y)               (((X) > (Y)) ? (X) : (Y)) - -static eos_timer_handler_t timer_handler[EOS_TIMER_MAX_ETYPE + 1]; -static uint64_t timer_next[EOS_TIMER_MAX_ETYPE + 1]; - -static void timer_handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) { -    unsigned char idx = (type & ~EOS_EVT_MASK); - -    if (idx && (idx <= EOS_TIMER_MAX_ETYPE) && timer_handler[idx]) { -        timer_handler[idx](type); -    } else { -        eos_evtq_bad_handler(type, buffer, len); -    } -} - -void _eos_timer_handle(void) { -    int i; -    volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); -    uint64_t *mtimecmp = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIMECMP); -    uint64_t now = *mtime; -    uint64_t next = 0; - -    for (i = 0; i <= EOS_TIMER_MAX_ETYPE; i++) { -        if (timer_next[i] && (timer_next[i] <= now)) { -            timer_next[i] = 0; -            if (i == 0) { -                timer_handler[0](0); -            } else { -                eos_evtq_push_isr(EOS_EVT_TIMER | i, NULL, 0); -            } -        } -        next = next && timer_next[i] ? MIN(next, timer_next[i]) : (next ? next : timer_next[i]); -    } -    *mtimecmp = next; -    if (*mtimecmp == 0) clear_csr(mie, MIP_MTIP); -} - -void eos_timer_init(void) { -    int i; -    uint64_t *mtimecmp = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIMECMP); - -    clear_csr(mie, MIP_MTIP); -    *mtimecmp = 0; -    for (i=0; i<=EOS_TIMER_MAX_ETYPE; i++) { -        timer_next[i] = 0; -        timer_handler[i] = NULL; -    } -    eos_evtq_set_handler(EOS_EVT_TIMER, timer_handle_evt); -} - -void eos_timer_set_handler(unsigned char evt, eos_timer_handler_t handler) { -    uint64_t *mtimecmp = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIMECMP); - -    if (!evt && (*mtimecmp != 0)) clear_csr(mie, MIP_MTIP); -    timer_handler[evt] = handler; -    if (!evt && (*mtimecmp != 0)) set_csr(mie, MIP_MTIP); -} - -uint32_t eos_timer_get(unsigned char evt) { -    volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); -    uint64_t *mtimecmp = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIMECMP); -    uint64_t now; -    uint32_t ret; - -    if (*mtimecmp != 0) clear_csr(mie, MIP_MTIP); -    now = *mtime; -    if (timer_next[evt]) { -        ret = (timer_next[evt] > now) ? (timer_next[evt] - now) * 1000 / EOS_TIMER_RTC_FREQ : 0; -    } else { -        ret = EOS_TIMER_NONE; -    } -    if (*mtimecmp != 0) set_csr(mie, MIP_MTIP); - -    return ret; -} - -void eos_timer_set(uint32_t msec, unsigned char evt) { -    int i; -    volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); -    uint64_t *mtimecmp = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIMECMP); -    uint64_t tick = *mtime + msec * (uint64_t)EOS_TIMER_RTC_FREQ / 1000; -    uint64_t next = 0; - -    if (*mtimecmp != 0) clear_csr(mie, MIP_MTIP); -    timer_next[evt] = tick; -    for (i = 0; i <= EOS_TIMER_MAX_ETYPE; i++) { -        next = next && timer_next[i] ? MIN(next, timer_next[i]) : (next ? next : timer_next[i]); -    } -    *mtimecmp = next; -    if (*mtimecmp != 0) set_csr(mie, MIP_MTIP); -} - -void eos_timer_clear(unsigned char evt) { -    int i; -    uint64_t *mtimecmp = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIMECMP); -    uint64_t next = 0; - -    if (*mtimecmp != 0) clear_csr(mie, MIP_MTIP); -    if (timer_next[evt]) { -        timer_next[evt] = 0; -        for (i = 0; i <= EOS_TIMER_MAX_ETYPE; i++) { -            next = next && timer_next[i] ? MIN(next, timer_next[i]) : (next ? next : timer_next[i]); -        } -        *mtimecmp = next; -    } -    if (*mtimecmp != 0) set_csr(mie, MIP_MTIP); -} - - -void eos_time_sleep(uint32_t msec) { -    volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); -    uint64_t now_ms = *mtime * 1000 / EOS_TIMER_RTC_FREQ; - -    while (*mtime * 1000 / EOS_TIMER_RTC_FREQ < now_ms + msec); -} - -uint64_t eos_time_get_tick(void) { -    volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); -    return *mtime; -} | 
