diff --git a/firmware/ice40-riscv/e1-tracer/fw_app.c b/firmware/ice40-riscv/e1-tracer/fw_app.c index b207ad2..c764b2e 100644 --- a/firmware/ice40-riscv/e1-tracer/fw_app.c +++ b/firmware/ice40-riscv/e1-tracer/fw_app.c @@ -55,8 +55,7 @@ boot_dfu(void) usb_disconnect(); /* Boot firmware */ - volatile uint32_t *boot = (void*)MISC_BASE; - *boot = (1 << 2) | (1 << 0); + reboot(1); } void diff --git a/firmware/ice40-riscv/e1-tracer/misc.c b/firmware/ice40-riscv/e1-tracer/misc.c index c628cda..a7d8bc5 100644 --- a/firmware/ice40-riscv/e1-tracer/misc.c +++ b/firmware/ice40-riscv/e1-tracer/misc.c @@ -35,3 +35,10 @@ e1_tick_read(uint16_t *ticks) ticks[0] = (v ) & 0xffff; ticks[1] = (v >> 16) & 0xffff; } + + +void +reboot(int fw) +{ + misc_regs->warmboot = (1 << 2) | (fw << 0); +} diff --git a/firmware/ice40-riscv/e1-tracer/misc.h b/firmware/ice40-riscv/e1-tracer/misc.h index 31e8f80..ac942ec 100644 --- a/firmware/ice40-riscv/e1-tracer/misc.h +++ b/firmware/ice40-riscv/e1-tracer/misc.h @@ -13,3 +13,5 @@ void vio_set(unsigned value); void e1_tick_read(uint16_t *ticks); + +void reboot(int fw); diff --git a/firmware/ice40-riscv/icE1usb/fw_app.c b/firmware/ice40-riscv/icE1usb/fw_app.c index 17379b3..cb4dbb8 100644 --- a/firmware/ice40-riscv/icE1usb/fw_app.c +++ b/firmware/ice40-riscv/icE1usb/fw_app.c @@ -53,8 +53,7 @@ boot_dfu(void) usb_disconnect(); /* Boot firmware */ - volatile uint32_t *boot = (void*)(MISC_BASE); - *boot = (1 << 2) | (1 << 0); + reboot(1); } void diff --git a/firmware/ice40-riscv/icE1usb/misc.c b/firmware/ice40-riscv/icE1usb/misc.c index 4fdd2f5..dca126a 100644 --- a/firmware/ice40-riscv/icE1usb/misc.c +++ b/firmware/ice40-riscv/icE1usb/misc.c @@ -56,3 +56,9 @@ e1_tick_read(void) { return misc_regs->e1_tick[0].tx; } + +void +reboot(int fw) +{ + misc_regs->warmboot = (1 << 2) | (fw << 0); +} diff --git a/firmware/ice40-riscv/icE1usb/misc.h b/firmware/ice40-riscv/icE1usb/misc.h index 6d90364..69c0da7 100644 --- a/firmware/ice40-riscv/icE1usb/misc.h +++ b/firmware/ice40-riscv/icE1usb/misc.h @@ -28,3 +28,5 @@ void pdm_set(int chan, bool enable, unsigned value, bool normalize); void e1_led_set(bool enable, uint8_t cfg); uint16_t e1_tick_read(void); + +void reboot(int fw);