diff --git a/firmware/ice40-riscv/icE1usb/misc.c b/firmware/ice40-riscv/icE1usb/misc.c index 50aec43..b8419aa 100644 --- a/firmware/ice40-riscv/icE1usb/misc.c +++ b/firmware/ice40-riscv/icE1usb/misc.c @@ -122,6 +122,34 @@ e1_tick_read(int port) return misc_regs->e1_tick[port].tx; } + +bool +time_elapsed(uint32_t ref, unsigned int tick) +{ + return ((misc_regs->time.now - ref) & 0x7fffffff) >= tick; +} + +void +delay(unsigned int ms) +{ + uint32_t ref = misc_regs->time.now; + ms *= SYS_CLK_FREQ / 1000; + while (!time_elapsed(ref, ms)); +} + +uint32_t +time_pps_read(void) +{ + return misc_regs->time.pps; +} + +uint32_t +time_now_read(void) +{ + return misc_regs->time.now; +} + + void reboot(int fw) { diff --git a/firmware/ice40-riscv/icE1usb/misc.h b/firmware/ice40-riscv/icE1usb/misc.h index 76d5a7d..b72793f 100644 --- a/firmware/ice40-riscv/icE1usb/misc.h +++ b/firmware/ice40-riscv/icE1usb/misc.h @@ -36,4 +36,9 @@ void e1_led_set(bool enable, uint8_t cfg); uint16_t e1_tick_read(int port); +bool time_elapsed(uint32_t ref, unsigned int tick); +void delay(unsigned int ms); +uint32_t time_pps_read(void); +uint32_t time_now_read(void); + void reboot(int fw);