summaryrefslogtreecommitdiff
path: root/code/fe310
diff options
context:
space:
mode:
Diffstat (limited to 'code/fe310')
-rw-r--r--code/fe310/eos/timer.c11
-rw-r--r--code/fe310/eos/timer.h3
2 files changed, 12 insertions, 2 deletions
diff --git a/code/fe310/eos/timer.c b/code/fe310/eos/timer.c
index ed6aac4..f443a8d 100644
--- a/code/fe310/eos/timer.c
+++ b/code/fe310/eos/timer.c
@@ -80,9 +80,11 @@ uint64_t eos_timer_get(unsigned char evt) {
return ret;
}
-void eos_timer_set(uint64_t tick, unsigned char evt, unsigned char b) {
+void eos_timer_set(uint32_t msec, unsigned char evt, unsigned char b) {
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)RTC_FREQ / 1000;
uint64_t next = 0;
if (evt && (evt <= EOS_TIMER_MAX_ETYPE)) {
@@ -145,3 +147,10 @@ void eos_timer_set_handler(unsigned char evt, eos_timer_fptr_t handler, uint8_t
if ((evt != EOS_TIMER_MAX_ETYPE) && flags) eos_evtq_set_flags(EOS_EVT_TIMER | evt + 1, flags);
}
+
+void eos_timer_sleep(uint32_t msec) {
+ volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME);
+
+ uint64_t now_ms = *mtime * 1000 / RTC_FREQ;
+ while (*mtime * 1000 / RTC_FREQ < now_ms + msec);
+}
diff --git a/code/fe310/eos/timer.h b/code/fe310/eos/timer.h
index 0807d96..dff9b2b 100644
--- a/code/fe310/eos/timer.h
+++ b/code/fe310/eos/timer.h
@@ -9,6 +9,7 @@ typedef void (*eos_timer_fptr_t) (unsigned char);
void eos_timer_init(void);
uint64_t eos_timer_get(unsigned char evt);
-void eos_timer_set(uint64_t tick, unsigned char evt, unsigned char b);
+void eos_timer_set(uint32_t msec, unsigned char evt, unsigned char b);
void eos_timer_clear(unsigned char evt);
void eos_timer_set_handler(unsigned char evt, eos_timer_fptr_t handler, uint8_t flags);
+void eos_timer_sleep(uint32_t msec);