From c95d2fcbd7096f97fa3fc1993bec0228f7991159 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 3 Mar 2021 16:31:06 +0200 Subject: [PATCH 1/3] Use avr-libc wdt library --- Firmware/optiboot_w25x20cl.cpp | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/Firmware/optiboot_w25x20cl.cpp b/Firmware/optiboot_w25x20cl.cpp index 9e2296e7..ea6d1b99 100644 --- a/Firmware/optiboot_w25x20cl.cpp +++ b/Firmware/optiboot_w25x20cl.cpp @@ -15,19 +15,6 @@ static unsigned const int __attribute__((section(".version"))) optiboot_version = 256*(OPTIBOOT_MAJVER + OPTIBOOT_CUSTOMVER) + OPTIBOOT_MINVER; -/* Watchdog settings */ -#define WATCHDOG_OFF (0) -#define WATCHDOG_16MS (_BV(WDE)) -#define WATCHDOG_32MS (_BV(WDP0) | _BV(WDE)) -#define WATCHDOG_64MS (_BV(WDP1) | _BV(WDE)) -#define WATCHDOG_125MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE)) -#define WATCHDOG_250MS (_BV(WDP2) | _BV(WDE)) -#define WATCHDOG_500MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE)) -#define WATCHDOG_1S (_BV(WDP2) | _BV(WDP1) | _BV(WDE)) -#define WATCHDOG_2S (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE)) -#define WATCHDOG_4S (_BV(WDP3) | _BV(WDE)) -#define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE)) - #if 0 #define W25X20CL_SIGNATURE_0 9 #define W25X20CL_SIGNATURE_1 8 @@ -39,13 +26,6 @@ static unsigned const int __attribute__((section(".version"))) #define W25X20CL_SIGNATURE_2 0x01 #endif -static void watchdogConfig(uint8_t x) { - CRITICAL_SECTION_START - WDTCSR = _BV(WDCE) | _BV(WDE); - WDTCSR = x; - CRITICAL_SECTION_END -} - #define RECV_READY ((UCSR0A & _BV(RXC0)) != 0) static uint8_t getch(void) { @@ -74,7 +54,7 @@ static void putch(char ch) { static void verifySpace() { if (getch() != CRC_EOP) { putch(STK_FAILED); - watchdogConfig(WATCHDOG_16MS); // shorten WD timeout + wdt_enable(WDTO_15MS); // shorten WD timeout while (1) // and busy-loop so that WD causes ; // a reset and app start. } @@ -172,7 +152,7 @@ uint8_t optiboot_w25x20cl_enter() spi_init(); w25x20cl_init(); - watchdogConfig(WATCHDOG_OFF); + wdt_disable(); /* Forever loop: exits by causing WDT reset */ for (;;) { @@ -311,7 +291,7 @@ uint8_t optiboot_w25x20cl_enter() } else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ // Adaboot no-wait mod - watchdogConfig(WATCHDOG_16MS); + wdt_enable(WDTO_15MS); verifySpace(); } else { From c951bea627dcbecbe4b4f35f006067b136707de0 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 3 Mar 2021 16:31:30 +0200 Subject: [PATCH 2/3] Remove unused/broken bootapp code --- Firmware/Dcodes.cpp | 13 ------------- Firmware/bootapp.c | 9 --------- Firmware/bootapp.h | 1 - 3 files changed, 23 deletions(-) diff --git a/Firmware/Dcodes.cpp b/Firmware/Dcodes.cpp index a4b2829b..dace219f 100644 --- a/Firmware/Dcodes.cpp +++ b/Firmware/Dcodes.cpp @@ -173,19 +173,6 @@ void dcode_3() #include "bootapp.h" #if 0 -#define FLASHSIZE 0x40000 - -#define RAMSIZE 0x2000 -#define boot_src_addr (*((uint32_t*)(RAMSIZE - 16))) -#define boot_dst_addr (*((uint32_t*)(RAMSIZE - 12))) -#define boot_copy_size (*((uint16_t*)(RAMSIZE - 8))) -#define boot_reserved (*((uint8_t*)(RAMSIZE - 6))) -#define boot_app_flags (*((uint8_t*)(RAMSIZE - 5))) -#define boot_app_magic (*((uint32_t*)(RAMSIZE - 4))) -#define BOOT_APP_FLG_ERASE 0x01 -#define BOOT_APP_FLG_COPY 0x02 -#define BOOT_APP_FLG_FLASH 0x04 - extern float current_temperature_pinda; extern float axis_steps_per_unit[NUM_AXIS]; diff --git a/Firmware/bootapp.c b/Firmware/bootapp.c index c4585af5..78614d8f 100644 --- a/Firmware/bootapp.c +++ b/Firmware/bootapp.c @@ -28,15 +28,6 @@ void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) boot_app_magic = BOOT_APP_MAGIC; boot_app_flags |= BOOT_APP_FLG_COPY; boot_app_flags |= BOOT_APP_FLG_ERASE; -/* uint16_t ui; for (ui = 0; ui < size; ui++) - { - uint8_t uc = ram_array[ui+rptr]; - if (pgm_read_byte(ui+fptr) & uc != uc) - { - boot_app_flags |= BOOT_APP_FLG_ERASE; - break; - } - }*/ boot_copy_size = (uint16_t)size; boot_src_addr = (uint32_t)rptr; boot_dst_addr = (uint32_t)fptr; diff --git a/Firmware/bootapp.h b/Firmware/bootapp.h index 3fb0306a..6ff086f4 100644 --- a/Firmware/bootapp.h +++ b/Firmware/bootapp.h @@ -7,7 +7,6 @@ #define RAMSIZE 0x2000 -#define ram_array ((uint8_t*)(0)) #define boot_src_addr (*((uint32_t*)(RAMSIZE - 16))) #define boot_dst_addr (*((uint32_t*)(RAMSIZE - 12))) #define boot_copy_size (*((uint16_t*)(RAMSIZE - 8))) From f0eedf301d22127e3beb28cbe291795099392d42 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 3 Mar 2021 16:31:55 +0200 Subject: [PATCH 3/3] optiboot: check boot_app_magic as well before early exit --- Firmware/optiboot_w25x20cl.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Firmware/optiboot_w25x20cl.cpp b/Firmware/optiboot_w25x20cl.cpp index ea6d1b99..ed38b299 100644 --- a/Firmware/optiboot_w25x20cl.cpp +++ b/Firmware/optiboot_w25x20cl.cpp @@ -80,7 +80,10 @@ extern struct block_t *block_buffer; //! @return 0 if "start\n" was sent. Optiboot ran normally. No need to send "start\n" in setup() uint8_t optiboot_w25x20cl_enter() { - if (boot_app_flags & BOOT_APP_FLG_USER0) return 1; +// Make sure to check boot_app_magic as well. Since these bootapp flags are located right in the middle of the stack, +// they can be unintentionally changed. As a workaround to the language upload problem, do not only check for one bit if it's set, +// but rather test 33 bits for the correct value before exiting optiboot early. + if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) return 1; uint8_t ch; uint8_t rampz = 0; register uint16_t address = 0;