♻️ Move watchdog to MarlinHAL
This commit is contained in:
		| @@ -23,6 +23,7 @@ | |||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" | #include "../../inc/MarlinConfig.h" | ||||||
| #include "HAL.h" | #include "HAL.h" | ||||||
|  | #include <avr/wdt.h> | ||||||
|  |  | ||||||
| #ifdef USBCON | #ifdef USBCON | ||||||
|   DefaultSerial1 MSerial0(false, Serial); |   DefaultSerial1 MSerial0(false, Serial); | ||||||
| @@ -88,6 +89,58 @@ void MarlinHAL::reboot() { | |||||||
|   #endif |   #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ------------------------ | ||||||
|  | // Watchdog Timer | ||||||
|  | // ------------------------ | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #include <avr/wdt.h> | ||||||
|  |   #include "../../MarlinCore.h" | ||||||
|  |  | ||||||
|  |   // Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s. | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     #if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S) | ||||||
|  |       #define WDTO_NS WDTO_8S | ||||||
|  |     #else | ||||||
|  |       #define WDTO_NS WDTO_4S | ||||||
|  |     #endif | ||||||
|  |     #if ENABLED(WATCHDOG_RESET_MANUAL) | ||||||
|  |       // Enable the watchdog timer, but only for the interrupt. | ||||||
|  |       // Take care, as this requires the correct order of operation, with interrupts disabled. | ||||||
|  |       // See the datasheet of any AVR chip for details. | ||||||
|  |       wdt_reset(); | ||||||
|  |       cli(); | ||||||
|  |       _WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE); | ||||||
|  |       _WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5 | ||||||
|  |                                                                                 // So worked for up to WDTO_2S | ||||||
|  |       sei(); | ||||||
|  |       wdt_reset(); | ||||||
|  |     #else | ||||||
|  |       wdt_enable(WDTO_NS); // The function handles the upper bit correct. | ||||||
|  |     #endif | ||||||
|  |     //delay(10000); // test it! | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   //=========================================================================== | ||||||
|  |   //=================================== ISR =================================== | ||||||
|  |   //=========================================================================== | ||||||
|  |  | ||||||
|  |   // Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled. | ||||||
|  |   #if ENABLED(WATCHDOG_RESET_MANUAL) | ||||||
|  |     ISR(WDT_vect) { | ||||||
|  |       sei();  // With the interrupt driven serial we need to allow interrupts. | ||||||
|  |       SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED); | ||||||
|  |       minkill();  // interrupt-safe final kill and infinite loop | ||||||
|  |     } | ||||||
|  |   #endif | ||||||
|  |  | ||||||
|  |   // Reset watchdog. MUST be called at least every 4 seconds after the | ||||||
|  |   // first watchdog_init or AVR will go into emergency procedures. | ||||||
|  |   void MarlinHAL::watchdog_refresh() { wdt_reset(); } | ||||||
|  |  | ||||||
|  | #endif // USE_WATCHDOG | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // Free Memory Accessor | // Free Memory Accessor | ||||||
| // ------------------------ | // ------------------------ | ||||||
|   | |||||||
| @@ -22,7 +22,6 @@ | |||||||
| #include "../shared/Marduino.h" | #include "../shared/Marduino.h" | ||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
| #include "math.h" | #include "math.h" | ||||||
|  |  | ||||||
| #ifdef USBCON | #ifdef USBCON | ||||||
| @@ -185,6 +184,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init();          // Called early in setup() |   static void init();          // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware from 0x0 |   static void reboot();        // Restart the firmware from 0x0 | ||||||
|   | |||||||
| @@ -1,70 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #ifdef __AVR__ |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #include "../../MarlinCore.h" |  | ||||||
|  |  | ||||||
| // Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s. |  | ||||||
| void watchdog_init() { |  | ||||||
|   #if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S) |  | ||||||
|     #define WDTO_NS WDTO_8S |  | ||||||
|   #else |  | ||||||
|     #define WDTO_NS WDTO_4S |  | ||||||
|   #endif |  | ||||||
|   #if ENABLED(WATCHDOG_RESET_MANUAL) |  | ||||||
|     // Enable the watchdog timer, but only for the interrupt. |  | ||||||
|     // Take care, as this requires the correct order of operation, with interrupts disabled. |  | ||||||
|     // See the datasheet of any AVR chip for details. |  | ||||||
|     wdt_reset(); |  | ||||||
|     cli(); |  | ||||||
|     _WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE); |  | ||||||
|     _WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5 |  | ||||||
|                                                                               // So worked for up to WDTO_2S |  | ||||||
|     sei(); |  | ||||||
|     wdt_reset(); |  | ||||||
|   #else |  | ||||||
|     wdt_enable(WDTO_NS); // The function handles the upper bit correct. |  | ||||||
|   #endif |  | ||||||
|   //delay(10000); // test it! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //=========================================================================== |  | ||||||
| //=================================== ISR =================================== |  | ||||||
| //=========================================================================== |  | ||||||
|  |  | ||||||
| // Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled. |  | ||||||
| #if ENABLED(WATCHDOG_RESET_MANUAL) |  | ||||||
|   ISR(WDT_vect) { |  | ||||||
|     sei();  // With the interrupt driven serial we need to allow interrupts. |  | ||||||
|     SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED); |  | ||||||
|     minkill();  // interrupt-safe final kill and infinite loop |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
| #endif // __AVR__ |  | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #include <avr/wdt.h> |  | ||||||
|  |  | ||||||
| // Initialize watchdog with a 4 second interrupt time |  | ||||||
| void watchdog_init(); |  | ||||||
|  |  | ||||||
| // Reset watchdog. MUST be called at least every 4 seconds after the |  | ||||||
| // first watchdog_init or AVR will go into emergency procedures. |  | ||||||
| inline void HAL_watchdog_refresh() { wdt_reset(); } |  | ||||||
| @@ -25,7 +25,7 @@ | |||||||
| #ifdef ARDUINO_ARCH_SAM | #ifdef ARDUINO_ARCH_SAM | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" | #include "../../inc/MarlinConfig.h" | ||||||
| #include "HAL.h" | #include "../../MarlinCore.h" | ||||||
|  |  | ||||||
| #include <Wire.h> | #include <Wire.h> | ||||||
| #include "usb/usb_task.h" | #include "usb/usb_task.h" | ||||||
| @@ -73,6 +73,99 @@ uint8_t MarlinHAL::get_reset_source() { | |||||||
|  |  | ||||||
| void MarlinHAL::reboot() { rstc_start_software_reset(RSTC); } | void MarlinHAL::reboot() { rstc_start_software_reset(RSTC); } | ||||||
|  |  | ||||||
|  | // ------------------------ | ||||||
|  | // Watchdog Timer | ||||||
|  | // ------------------------ | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   // Initialize watchdog - On SAM3X, Watchdog was already configured | ||||||
|  |   //  and enabled or disabled at startup, so no need to reconfigure it | ||||||
|  |   //  here. | ||||||
|  |   void MarlinHAL::watchdog_init() { WDT_Restart(WDT); } // Reset watchdog to start clean | ||||||
|  |  | ||||||
|  |   // Reset watchdog. MUST be called at least every 4 seconds after the | ||||||
|  |   // first watchdog_init or AVR will go into emergency procedures. | ||||||
|  |   void MarlinHAL::watchdog_refresh() { watchdogReset(); } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // Override Arduino runtime to either config or disable the watchdog | ||||||
|  | // | ||||||
|  | // We need to configure the watchdog as soon as possible in the boot | ||||||
|  | // process, because watchdog initialization at hardware reset on SAM3X8E | ||||||
|  | // is unreliable, and there is risk of unintended resets if we delay | ||||||
|  | // that initialization to a later time. | ||||||
|  | void watchdogSetup() { | ||||||
|  |  | ||||||
|  |   #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |     // 4 seconds timeout | ||||||
|  |     uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000); | ||||||
|  |  | ||||||
|  |     // Calculate timeout value in WDT counter ticks: This assumes | ||||||
|  |     // the slow clock is running at 32.768 kHz watchdog | ||||||
|  |     // frequency is therefore 32768 / 128 = 256 Hz | ||||||
|  |     timeout = (timeout << 8) / 1000; | ||||||
|  |     if (timeout == 0) | ||||||
|  |       timeout = 1; | ||||||
|  |     else if (timeout > 0xFFF) | ||||||
|  |       timeout = 0xFFF; | ||||||
|  |  | ||||||
|  |     // We want to enable the watchdog with the specified timeout | ||||||
|  |     uint32_t value = | ||||||
|  |       WDT_MR_WDV(timeout) |               // With the specified timeout | ||||||
|  |       WDT_MR_WDD(timeout) |               // and no invalid write window | ||||||
|  |     #if !(SAMV70 || SAMV71 || SAME70 || SAMS70) | ||||||
|  |       WDT_MR_WDRPROC   |                  // WDT fault resets processor only - We want | ||||||
|  |                                           // to keep PIO controller state | ||||||
|  |     #endif | ||||||
|  |       WDT_MR_WDDBGHLT  |                  // WDT stops in debug state. | ||||||
|  |       WDT_MR_WDIDLEHLT;                   // WDT stops in idle state. | ||||||
|  |  | ||||||
|  |     #if ENABLED(WATCHDOG_RESET_MANUAL) | ||||||
|  |       // We enable the watchdog timer, but only for the interrupt. | ||||||
|  |  | ||||||
|  |       // Configure WDT to only trigger an interrupt | ||||||
|  |       value |= WDT_MR_WDFIEN;             // Enable WDT fault interrupt. | ||||||
|  |  | ||||||
|  |       // Disable WDT interrupt (just in case, to avoid triggering it!) | ||||||
|  |       NVIC_DisableIRQ(WDT_IRQn); | ||||||
|  |  | ||||||
|  |       // We NEED memory barriers to ensure Interrupts are actually disabled! | ||||||
|  |       // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) | ||||||
|  |       __DSB(); | ||||||
|  |       __ISB(); | ||||||
|  |  | ||||||
|  |       // Initialize WDT with the given parameters | ||||||
|  |       WDT_Enable(WDT, value); | ||||||
|  |  | ||||||
|  |       // Configure and enable WDT interrupt. | ||||||
|  |       NVIC_ClearPendingIRQ(WDT_IRQn); | ||||||
|  |       NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups | ||||||
|  |       NVIC_EnableIRQ(WDT_IRQn); | ||||||
|  |  | ||||||
|  |     #else | ||||||
|  |  | ||||||
|  |       // a WDT fault triggers a reset | ||||||
|  |       value |= WDT_MR_WDRSTEN; | ||||||
|  |  | ||||||
|  |       // Initialize WDT with the given parameters | ||||||
|  |       WDT_Enable(WDT, value); | ||||||
|  |  | ||||||
|  |     #endif | ||||||
|  |  | ||||||
|  |     // Reset the watchdog | ||||||
|  |     WDT_Restart(WDT); | ||||||
|  |  | ||||||
|  |   #else | ||||||
|  |  | ||||||
|  |     // Make sure to completely disable the Watchdog | ||||||
|  |     WDT_Disable(WDT); | ||||||
|  |  | ||||||
|  |   #endif | ||||||
|  | } | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // Free Memory Accessor | // Free Memory Accessor | ||||||
| // ------------------------ | // ------------------------ | ||||||
|   | |||||||
| @@ -32,7 +32,6 @@ | |||||||
| #include "../shared/math_32bit.h" | #include "../shared/math_32bit.h" | ||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
|  |  | ||||||
| @@ -176,9 +175,13 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init();          // Called early in setup() |   static void init();          // Called early in setup() | ||||||
|   static void init_board();    // Called less early in setup() |   static void init_board();    // Called less early in setup() | ||||||
|   static void reboot();     // Software reset |   static void reboot();        // Restart the firmware | ||||||
|  |  | ||||||
|   // Interrupts |   // Interrupts | ||||||
|   static bool isr_state() { return !__get_PRIMASK(); } |   static bool isr_state() { return !__get_PRIMASK(); } | ||||||
|   | |||||||
| @@ -1,114 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #ifdef ARDUINO_ARCH_SAM |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
| #include "../../MarlinCore.h" |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| // Override Arduino runtime to either config or disable the watchdog |  | ||||||
| // |  | ||||||
| // We need to configure the watchdog as soon as possible in the boot |  | ||||||
| // process, because watchdog initialization at hardware reset on SAM3X8E |  | ||||||
| // is unreliable, and there is risk of unintended resets if we delay |  | ||||||
| // that initialization to a later time. |  | ||||||
| void watchdogSetup() { |  | ||||||
|  |  | ||||||
|   #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
|     // 4 seconds timeout |  | ||||||
|     uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000); |  | ||||||
|  |  | ||||||
|     // Calculate timeout value in WDT counter ticks: This assumes |  | ||||||
|     // the slow clock is running at 32.768 kHz watchdog |  | ||||||
|     // frequency is therefore 32768 / 128 = 256 Hz |  | ||||||
|     timeout = (timeout << 8) / 1000; |  | ||||||
|     if (timeout == 0) |  | ||||||
|       timeout = 1; |  | ||||||
|     else if (timeout > 0xFFF) |  | ||||||
|       timeout = 0xFFF; |  | ||||||
|  |  | ||||||
|     // We want to enable the watchdog with the specified timeout |  | ||||||
|     uint32_t value = |  | ||||||
|       WDT_MR_WDV(timeout) |               // With the specified timeout |  | ||||||
|       WDT_MR_WDD(timeout) |               // and no invalid write window |  | ||||||
|     #if !(SAMV70 || SAMV71 || SAME70 || SAMS70) |  | ||||||
|       WDT_MR_WDRPROC   |                  // WDT fault resets processor only - We want |  | ||||||
|                                           // to keep PIO controller state |  | ||||||
|     #endif |  | ||||||
|       WDT_MR_WDDBGHLT  |                  // WDT stops in debug state. |  | ||||||
|       WDT_MR_WDIDLEHLT;                   // WDT stops in idle state. |  | ||||||
|  |  | ||||||
|     #if ENABLED(WATCHDOG_RESET_MANUAL) |  | ||||||
|       // We enable the watchdog timer, but only for the interrupt. |  | ||||||
|  |  | ||||||
|       // Configure WDT to only trigger an interrupt |  | ||||||
|       value |= WDT_MR_WDFIEN;             // Enable WDT fault interrupt. |  | ||||||
|  |  | ||||||
|       // Disable WDT interrupt (just in case, to avoid triggering it!) |  | ||||||
|       NVIC_DisableIRQ(WDT_IRQn); |  | ||||||
|  |  | ||||||
|       // We NEED memory barriers to ensure Interrupts are actually disabled! |  | ||||||
|       // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) |  | ||||||
|       __DSB(); |  | ||||||
|       __ISB(); |  | ||||||
|  |  | ||||||
|       // Initialize WDT with the given parameters |  | ||||||
|       WDT_Enable(WDT, value); |  | ||||||
|  |  | ||||||
|       // Configure and enable WDT interrupt. |  | ||||||
|       NVIC_ClearPendingIRQ(WDT_IRQn); |  | ||||||
|       NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups |  | ||||||
|       NVIC_EnableIRQ(WDT_IRQn); |  | ||||||
|  |  | ||||||
|     #else |  | ||||||
|  |  | ||||||
|       // a WDT fault triggers a reset |  | ||||||
|       value |= WDT_MR_WDRSTEN; |  | ||||||
|  |  | ||||||
|       // Initialize WDT with the given parameters |  | ||||||
|       WDT_Enable(WDT, value); |  | ||||||
|  |  | ||||||
|     #endif |  | ||||||
|  |  | ||||||
|     // Reset the watchdog |  | ||||||
|     WDT_Restart(WDT); |  | ||||||
|  |  | ||||||
|   #else |  | ||||||
|  |  | ||||||
|     // Make sure to completely disable the Watchdog |  | ||||||
|     WDT_Disable(WDT); |  | ||||||
|  |  | ||||||
|   #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|   // Initialize watchdog - On SAM3X, Watchdog was already configured |  | ||||||
|   //  and enabled or disabled at startup, so no need to reconfigure it |  | ||||||
|   //  here. |  | ||||||
|   void watchdog_init() { |  | ||||||
|     // Reset watchdog to start clean |  | ||||||
|     WDT_Restart(WDT); |  | ||||||
|   } |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
| @@ -1,33 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| // Arduino Due core now has watchdog support |  | ||||||
|  |  | ||||||
| #include "HAL.h" |  | ||||||
|  |  | ||||||
| // Initialize watchdog with a 4 second interrupt time |  | ||||||
| void watchdog_init(); |  | ||||||
|  |  | ||||||
| // Reset watchdog. MUST be called at least every 4 seconds after the |  | ||||||
| // first watchdog_init or AVR will go into emergency procedures. |  | ||||||
| inline void HAL_watchdog_refresh() { watchdogReset(); } |  | ||||||
| @@ -179,6 +179,31 @@ void _delay_ms(int delay_ms) { delay(delay_ms); } | |||||||
| // return free memory between end of heap (or end bss) and whatever is current | // return free memory between end of heap (or end bss) and whatever is current | ||||||
| int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); } | int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); } | ||||||
|  |  | ||||||
|  | // ------------------------ | ||||||
|  | // Watchdog Timer | ||||||
|  | // ------------------------ | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout | ||||||
|  |  | ||||||
|  |   extern "C" { | ||||||
|  |     esp_err_t esp_task_wdt_reset(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void watchdogSetup() { | ||||||
|  |     // do whatever. don't remove this function. | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     // TODO | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Reset watchdog. | ||||||
|  |   void MarlinHAL::watchdog_refresh() { esp_task_wdt_reset(); } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // ADC | // ADC | ||||||
| // ------------------------ | // ------------------------ | ||||||
|   | |||||||
| @@ -32,7 +32,6 @@ | |||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
|  |  | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
| #include "i2s.h" | #include "i2s.h" | ||||||
|  |  | ||||||
| #if ENABLED(WIFISUPPORT) | #if ENABLED(WIFISUPPORT) | ||||||
| @@ -172,6 +171,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init() {}        // Called early in setup() |   static void init() {}        // Called early in setup() | ||||||
|   static void init_board();    // Called less early in setup() |   static void init_board();    // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware |   static void reboot();        // Restart the firmware | ||||||
|   | |||||||
| @@ -1,42 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #ifdef ARDUINO_ARCH_ESP32 |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| void watchdogSetup() { |  | ||||||
|   // do whatever. don't remove this function. |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void watchdog_init() { |  | ||||||
|   // TODO |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
|  |  | ||||||
| #endif // ARDUINO_ARCH_ESP32 |  | ||||||
| @@ -1,38 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
|   extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   esp_err_t esp_task_wdt_reset(); |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // Initialize watchdog with a 4 second interrupt time |  | ||||||
| void watchdog_init(); |  | ||||||
|  |  | ||||||
| // Reset watchdog. |  | ||||||
| inline void HAL_watchdog_refresh() { esp_task_wdt_reset(); } |  | ||||||
| @@ -45,7 +45,3 @@ extern MarlinHAL hal; | |||||||
| #ifndef PGMSTR | #ifndef PGMSTR | ||||||
|   #define PGMSTR(NAM,STR) const char NAM[] = STR |   #define PGMSTR(NAM,STR) const char NAM[] = STR | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| inline void watchdog_refresh() { |  | ||||||
|   TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -21,6 +21,8 @@ | |||||||
|  */ |  */ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
|  | #include "../../inc/MarlinConfigPre.h" | ||||||
|  |  | ||||||
| #include <iostream> | #include <iostream> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| @@ -29,12 +31,10 @@ | |||||||
| #include <algorithm> | #include <algorithm> | ||||||
|  |  | ||||||
| #include "hardware/Clock.h" | #include "hardware/Clock.h" | ||||||
|  |  | ||||||
| #include "../shared/Marduino.h" | #include "../shared/Marduino.h" | ||||||
| #include "../shared/math_32bit.h" | #include "../shared/math_32bit.h" | ||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
| #include "serial.h" | #include "serial.h" | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| @@ -106,6 +106,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init() {} | ||||||
|  |   static void watchdog_refresh() {} | ||||||
|  |  | ||||||
|   static void init() {}        // Called early in setup() |   static void init() {}        // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Reset the application state and GPIO |   static void reboot();        // Reset the application state and GPIO | ||||||
|   | |||||||
| @@ -1,37 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #ifdef __PLAT_LINUX__ |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| void watchdog_init() {} |  | ||||||
| void HAL_watchdog_refresh() {} |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif // __PLAT_LINUX__ |  | ||||||
| @@ -1,25 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| void watchdog_init(); |  | ||||||
| void HAL_watchdog_refresh(); |  | ||||||
| @@ -25,10 +25,6 @@ | |||||||
| #include "../shared/Delay.h" | #include "../shared/Delay.h" | ||||||
| #include "../../../gcode/parser.h" | #include "../../../gcode/parser.h" | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|   #include "watchdog.h" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| DefaultSerial1 USBSerial(false, UsbSerial); | DefaultSerial1 USBSerial(false, UsbSerial); | ||||||
|  |  | ||||||
| uint32_t MarlinHAL::adc_result = 0; | uint32_t MarlinHAL::adc_result = 0; | ||||||
| @@ -61,9 +57,7 @@ uint8_t MarlinHAL::get_reset_source() { | |||||||
|   return RST_POWER_ON; |   return RST_POWER_ON; | ||||||
| } | } | ||||||
|  |  | ||||||
| void MarlinHAL::clear_reset_source() { | void MarlinHAL::clear_reset_source() { watchdog_clear_timeout_flag(); } | ||||||
|   TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void flashFirmware(const int16_t) { | void flashFirmware(const int16_t) { | ||||||
|   delay(500);          // Give OS time to disconnect |   delay(500);          // Give OS time to disconnect | ||||||
| @@ -72,6 +66,52 @@ void flashFirmware(const int16_t) { | |||||||
|   hal.reboot(); |   hal.reboot(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #include <lpc17xx_wdt.h> | ||||||
|  |  | ||||||
|  |   #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     #if ENABLED(WATCHDOG_RESET_MANUAL) | ||||||
|  |       // We enable the watchdog timer, but only for the interrupt. | ||||||
|  |  | ||||||
|  |       // Configure WDT to only trigger an interrupt | ||||||
|  |       // Disable WDT interrupt (just in case, to avoid triggering it!) | ||||||
|  |       NVIC_DisableIRQ(WDT_IRQn); | ||||||
|  |  | ||||||
|  |       // We NEED memory barriers to ensure Interrupts are actually disabled! | ||||||
|  |       // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) | ||||||
|  |       __DSB(); | ||||||
|  |       __ISB(); | ||||||
|  |  | ||||||
|  |       // Configure WDT to only trigger an interrupt | ||||||
|  |       // Initialize WDT with the given parameters | ||||||
|  |       WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_INT_ONLY); | ||||||
|  |  | ||||||
|  |       // Configure and enable WDT interrupt. | ||||||
|  |       NVIC_ClearPendingIRQ(WDT_IRQn); | ||||||
|  |       NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups | ||||||
|  |       NVIC_EnableIRQ(WDT_IRQn); | ||||||
|  |     #else | ||||||
|  |       WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET); | ||||||
|  |     #endif | ||||||
|  |     WDT_Start(WDT_TIMEOUT_US); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_refresh() { | ||||||
|  |     WDT_Feed(); | ||||||
|  |     #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) | ||||||
|  |       TOGGLE(LED_PIN);  // heartbeat indicator | ||||||
|  |     #endif | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Timeout state | ||||||
|  |   bool MarlinHAL::watchdog_timed_out() { return TEST(WDT_ReadTimeOutFlag(), 0); } | ||||||
|  |   void MarlinHAL::watchdog_clear_timeout_flag() { WDT_ClrTimeOutFlag(); } | ||||||
|  |  | ||||||
|  | #endif // USE_WATCHDOG | ||||||
|  |  | ||||||
| // For M42/M43, scan command line for pin code | // For M42/M43, scan command line for pin code | ||||||
| //   return index into pin map array if found and the pin is valid. | //   return index into pin map array if found and the pin is valid. | ||||||
| //   return dval if not found or not a valid pin. | //   return dval if not found or not a valid pin. | ||||||
|   | |||||||
| @@ -38,7 +38,6 @@ extern "C" volatile uint32_t _millis; | |||||||
| #include "../shared/math_32bit.h" | #include "../shared/math_32bit.h" | ||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
| #include "MarlinSerial.h" | #include "MarlinSerial.h" | ||||||
|  |  | ||||||
| #include <adc.h> | #include <adc.h> | ||||||
| @@ -210,6 +209,12 @@ public: | |||||||
|  |  | ||||||
|   static void delay_ms(const int ms) { _delay_ms(ms); } |   static void delay_ms(const int ms) { _delay_ms(ms); } | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static bool watchdog_timed_out() IF_DISABLED(USE_WATCHDOG, { return false; }); | ||||||
|  |   static void watchdog_clear_timeout_flag() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   // Tasks, called from idle() |   // Tasks, called from idle() | ||||||
|   static void idletask(); |   static void idletask(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,72 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #ifdef TARGET_LPC1768 |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #include <lpc17xx_wdt.h> |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| void watchdog_init() { |  | ||||||
|   #if ENABLED(WATCHDOG_RESET_MANUAL) |  | ||||||
|     // We enable the watchdog timer, but only for the interrupt. |  | ||||||
|  |  | ||||||
|     // Configure WDT to only trigger an interrupt |  | ||||||
|     // Disable WDT interrupt (just in case, to avoid triggering it!) |  | ||||||
|     NVIC_DisableIRQ(WDT_IRQn); |  | ||||||
|  |  | ||||||
|     // We NEED memory barriers to ensure Interrupts are actually disabled! |  | ||||||
|     // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) |  | ||||||
|     __DSB(); |  | ||||||
|     __ISB(); |  | ||||||
|  |  | ||||||
|     // Configure WDT to only trigger an interrupt |  | ||||||
|     // Initialize WDT with the given parameters |  | ||||||
|     WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_INT_ONLY); |  | ||||||
|  |  | ||||||
|     // Configure and enable WDT interrupt. |  | ||||||
|     NVIC_ClearPendingIRQ(WDT_IRQn); |  | ||||||
|     NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups |  | ||||||
|     NVIC_EnableIRQ(WDT_IRQn); |  | ||||||
|   #else |  | ||||||
|     WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET); |  | ||||||
|   #endif |  | ||||||
|   WDT_Start(WDT_TIMEOUT_US); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void HAL_watchdog_refresh() { |  | ||||||
|   WDT_Feed(); |  | ||||||
|   #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) |  | ||||||
|     TOGGLE(LED_PIN);  // heartbeat indicator |  | ||||||
|   #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Timeout state |  | ||||||
| bool watchdog_timed_out() { return TEST(WDT_ReadTimeOutFlag(), 0); } |  | ||||||
| void watchdog_clear_timeout_flag() { WDT_ClrTimeOutFlag(); } |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
| #endif // TARGET_LPC1768 |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| void watchdog_init(); |  | ||||||
| void HAL_watchdog_refresh(); |  | ||||||
|  |  | ||||||
| bool watchdog_timed_out(); |  | ||||||
| void watchdog_clear_timeout_flag(); |  | ||||||
| @@ -45,7 +45,6 @@ uint8_t _getc(); | |||||||
| #include "../shared/math_32bit.h" | #include "../shared/math_32bit.h" | ||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
| #include "serial.h" | #include "serial.h" | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| @@ -208,6 +207,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init() {}        // Called early in setup() |   static void init() {}        // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware from 0x0 |   static void reboot();        // Restart the firmware from 0x0 | ||||||
|   | |||||||
| @@ -1,27 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT   4000000 // 4 second timeout |  | ||||||
|  |  | ||||||
| void watchdog_init(); |  | ||||||
| void HAL_watchdog_refresh(); |  | ||||||
| @@ -203,6 +203,40 @@ enum ADCIndex { | |||||||
|   ADC_COUNT |   ADC_COUNT | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #define WDT_TIMEOUT_REG TERN(WATCHDOG_DURATION_8S, WDT_CONFIG_PER_CYC8192, WDT_CONFIG_PER_CYC4096) // 4 or 8 second timeout | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     // The low-power oscillator used by the WDT runs at 32,768 Hz with | ||||||
|  |     // a 1:32 prescale, thus 1024 Hz, though probably not super precise. | ||||||
|  |  | ||||||
|  |     // Setup WDT clocks | ||||||
|  |     MCLK->APBAMASK.bit.OSC32KCTRL_ = true; | ||||||
|  |     MCLK->APBAMASK.bit.WDT_ = true; | ||||||
|  |     OSC32KCTRL->OSCULP32K.bit.EN1K = true;  // Enable out 1K (this is what WDT uses) | ||||||
|  |  | ||||||
|  |     WDT->CTRLA.bit.ENABLE = false;          // Disable watchdog for config | ||||||
|  |     SYNC(WDT->SYNCBUSY.bit.ENABLE); | ||||||
|  |  | ||||||
|  |     WDT->INTENCLR.reg = WDT_INTENCLR_EW;    // Disable early warning interrupt | ||||||
|  |     WDT->CONFIG.reg = WDT_TIMEOUT_REG;      // Set a 4s or 8s period for chip reset | ||||||
|  |  | ||||||
|  |     hal.watchdog_refresh(); | ||||||
|  |  | ||||||
|  |     WDT->CTRLA.reg = WDT_CTRLA_ENABLE;      // Start watchdog now in normal mode | ||||||
|  |     SYNC(WDT->SYNCBUSY.bit.ENABLE); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Reset watchdog. MUST be called at least every 4 seconds after the | ||||||
|  |   // first watchdog_init or SAMD will go into emergency procedures. | ||||||
|  |   void MarlinHAL::watchdog_refresh() { | ||||||
|  |     SYNC(WDT->SYNCBUSY.bit.CLEAR);        // Test first if previous is 'ongoing' to save time waiting for command execution | ||||||
|  |     WDT->CLEAR.reg = WDT_CLEAR_CLEAR_KEY; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // Types | // Types | ||||||
| // ------------------------ | // ------------------------ | ||||||
|   | |||||||
| @@ -26,7 +26,6 @@ | |||||||
| #include "../shared/math_32bit.h" | #include "../shared/math_32bit.h" | ||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #ifdef ADAFRUIT_GRAND_CENTRAL_M4 | #ifdef ADAFRUIT_GRAND_CENTRAL_M4 | ||||||
|   #include "MarlinSerial_AGCM4.h" |   #include "MarlinSerial_AGCM4.h" | ||||||
| @@ -157,6 +156,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init();          // Called early in setup() |   static void init();          // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware from 0x0 |   static void reboot();        // Restart the firmware from 0x0 | ||||||
|   | |||||||
| @@ -1,54 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #ifdef __SAMD51__ |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT_REG TERN(WATCHDOG_DURATION_8S, WDT_CONFIG_PER_CYC8192, WDT_CONFIG_PER_CYC4096) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| void watchdog_init() { |  | ||||||
|   // The low-power oscillator used by the WDT runs at 32,768 Hz with |  | ||||||
|   // a 1:32 prescale, thus 1024 Hz, though probably not super precise. |  | ||||||
|  |  | ||||||
|   // Setup WDT clocks |  | ||||||
|   MCLK->APBAMASK.bit.OSC32KCTRL_ = true; |  | ||||||
|   MCLK->APBAMASK.bit.WDT_ = true; |  | ||||||
|   OSC32KCTRL->OSCULP32K.bit.EN1K = true;      // Enable out 1K (this is what WDT uses) |  | ||||||
|  |  | ||||||
|   WDT->CTRLA.bit.ENABLE = false;              // Disable watchdog for config |  | ||||||
|   SYNC(WDT->SYNCBUSY.bit.ENABLE); |  | ||||||
|  |  | ||||||
|   WDT->INTENCLR.reg = WDT_INTENCLR_EW;        // Disable early warning interrupt |  | ||||||
|   WDT->CONFIG.reg = WDT_TIMEOUT_REG;          // Set a 4s or 8s period for chip reset |  | ||||||
|  |  | ||||||
|   HAL_watchdog_refresh(); |  | ||||||
|  |  | ||||||
|   WDT->CTRLA.reg = WDT_CTRLA_ENABLE;          // Start watchdog now in normal mode |  | ||||||
|   SYNC(WDT->SYNCBUSY.bit.ENABLE); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
|  |  | ||||||
| #endif // __SAMD51__ |  | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| // Initialize watchdog with a 4 second interrupt time |  | ||||||
| void watchdog_init(); |  | ||||||
|  |  | ||||||
| // Reset watchdog. MUST be called at least every 4 seconds after the |  | ||||||
| // first watchdog_init or SAMD will go into emergency procedures. |  | ||||||
| inline void HAL_watchdog_refresh() { |  | ||||||
|   SYNC(WDT->SYNCBUSY.bit.CLEAR);        // Test first if previous is 'ongoing' to save time waiting for command execution |  | ||||||
|   WDT->CLEAR.reg = WDT_CLEAR_CLEAR_KEY; |  | ||||||
| } |  | ||||||
| @@ -140,6 +140,29 @@ uint8_t MarlinHAL::get_reset_source() { | |||||||
|  |  | ||||||
| void MarlinHAL::clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } | void MarlinHAL::clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } | ||||||
|  |  | ||||||
|  | // ------------------------ | ||||||
|  | // Watchdog Timer | ||||||
|  | // ------------------------ | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout | ||||||
|  |  | ||||||
|  |   #include <IWatchdog.h> | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     IF_DISABLED(DISABLE_WATCHDOG_INIT, IWatchdog.begin(WDT_TIMEOUT_US)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_refresh() { | ||||||
|  |     IWatchdog.reload(); | ||||||
|  |     #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) | ||||||
|  |       TOGGLE(LED_PIN);  // heartbeat indicator | ||||||
|  |     #endif | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| extern "C" { | extern "C" { | ||||||
|   extern unsigned int _ebss; // end of bss section |   extern unsigned int _ebss; // end of bss section | ||||||
| } | } | ||||||
|   | |||||||
| @@ -30,7 +30,6 @@ | |||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "Servo.h" | #include "Servo.h" | ||||||
| #include "watchdog.h" |  | ||||||
| #include "MarlinSerial.h" | #include "MarlinSerial.h" | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfigPre.h" | #include "../../inc/MarlinConfigPre.h" | ||||||
| @@ -218,6 +217,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init();          // Called early in setup() |   static void init();          // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware from 0x0 |   static void reboot();        // Restart the firmware from 0x0 | ||||||
|   | |||||||
| @@ -29,7 +29,6 @@ | |||||||
| #if ENABLED(POSTMORTEM_DEBUGGING) | #if ENABLED(POSTMORTEM_DEBUGGING) | ||||||
|  |  | ||||||
| #include "../shared/MinSerial.h" | #include "../shared/MinSerial.h" | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| /* Instruction Synchronization Barrier */ | /* Instruction Synchronization Barrier */ | ||||||
| #define isb() __asm__ __volatile__ ("isb" : : : "memory") | #define isb() __asm__ __volatile__ ("isb" : : : "memory") | ||||||
| @@ -120,7 +119,7 @@ static void TX(char c) { | |||||||
|   #if WITHIN(SERIAL_PORT, 1, 6) |   #if WITHIN(SERIAL_PORT, 1, 6) | ||||||
|     constexpr uint32_t usart_sr_txe = _BV(7); |     constexpr uint32_t usart_sr_txe = _BV(7); | ||||||
|     while (!(regs->SR & usart_sr_txe)) { |     while (!(regs->SR & usart_sr_txe)) { | ||||||
|       TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); |       hal.watchdog_refresh(); | ||||||
|       sw_barrier(); |       sw_barrier(); | ||||||
|     } |     } | ||||||
|     regs->DR = c; |     regs->DR = c; | ||||||
|   | |||||||
| @@ -57,7 +57,7 @@ public: | |||||||
|     auto sd2card = diskIODriver(); |     auto sd2card = diskIODriver(); | ||||||
|     // single block |     // single block | ||||||
|     if (blkLen == 1) { |     if (blkLen == 1) { | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       sd2card->writeBlock(blkAddr, pBuf); |       sd2card->writeBlock(blkAddr, pBuf); | ||||||
|       return true; |       return true; | ||||||
|     } |     } | ||||||
| @@ -65,7 +65,7 @@ public: | |||||||
|     // multi block optimization |     // multi block optimization | ||||||
|     sd2card->writeStart(blkAddr, blkLen); |     sd2card->writeStart(blkAddr, blkLen); | ||||||
|     while (blkLen--) { |     while (blkLen--) { | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       sd2card->writeData(pBuf); |       sd2card->writeData(pBuf); | ||||||
|       pBuf += BLOCK_SIZE; |       pBuf += BLOCK_SIZE; | ||||||
|     } |     } | ||||||
| @@ -77,7 +77,7 @@ public: | |||||||
|     auto sd2card = diskIODriver(); |     auto sd2card = diskIODriver(); | ||||||
|     // single block |     // single block | ||||||
|     if (blkLen == 1) { |     if (blkLen == 1) { | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       sd2card->readBlock(blkAddr, pBuf); |       sd2card->readBlock(blkAddr, pBuf); | ||||||
|       return true; |       return true; | ||||||
|     } |     } | ||||||
| @@ -85,7 +85,7 @@ public: | |||||||
|     // multi block optimization |     // multi block optimization | ||||||
|     sd2card->readStart(blkAddr); |     sd2card->readStart(blkAddr); | ||||||
|     while (blkLen--) { |     while (blkLen--) { | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       sd2card->readData(pBuf); |       sd2card->readData(pBuf); | ||||||
|       pBuf += BLOCK_SIZE; |       pBuf += BLOCK_SIZE; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -208,7 +208,7 @@ bool SDIO_Init() { | |||||||
|  |  | ||||||
|   uint8_t retry_Cnt = retryCnt; |   uint8_t retry_Cnt = retryCnt; | ||||||
|   for (;;) { |   for (;;) { | ||||||
|     TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); |     hal.watchdog_refresh(); | ||||||
|     status = (bool) HAL_SD_Init(&hsd); |     status = (bool) HAL_SD_Init(&hsd); | ||||||
|     if (!status) break; |     if (!status) break; | ||||||
|     if (!--retry_Cnt) return false;   // return failing status if retries are exhausted |     if (!--retry_Cnt) return false;   // return failing status if retries are exhausted | ||||||
| @@ -219,7 +219,7 @@ bool SDIO_Init() { | |||||||
|   #if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // go to 4 bit wide mode if pins are defined |   #if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // go to 4 bit wide mode if pins are defined | ||||||
|     retry_Cnt = retryCnt; |     retry_Cnt = retryCnt; | ||||||
|     for (;;) { |     for (;;) { | ||||||
|       TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); |       hal.watchdog_refresh(); | ||||||
|       if (!HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)) break;  // some cards are only 1 bit wide so a pass here is not required |       if (!HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)) break;  // some cards are only 1 bit wide so a pass here is not required | ||||||
|       if (!--retry_Cnt) break; |       if (!--retry_Cnt) break; | ||||||
|     } |     } | ||||||
| @@ -228,7 +228,7 @@ bool SDIO_Init() { | |||||||
|       SD_LowLevel_Init(); |       SD_LowLevel_Init(); | ||||||
|       retry_Cnt = retryCnt; |       retry_Cnt = retryCnt; | ||||||
|       for (;;) { |       for (;;) { | ||||||
|         TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); |         hal.watchdog_refresh(); | ||||||
|         status = (bool) HAL_SD_Init(&hsd); |         status = (bool) HAL_SD_Init(&hsd); | ||||||
|         if (!status) break; |         if (!status) break; | ||||||
|         if (!--retry_Cnt) return false;   // return failing status if retries are exhausted |         if (!--retry_Cnt) return false;   // return failing status if retries are exhausted | ||||||
| @@ -243,7 +243,7 @@ bool SDIO_Init() { | |||||||
| static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t *src, uint8_t *dst) { | static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t *src, uint8_t *dst) { | ||||||
|   if (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false; |   if (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false; | ||||||
|  |  | ||||||
|   TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); |   hal.watchdog_refresh(); | ||||||
|  |  | ||||||
|   HAL_StatusTypeDef ret; |   HAL_StatusTypeDef ret; | ||||||
|   if (src) { |   if (src) { | ||||||
|   | |||||||
| @@ -1,52 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "../platforms.h" |  | ||||||
|  |  | ||||||
| #ifdef HAL_STM32 |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfigPre.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #include "watchdog.h" |  | ||||||
| #include <IWatchdog.h> |  | ||||||
|  |  | ||||||
| void watchdog_init() { |  | ||||||
|   #if DISABLED(DISABLE_WATCHDOG_INIT) |  | ||||||
|     IWatchdog.begin(WDT_TIMEOUT_US); |  | ||||||
|   #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void HAL_watchdog_refresh() { |  | ||||||
|   IWatchdog.reload(); |  | ||||||
|   #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) |  | ||||||
|     TOGGLE(LED_PIN);  // heartbeat indicator |  | ||||||
|   #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
| #endif // HAL_STM32 |  | ||||||
| @@ -1,25 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| void watchdog_init(); |  | ||||||
| void HAL_watchdog_refresh(); |  | ||||||
| @@ -113,6 +113,47 @@ | |||||||
|   #endif |   #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | // ------------------------ | ||||||
|  | // Watchdog Timer | ||||||
|  | // ------------------------ | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #include <libmaple/iwdg.h> | ||||||
|  |  | ||||||
|  |   void watchdogSetup() { | ||||||
|  |     // do whatever. don't remove this function. | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    *  The watchdog clock is 40Khz. So for a 4s or 8s interval use a /256 preescaler and 625 or 1250 reload value (counts down to 0). | ||||||
|  |    */ | ||||||
|  |   #define STM32F1_WD_RELOAD TERN(WATCHDOG_DURATION_8S, 1250, 625) // 4 or 8 second timeout | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * @brief  Initialize the independent hardware watchdog. | ||||||
|  |    * | ||||||
|  |    * @return No return | ||||||
|  |    * | ||||||
|  |    * @details The watchdog clock is 40Khz. So for a 4s or 8s interval use a /256 preescaler and 625 or 1250 reload value (counts down to 0). | ||||||
|  |    */ | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     #if DISABLED(DISABLE_WATCHDOG_INIT) | ||||||
|  |       iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); | ||||||
|  |     #endif | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Reset watchdog. MUST be called every 4 or 8 seconds after the | ||||||
|  |   // first watchdog_init or the STM32F1 will reset. | ||||||
|  |   void MarlinHAL::watchdog_refresh() { | ||||||
|  |     #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) | ||||||
|  |       TOGGLE(LED_PIN);  // heartbeat indicator | ||||||
|  |     #endif | ||||||
|  |     iwdg_feed(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #endif // USE_WATCHDOG | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // ADC | // ADC | ||||||
| // ------------------------ | // ------------------------ | ||||||
|   | |||||||
| @@ -34,7 +34,6 @@ | |||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
|  |  | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <util/atomic.h> | #include <util/atomic.h> | ||||||
| @@ -247,6 +246,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init();          // Called early in setup() |   static void init();          // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware from 0x0 |   static void reboot();        // Restart the firmware from 0x0 | ||||||
|   | |||||||
| @@ -27,7 +27,6 @@ | |||||||
| #if ENABLED(POSTMORTEM_DEBUGGING) | #if ENABLED(POSTMORTEM_DEBUGGING) | ||||||
|  |  | ||||||
| #include "../shared/MinSerial.h" | #include "../shared/MinSerial.h" | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #include <libmaple/usart.h> | #include <libmaple/usart.h> | ||||||
| #include <libmaple/rcc.h> | #include <libmaple/rcc.h> | ||||||
| @@ -82,7 +81,7 @@ static void TX(char c) { | |||||||
|   #if WITHIN(SERIAL_PORT, 1, 6) |   #if WITHIN(SERIAL_PORT, 1, 6) | ||||||
|     struct usart_dev* dev = MYSERIAL1.c_dev(); |     struct usart_dev* dev = MYSERIAL1.c_dev(); | ||||||
|     while (!(dev->regs->SR & USART_SR_TXE)) { |     while (!(dev->regs->SR & USART_SR_TXE)) { | ||||||
|       TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); |       hal.watchdog_refresh(); | ||||||
|       sw_barrier(); |       sw_barrier(); | ||||||
|     } |     } | ||||||
|     dev->regs->DR = c; |     dev->regs->DR = c; | ||||||
|   | |||||||
| @@ -1,66 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #ifdef __STM32F1__ |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #include <libmaple/iwdg.h> |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  *  The watchdog clock is 40Khz. So for a 4s or 8s interval use a /256 preescaler and 625 or 1250 reload value (counts down to 0). |  | ||||||
|  */ |  | ||||||
| #define STM32F1_WD_RELOAD TERN(WATCHDOG_DURATION_8S, 1250, 625) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| void HAL_watchdog_refresh() { |  | ||||||
|   #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) |  | ||||||
|     TOGGLE(LED_PIN);  // heartbeat indicator |  | ||||||
|   #endif |  | ||||||
|   iwdg_feed(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void watchdogSetup() { |  | ||||||
|   // do whatever. don't remove this function. |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief  Initialized the independent hardware watchdog. |  | ||||||
|  * |  | ||||||
|  * @return No return |  | ||||||
|  * |  | ||||||
|  * @details The watchdog clock is 40Khz. So for a 4s or 8s interval use a /256 preescaler and 625 or 1250 reload value (counts down to 0). |  | ||||||
|  */ |  | ||||||
| void watchdog_init() { |  | ||||||
|   #if DISABLED(DISABLE_WATCHDOG_INIT) |  | ||||||
|     iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); |  | ||||||
|   #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
| #endif // __STM32F1__ |  | ||||||
| @@ -1,35 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include <libmaple/iwdg.h> |  | ||||||
|  |  | ||||||
| // Initialize watchdog with a 4 or 8 second countdown time |  | ||||||
| void watchdog_init(); |  | ||||||
|  |  | ||||||
| // Reset watchdog. MUST be called every 4 or 8 seconds after the |  | ||||||
| // first watchdog_init or the STM32F1 will reset. |  | ||||||
| void HAL_watchdog_refresh(); |  | ||||||
| @@ -62,6 +62,28 @@ uint8_t MarlinHAL::get_reset_source() { | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ------------------------ | ||||||
|  | // Watchdog Timer | ||||||
|  | // ------------------------ | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #define WDT_TIMEOUT_MS TERN(WATCHDOG_DURATION_8S, 8000, 4000) // 4 or 8 second timeout | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     WDOG_TOVALH = 0; | ||||||
|  |     WDOG_TOVALL = WDT_TIMEOUT_MS; | ||||||
|  |     WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_refresh() { | ||||||
|  |     // Watchdog refresh sequence | ||||||
|  |     WDOG_REFRESH = 0xA602; | ||||||
|  |     WDOG_REFRESH = 0xB480; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // ADC | // ADC | ||||||
| // ------------------------ | // ------------------------ | ||||||
|   | |||||||
| @@ -32,7 +32,6 @@ | |||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
|  |  | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
|  |  | ||||||
| @@ -135,6 +134,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init() {}        // Called early in setup() |   static void init() {}        // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware from 0x0 |   static void reboot();        // Restart the firmware from 0x0 | ||||||
|   | |||||||
| @@ -1,40 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #ifdef __MK20DX256__ |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT_MS TERN(WATCHDOG_DURATION_8S, 8000, 4000) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| void watchdog_init() { |  | ||||||
|   WDOG_TOVALH = 0; |  | ||||||
|   WDOG_TOVALL = WDT_TIMEOUT_MS; |  | ||||||
|   WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
|  |  | ||||||
| #endif // __MK20DX256__ |  | ||||||
| @@ -1,34 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #include "HAL.h" |  | ||||||
|  |  | ||||||
| // Arduino Due core now has watchdog support |  | ||||||
|  |  | ||||||
| void watchdog_init(); |  | ||||||
|  |  | ||||||
| inline void HAL_watchdog_refresh() { |  | ||||||
|   // Watchdog refresh sequence |  | ||||||
|   WDOG_REFRESH = 0xA602; |  | ||||||
|   WDOG_REFRESH = 0xB480; |  | ||||||
| } |  | ||||||
| @@ -61,6 +61,28 @@ uint8_t MarlinHAL::get_reset_source() { | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ------------------------ | ||||||
|  | // Watchdog Timer | ||||||
|  | // ------------------------ | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #define WDT_TIMEOUT_MS TERN(WATCHDOG_DURATION_8S, 8000, 4000) // 4 or 8 second timeout | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     WDOG_TOVALH = 0; | ||||||
|  |     WDOG_TOVALL = WDT_TIMEOUT_MS; | ||||||
|  |     WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_refresh() { | ||||||
|  |     // Watchdog refresh sequence | ||||||
|  |     WDOG_REFRESH = 0xA602; | ||||||
|  |     WDOG_REFRESH = 0xB480; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // ADC | // ADC | ||||||
| // ------------------------ | // ------------------------ | ||||||
|   | |||||||
| @@ -32,7 +32,6 @@ | |||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
|  |  | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <util/atomic.h> | #include <util/atomic.h> | ||||||
| @@ -140,6 +139,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init() {}        // Called early in setup() |   static void init() {}        // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware from 0x0 |   static void reboot();        // Restart the firmware from 0x0 | ||||||
|   | |||||||
| @@ -1,40 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #if defined(__MK64FX512__) || defined(__MK66FX1M0__) |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT_MS TERN(WATCHDOG_DURATION_8S, 8000, 4000) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| void watchdog_init() { |  | ||||||
|   WDOG_TOVALH = 0; |  | ||||||
|   WDOG_TOVALL = WDT_TIMEOUT_MS; |  | ||||||
|   WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
|  |  | ||||||
| #endif // __MK64FX512__ || __MK66FX1M0__ |  | ||||||
| @@ -1,30 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| void watchdog_init(); |  | ||||||
|  |  | ||||||
| inline void HAL_watchdog_refresh() { |  | ||||||
|   // Watchdog refresh sequence |  | ||||||
|   WDOG_REFRESH = 0xA602; |  | ||||||
|   WDOG_REFRESH = 0xB480; |  | ||||||
| } |  | ||||||
| @@ -78,6 +78,31 @@ void MarlinHAL::clear_reset_source() { | |||||||
|   SRC_SRSR = reset_source; |   SRC_SRSR = reset_source; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ------------------------ | ||||||
|  | // Watchdog Timer | ||||||
|  | // ------------------------ | ||||||
|  |  | ||||||
|  | #if ENABLED(USE_WATCHDOG) | ||||||
|  |  | ||||||
|  |   #define WDT_TIMEOUT TERN(WATCHDOG_DURATION_8S, 8, 4) // 4 or 8 second timeout | ||||||
|  |  | ||||||
|  |   constexpr uint8_t timeoutval = (WDT_TIMEOUT - 0.5f) / 0.5f; | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_init() { | ||||||
|  |     CCM_CCGR3 |= CCM_CCGR3_WDOG1(3);  // enable WDOG1 clocks | ||||||
|  |     WDOG1_WMCR = 0;                   // disable power down PDE | ||||||
|  |     WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval); | ||||||
|  |     WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void MarlinHAL::watchdog_refresh() { | ||||||
|  |     // Watchdog refresh sequence | ||||||
|  |     WDOG1_WSR = 0x5555; | ||||||
|  |     WDOG1_WSR = 0xAAAA; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // ADC | // ADC | ||||||
| // ------------------------ | // ------------------------ | ||||||
|   | |||||||
| @@ -32,7 +32,6 @@ | |||||||
| #include "../shared/HAL_SPI.h" | #include "../shared/HAL_SPI.h" | ||||||
|  |  | ||||||
| #include "fastio.h" | #include "fastio.h" | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <util/atomic.h> | #include <util/atomic.h> | ||||||
| @@ -162,6 +161,10 @@ public: | |||||||
|   // Earliest possible init, before setup() |   // Earliest possible init, before setup() | ||||||
|   MarlinHAL() {} |   MarlinHAL() {} | ||||||
|  |  | ||||||
|  |   // Watchdog | ||||||
|  |   static void watchdog_init()    IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |   static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); | ||||||
|  |  | ||||||
|   static void init() {}        // Called early in setup() |   static void init() {}        // Called early in setup() | ||||||
|   static void init_board() {}  // Called less early in setup() |   static void init_board() {}  // Called less early in setup() | ||||||
|   static void reboot();        // Restart the firmware from 0x0 |   static void reboot();        // Restart the firmware from 0x0 | ||||||
|   | |||||||
| @@ -1,52 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #ifdef __IMXRT1062__ |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "../../inc/MarlinConfig.h" |  | ||||||
|  |  | ||||||
| #if ENABLED(USE_WATCHDOG) |  | ||||||
|  |  | ||||||
| #include "watchdog.h" |  | ||||||
|  |  | ||||||
| #define WDT_TIMEOUT TERN(WATCHDOG_DURATION_8S, 8, 4) // 4 or 8 second timeout |  | ||||||
|  |  | ||||||
| constexpr uint8_t timeoutval = (WDT_TIMEOUT - 0.5f) / 0.5f; |  | ||||||
|  |  | ||||||
| void watchdog_init() { |  | ||||||
|   CCM_CCGR3 |= CCM_CCGR3_WDOG1(3);  // enable WDOG1 clocks |  | ||||||
|   WDOG1_WMCR = 0;                   // disable power down PDE |  | ||||||
|   WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval); |  | ||||||
|   WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void HAL_watchdog_refresh() { |  | ||||||
|   // Watchdog refresh sequence |  | ||||||
|   WDOG1_WSR = 0x5555; |  | ||||||
|   WDOG1_WSR = 0xAAAA; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif // USE_WATCHDOG |  | ||||||
| #endif // __IMXRT1062__ |  | ||||||
| @@ -1,30 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Marlin 3D Printer Firmware |  | ||||||
|  * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] |  | ||||||
|  * |  | ||||||
|  * Based on Sprinter and grbl. |  | ||||||
|  * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| void watchdog_init(); |  | ||||||
|  |  | ||||||
| void HAL_watchdog_refresh(); |  | ||||||
| @@ -221,7 +221,7 @@ bool resume_from_fault() { | |||||||
|   // So we'll just need to refresh the watchdog for a while and then stop for the system to reboot |   // So we'll just need to refresh the watchdog for a while and then stop for the system to reboot | ||||||
|   uint32_t last = start; |   uint32_t last = start; | ||||||
|   while (PENDING(last, end)) { |   while (PENDING(last, end)) { | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|     while (millis() == last) { /* nada */ } |     while (millis() == last) { /* nada */ } | ||||||
|     last = millis(); |     last = millis(); | ||||||
|     MinSerial::TX('.'); |     MinSerial::TX('.'); | ||||||
|   | |||||||
| @@ -931,18 +931,18 @@ void minkill(const bool steppers_off/*=false*/) { | |||||||
|  |  | ||||||
|     // Wait for both KILL and ENC to be released |     // Wait for both KILL and ENC to be released | ||||||
|     while (TERN0(HAS_KILL, kill_state()) || TERN0(SOFT_RESET_ON_KILL, ui.button_pressed())) |     while (TERN0(HAS_KILL, kill_state()) || TERN0(SOFT_RESET_ON_KILL, ui.button_pressed())) | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|  |  | ||||||
|     // Wait for either KILL or ENC to be pressed again |     // Wait for either KILL or ENC to be pressed again | ||||||
|     while (TERN1(HAS_KILL, !kill_state()) && TERN1(SOFT_RESET_ON_KILL, !ui.button_pressed())) |     while (TERN1(HAS_KILL, !kill_state()) && TERN1(SOFT_RESET_ON_KILL, !ui.button_pressed())) | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|  |  | ||||||
|     // Reboot the board |     // Reboot the board | ||||||
|     hal.reboot(); |     hal.reboot(); | ||||||
|  |  | ||||||
|   #else |   #else | ||||||
|  |  | ||||||
|     for (;;) watchdog_refresh();  // Wait for RESET button or power-cycle |     for (;;) hal.watchdog_refresh();  // Wait for RESET button or power-cycle | ||||||
|  |  | ||||||
|   #endif |   #endif | ||||||
| } | } | ||||||
| @@ -1549,7 +1549,7 @@ void setup() { | |||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|   #if ENABLED(USE_WATCHDOG) |   #if ENABLED(USE_WATCHDOG) | ||||||
|     SETUP_RUN(watchdog_init());       // Reinit watchdog after hal.get_reset_source call |     SETUP_RUN(hal.watchdog_init());   // Reinit watchdog after hal.get_reset_source call | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|   #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) |   #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||||
|   | |||||||
| @@ -69,7 +69,7 @@ inline void toggle_pins() { | |||||||
|       SERIAL_EOL(); |       SERIAL_EOL(); | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       report_pin_state_extended(pin, ignore_protection, true, F("Pulsing   ")); |       report_pin_state_extended(pin, ignore_protection, true, F("Pulsing   ")); | ||||||
|       #ifdef __STM32F1__ |       #ifdef __STM32F1__ | ||||||
|         const auto prior_mode = _GET_MODE(i); |         const auto prior_mode = _GET_MODE(i); | ||||||
| @@ -98,10 +98,10 @@ inline void toggle_pins() { | |||||||
|       { |       { | ||||||
|         pinMode(pin, OUTPUT); |         pinMode(pin, OUTPUT); | ||||||
|         for (int16_t j = 0; j < repeat; j++) { |         for (int16_t j = 0; j < repeat; j++) { | ||||||
|           watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); |           hal.watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); | ||||||
|           watchdog_refresh(); extDigitalWrite(pin, 1); safe_delay(wait); |           hal.watchdog_refresh(); extDigitalWrite(pin, 1); safe_delay(wait); | ||||||
|           watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); |           hal.watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); | ||||||
|           watchdog_refresh(); |           hal.watchdog_refresh(); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       #ifdef __STM32F1__ |       #ifdef __STM32F1__ | ||||||
|   | |||||||
| @@ -309,7 +309,6 @@ void GcodeSuite::M917() { | |||||||
|         } |         } | ||||||
|         DEBUG_ECHOLNPGM("."); |         DEBUG_ECHOLNPGM("."); | ||||||
|         reset_stepper_timeout(); // keep steppers powered |         reset_stepper_timeout(); // keep steppers powered | ||||||
|         watchdog_refresh(); |  | ||||||
|         safe_delay(5000); |         safe_delay(5000); | ||||||
|         status_composite_temp = 0; |         status_composite_temp = 0; | ||||||
|         for (j = 0; j < driver_count; j++) { |         for (j = 0; j < driver_count; j++) { | ||||||
|   | |||||||
| @@ -214,7 +214,7 @@ void GcodeSuite::D(const int16_t dcode) { | |||||||
|  |  | ||||||
|         c = 1024 * 4; |         c = 1024 * 4; | ||||||
|         while (c--) { |         while (c--) { | ||||||
|           TERN_(USE_WATCHDOG, watchdog_refresh()); |           hal.watchdog_refresh(); | ||||||
|           card.write(buf, COUNT(buf)); |           card.write(buf, COUNT(buf)); | ||||||
|         } |         } | ||||||
|         SERIAL_ECHOLNPGM(" done"); |         SERIAL_ECHOLNPGM(" done"); | ||||||
| @@ -231,7 +231,7 @@ void GcodeSuite::D(const int16_t dcode) { | |||||||
|         __attribute__((aligned(sizeof(size_t)))) uint8_t buf[512]; |         __attribute__((aligned(sizeof(size_t)))) uint8_t buf[512]; | ||||||
|         uint16_t c = 1024 * 4; |         uint16_t c = 1024 * 4; | ||||||
|         while (c--) { |         while (c--) { | ||||||
|           TERN_(USE_WATCHDOG, watchdog_refresh()); |           hal.watchdog_refresh(); | ||||||
|           card.read(buf, COUNT(buf)); |           card.read(buf, COUNT(buf)); | ||||||
|           bool error = false; |           bool error = false; | ||||||
|           for (uint16_t i = 0; i < COUNT(buf); i++) { |           for (uint16_t i = 0; i < COUNT(buf); i++) { | ||||||
|   | |||||||
| @@ -74,7 +74,7 @@ void MeshViewerClass::DrawMesh(bed_mesh_t zval, const uint8_t sizex, const uint8 | |||||||
|   LOOP_S_L_N(x, 1, sizex - 1) DrawMeshVLine(x); |   LOOP_S_L_N(x, 1, sizex - 1) DrawMeshVLine(x); | ||||||
|   LOOP_S_L_N(y, 1, sizey - 1) DrawMeshHLine(y); |   LOOP_S_L_N(y, 1, sizey - 1) DrawMeshHLine(y); | ||||||
|   LOOP_L_N(y, sizey) { |   LOOP_L_N(y, sizey) { | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|     LOOP_L_N(x, sizex) { |     LOOP_L_N(x, sizex) { | ||||||
|       uint16_t color = DWINUI::RainbowInt(zmesh[x][y], _MIN(-5, minz), _MAX(5, maxz)); |       uint16_t color = DWINUI::RainbowInt(zmesh[x][y], _MIN(-5, minz), _MAX(5, maxz)); | ||||||
|       uint8_t radius = rm(zmesh[x][y]); |       uint8_t radius = rm(zmesh[x][y]); | ||||||
|   | |||||||
| @@ -402,7 +402,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { | |||||||
|     char temp_test[200]; |     char temp_test[200]; | ||||||
|     volatile uint16_t *p_index; |     volatile uint16_t *p_index; | ||||||
|  |  | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|     memset(public_buf, 0, 200); |     memset(public_buf, 0, 200); | ||||||
|  |  | ||||||
|     while (card.isFileOpen()) { |     while (card.isFileOpen()) { | ||||||
|   | |||||||
| @@ -104,7 +104,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { | |||||||
|       sync_plan_position(); |       sync_plan_position(); | ||||||
|       // Raise Z as if it was homed |       // Raise Z as if it was homed | ||||||
|       do_z_clearance(Z_POST_CLEARANCE); |       do_z_clearance(Z_POST_CLEARANCE); | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       draw_return_ui(); |       draw_return_ui(); | ||||||
|       return; |       return; | ||||||
|     case ID_M_RETURN: |     case ID_M_RETURN: | ||||||
| @@ -117,7 +117,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { | |||||||
|       #else // Otherwise do a Z clearance move like after Homing |       #else // Otherwise do a Z clearance move like after Homing | ||||||
|         do_z_clearance(Z_POST_CLEARANCE); |         do_z_clearance(Z_POST_CLEARANCE); | ||||||
|       #endif |       #endif | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       draw_return_ui(); |       draw_return_ui(); | ||||||
|       return; |       return; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -267,12 +267,12 @@ void spiFlashErase_PIC() { | |||||||
|   W25QXX.init(SPI_QUARTER_SPEED); |   W25QXX.init(SPI_QUARTER_SPEED); | ||||||
|   // erase 0x001000 -64K |   // erase 0x001000 -64K | ||||||
|   for (pic_sectorcnt = 0; pic_sectorcnt < (64 - 4) / 4; pic_sectorcnt++) { |   for (pic_sectorcnt = 0; pic_sectorcnt < (64 - 4) / 4; pic_sectorcnt++) { | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|     W25QXX.SPI_FLASH_SectorErase(PICINFOADDR + pic_sectorcnt * 4 * 1024); |     W25QXX.SPI_FLASH_SectorErase(PICINFOADDR + pic_sectorcnt * 4 * 1024); | ||||||
|   } |   } | ||||||
|   // erase 64K -- 6M |   // erase 64K -- 6M | ||||||
|   for (pic_sectorcnt = 0; pic_sectorcnt < (PIC_SIZE_xM * 1024 / 64 - 1); pic_sectorcnt++) { |   for (pic_sectorcnt = 0; pic_sectorcnt < (PIC_SIZE_xM * 1024 / 64 - 1); pic_sectorcnt++) { | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|     W25QXX.SPI_FLASH_BlockErase((pic_sectorcnt + 1) * 64 * 1024); |     W25QXX.SPI_FLASH_BlockErase((pic_sectorcnt + 1) * 64 * 1024); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -282,7 +282,7 @@ void spiFlashErase_PIC() { | |||||||
|     volatile uint32_t Font_sectorcnt = 0; |     volatile uint32_t Font_sectorcnt = 0; | ||||||
|     W25QXX.init(SPI_QUARTER_SPEED); |     W25QXX.init(SPI_QUARTER_SPEED); | ||||||
|     for (Font_sectorcnt = 0; Font_sectorcnt < 32 - 1; Font_sectorcnt++) { |     for (Font_sectorcnt = 0; Font_sectorcnt < 32 - 1; Font_sectorcnt++) { | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024); |       W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -414,7 +414,7 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|     disp_assets_update_progress(fn); |     disp_assets_update_progress(fn); | ||||||
|  |  | ||||||
|     W25QXX.init(SPI_QUARTER_SPEED); |     W25QXX.init(SPI_QUARTER_SPEED); | ||||||
| @@ -427,21 +427,21 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { | |||||||
|     totalSizeLoaded += pfileSize; |     totalSizeLoaded += pfileSize; | ||||||
|     if (assetType == ASSET_TYPE_LOGO) { |     if (assetType == ASSET_TYPE_LOGO) { | ||||||
|       do { |       do { | ||||||
|         watchdog_refresh(); |         hal.watchdog_refresh(); | ||||||
|         pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); |         pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); | ||||||
|         Pic_Logo_Write((uint8_t*)fn, public_buf, pbr); |         Pic_Logo_Write((uint8_t*)fn, public_buf, pbr); | ||||||
|       } while (pbr >= BMP_WRITE_BUF_LEN); |       } while (pbr >= BMP_WRITE_BUF_LEN); | ||||||
|     } |     } | ||||||
|     else if (assetType == ASSET_TYPE_TITLE_LOGO) { |     else if (assetType == ASSET_TYPE_TITLE_LOGO) { | ||||||
|       do { |       do { | ||||||
|         watchdog_refresh(); |         hal.watchdog_refresh(); | ||||||
|         pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); |         pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); | ||||||
|         Pic_TitleLogo_Write((uint8_t*)fn, public_buf, pbr); |         Pic_TitleLogo_Write((uint8_t*)fn, public_buf, pbr); | ||||||
|       } while (pbr >= BMP_WRITE_BUF_LEN); |       } while (pbr >= BMP_WRITE_BUF_LEN); | ||||||
|     } |     } | ||||||
|     else if (assetType == ASSET_TYPE_G_PREVIEW) { |     else if (assetType == ASSET_TYPE_G_PREVIEW) { | ||||||
|       do { |       do { | ||||||
|         watchdog_refresh(); |         hal.watchdog_refresh(); | ||||||
|         pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); |         pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); | ||||||
|         default_view_Write(public_buf, pbr); |         default_view_Write(public_buf, pbr); | ||||||
|       } while (pbr >= BMP_WRITE_BUF_LEN); |       } while (pbr >= BMP_WRITE_BUF_LEN); | ||||||
| @@ -451,7 +451,7 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { | |||||||
|       SPIFlash.beginWrite(Pic_Write_Addr); |       SPIFlash.beginWrite(Pic_Write_Addr); | ||||||
|       #if HAS_SPI_FLASH_COMPRESSION |       #if HAS_SPI_FLASH_COMPRESSION | ||||||
|         do { |         do { | ||||||
|           watchdog_refresh(); |           hal.watchdog_refresh(); | ||||||
|           pbr = file.read(public_buf, SPI_FLASH_PageSize); |           pbr = file.read(public_buf, SPI_FLASH_PageSize); | ||||||
|           TERN_(MARLIN_DEV_MODE, totalSizes += pbr); |           TERN_(MARLIN_DEV_MODE, totalSizes += pbr); | ||||||
|           SPIFlash.writeData(public_buf, SPI_FLASH_PageSize); |           SPIFlash.writeData(public_buf, SPI_FLASH_PageSize); | ||||||
| @@ -472,7 +472,7 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { | |||||||
|     else if (assetType == ASSET_TYPE_FONT) { |     else if (assetType == ASSET_TYPE_FONT) { | ||||||
|       Pic_Write_Addr = UNIGBK_FLASH_ADDR; |       Pic_Write_Addr = UNIGBK_FLASH_ADDR; | ||||||
|       do { |       do { | ||||||
|         watchdog_refresh(); |         hal.watchdog_refresh(); | ||||||
|         pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); |         pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); | ||||||
|         W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); |         W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); | ||||||
|         Pic_Write_Addr += pbr; |         Pic_Write_Addr += pbr; | ||||||
| @@ -493,11 +493,11 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { | |||||||
|  |  | ||||||
|       disp_assets_update(); |       disp_assets_update(); | ||||||
|       disp_assets_update_progress(F("Erasing pics...")); |       disp_assets_update_progress(F("Erasing pics...")); | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       spiFlashErase_PIC(); |       spiFlashErase_PIC(); | ||||||
|       #if HAS_SPI_FLASH_FONT |       #if HAS_SPI_FLASH_FONT | ||||||
|         disp_assets_update_progress(F("Erasing fonts...")); |         disp_assets_update_progress(F("Erasing fonts...")); | ||||||
|         watchdog_refresh(); |         hal.watchdog_refresh(); | ||||||
|         spiFlashErase_FONT(); |         spiFlashErase_FONT(); | ||||||
|       #endif |       #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -125,13 +125,13 @@ void tft_lvgl_init() { | |||||||
|   ui_cfg_init(); |   ui_cfg_init(); | ||||||
|   disp_language_init(); |   disp_language_init(); | ||||||
|  |  | ||||||
|   watchdog_refresh();     // LVGL init takes time |   hal.watchdog_refresh();     // LVGL init takes time | ||||||
|  |  | ||||||
|   // Init TFT first! |   // Init TFT first! | ||||||
|   SPI_TFT.spi_init(SPI_FULL_SPEED); |   SPI_TFT.spi_init(SPI_FULL_SPEED); | ||||||
|   SPI_TFT.LCD_init(); |   SPI_TFT.LCD_init(); | ||||||
|  |  | ||||||
|   watchdog_refresh();     // LVGL init takes time |   hal.watchdog_refresh();     // LVGL init takes time | ||||||
|  |  | ||||||
|   #if ENABLED(USB_FLASH_DRIVE_SUPPORT) |   #if ENABLED(USB_FLASH_DRIVE_SUPPORT) | ||||||
|     uint16_t usb_flash_loop = 1000; |     uint16_t usb_flash_loop = 1000; | ||||||
| @@ -142,21 +142,21 @@ void tft_lvgl_init() { | |||||||
|     #endif |     #endif | ||||||
|     do { |     do { | ||||||
|       card.media_driver_usbFlash.idle(); |       card.media_driver_usbFlash.idle(); | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       delay(2); |       delay(2); | ||||||
|     } while (!card.media_driver_usbFlash.isInserted() && usb_flash_loop--); |     } while (!card.media_driver_usbFlash.isInserted() && usb_flash_loop--); | ||||||
|     card.mount(); |     card.mount(); | ||||||
|   #elif HAS_LOGO_IN_FLASH |   #elif HAS_LOGO_IN_FLASH | ||||||
|     delay(1000); |     delay(1000); | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|     delay(1000); |     delay(1000); | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|   watchdog_refresh();     // LVGL init takes time |   hal.watchdog_refresh();     // LVGL init takes time | ||||||
|  |  | ||||||
|   #if ENABLED(SDSUPPORT) |   #if ENABLED(SDSUPPORT) | ||||||
|     UpdateAssets(); |     UpdateAssets(); | ||||||
|     watchdog_refresh();   // LVGL init takes time |     hal.watchdog_refresh();   // LVGL init takes time | ||||||
|     TERN_(MKS_TEST, mks_test_get()); |     TERN_(MKS_TEST, mks_test_get()); | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -123,7 +123,7 @@ uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { | |||||||
| void wifi_delay(int n) { | void wifi_delay(int n) { | ||||||
|   const uint32_t start = getWifiTick(); |   const uint32_t start = getWifiTick(); | ||||||
|   while (getWifiTickDiff(start, getWifiTick()) < (uint32_t)n) |   while (getWifiTickDiff(start, getWifiTick()) < (uint32_t)n) | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void wifi_reset() { | void wifi_reset() { | ||||||
| @@ -1882,7 +1882,7 @@ void wifi_rcv_handle() { | |||||||
| void wifi_looping() { | void wifi_looping() { | ||||||
|   do { |   do { | ||||||
|     wifi_rcv_handle(); |     wifi_rcv_handle(); | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|   } while (wifi_link_state == WIFI_TRANS_FILE); |   } while (wifi_link_state == WIFI_TRANS_FILE); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1897,7 +1897,7 @@ void mks_esp_wifi_init() { | |||||||
|  |  | ||||||
|   esp_state = TRANSFER_IDLE; |   esp_state = TRANSFER_IDLE; | ||||||
|   esp_port_begin(1); |   esp_port_begin(1); | ||||||
|   watchdog_refresh(); |   hal.watchdog_refresh(); | ||||||
|   wifi_reset(); |   wifi_reset(); | ||||||
|  |  | ||||||
|   #if 0 |   #if 0 | ||||||
| @@ -1950,14 +1950,14 @@ void mks_esp_wifi_init() { | |||||||
| } | } | ||||||
|  |  | ||||||
| void mks_wifi_firmware_update() { | void mks_wifi_firmware_update() { | ||||||
|   watchdog_refresh(); |   hal.watchdog_refresh(); | ||||||
|   card.openFileRead((char *)ESP_FIRMWARE_FILE); |   card.openFileRead((char *)ESP_FIRMWARE_FILE); | ||||||
|  |  | ||||||
|   if (card.isFileOpen()) { |   if (card.isFileOpen()) { | ||||||
|     card.closefile(); |     card.closefile(); | ||||||
|  |  | ||||||
|     wifi_delay(2000); |     wifi_delay(2000); | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|     if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) return; |     if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) return; | ||||||
|  |  | ||||||
|     clear_cur_ui(); |     clear_cur_ui(); | ||||||
| @@ -1965,7 +1965,7 @@ void mks_wifi_firmware_update() { | |||||||
|     lv_draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMWARE); |     lv_draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMWARE); | ||||||
|  |  | ||||||
|     lv_task_handler(); |     lv_task_handler(); | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|  |  | ||||||
|     if (wifi_upload(0) >= 0) { |     if (wifi_upload(0) >= 0) { | ||||||
|       card.removeFile((char *)ESP_FIRMWARE_FILE_RENAME); |       card.removeFile((char *)ESP_FIRMWARE_FILE_RENAME); | ||||||
|   | |||||||
| @@ -265,7 +265,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t | |||||||
|     EspUploadResult stat; |     EspUploadResult stat; | ||||||
|  |  | ||||||
|     //IWDG_ReloadCounter(); |     //IWDG_ReloadCounter(); | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|  |  | ||||||
|     if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) |     if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) | ||||||
|       return timeout; |       return timeout; | ||||||
| @@ -445,7 +445,7 @@ EspUploadResult Sync(uint16_t timeout) { | |||||||
|     for (;;) { |     for (;;) { | ||||||
|       size_t bodyLen; |       size_t bodyLen; | ||||||
|       EspUploadResult rc = readPacket(ESP_SYNC, 0, &bodyLen, defaultTimeout); |       EspUploadResult rc = readPacket(ESP_SYNC, 0, &bodyLen, defaultTimeout); | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       if (rc != success || bodyLen != 2) break; |       if (rc != success || bodyLen != 2) break; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -673,7 +673,7 @@ int32_t wifi_upload(int type) { | |||||||
|  |  | ||||||
|   while (esp_upload.state != upload_idle) { |   while (esp_upload.state != upload_idle) { | ||||||
|     upload_spin(); |     upload_spin(); | ||||||
|     watchdog_refresh(); |     hal.watchdog_refresh(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ResetWiFiForUpload(1); |   ResetWiFiForUpload(1); | ||||||
|   | |||||||
| @@ -1226,10 +1226,10 @@ inline void loud_kill(FSTR_P const lcd_msg, const heater_id_t heater_id) { | |||||||
|   thermalManager.disable_all_heaters(); |   thermalManager.disable_all_heaters(); | ||||||
|   #if HAS_BEEPER |   #if HAS_BEEPER | ||||||
|     for (uint8_t i = 20; i--;) { |     for (uint8_t i = 20; i--;) { | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|       buzzer.click(25); |       buzzer.click(25); | ||||||
|       delay(80); |       delay(80); | ||||||
|       watchdog_refresh(); |       hal.watchdog_refresh(); | ||||||
|     } |     } | ||||||
|     buzzer.on(); |     buzzer.on(); | ||||||
|   #endif |   #endif | ||||||
| @@ -1274,7 +1274,7 @@ void Temperature::_temp_error(const heater_id_t heater_id, FSTR_P const serial_m | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   disable_all_heaters(); // always disable (even for bogus temp) |   disable_all_heaters(); // always disable (even for bogus temp) | ||||||
|   watchdog_refresh(); |   hal.watchdog_refresh(); | ||||||
|  |  | ||||||
|   #if BOGUS_TEMPERATURE_GRACE_PERIOD |   #if BOGUS_TEMPERATURE_GRACE_PERIOD | ||||||
|     const millis_t ms = millis(); |     const millis_t ms = millis(); | ||||||
| @@ -1638,7 +1638,7 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { | |||||||
|  *  - Update the heated bed PID output value |  *  - Update the heated bed PID output value | ||||||
|  */ |  */ | ||||||
| void Temperature::manage_heater() { | void Temperature::manage_heater() { | ||||||
|   if (marlin_state == MF_INITIALIZING) return watchdog_refresh(); // If Marlin isn't started, at least reset the watchdog! |   if (marlin_state == MF_INITIALIZING) return hal.watchdog_refresh(); // If Marlin isn't started, at least reset the watchdog! | ||||||
|  |  | ||||||
|   static bool no_reentry = false;  // Prevent recursion |   static bool no_reentry = false;  // Prevent recursion | ||||||
|   if (no_reentry) return; |   if (no_reentry) return; | ||||||
| @@ -2387,7 +2387,7 @@ void Temperature::manage_heater() { | |||||||
|  */ |  */ | ||||||
| void Temperature::updateTemperaturesFromRawValues() { | void Temperature::updateTemperaturesFromRawValues() { | ||||||
|  |  | ||||||
|   watchdog_refresh(); // Reset because raw_temps_ready was set by the interrupt |   hal.watchdog_refresh(); // Reset because raw_temps_ready was set by the interrupt | ||||||
|  |  | ||||||
|   TERN_(TEMP_SENSOR_0_IS_MAX_TC, temp_hotend[0].setraw(READ_MAX_TC(0))); |   TERN_(TEMP_SENSOR_0_IS_MAX_TC, temp_hotend[0].setraw(READ_MAX_TC(0))); | ||||||
|   TERN_(TEMP_SENSOR_1_IS_MAX_TC, temp_hotend[1].setraw(READ_MAX_TC(1))); |   TERN_(TEMP_SENSOR_1_IS_MAX_TC, temp_hotend[1].setraw(READ_MAX_TC(1))); | ||||||
|   | |||||||
| @@ -249,7 +249,7 @@ bool DiskIODriver_SPI_SD::init(const uint8_t sckRateID, const pin_t chipSelectPi | |||||||
|   const millis_t init_timeout = millis() + SD_INIT_TIMEOUT; |   const millis_t init_timeout = millis() + SD_INIT_TIMEOUT; | ||||||
|   uint32_t arg; |   uint32_t arg; | ||||||
|  |  | ||||||
|   watchdog_refresh(); // In case init takes too long |   hal.watchdog_refresh(); // In case init takes too long | ||||||
|  |  | ||||||
|   // Set pin modes |   // Set pin modes | ||||||
|   #if ENABLED(ZONESTAR_12864OLED) |   #if ENABLED(ZONESTAR_12864OLED) | ||||||
| @@ -270,7 +270,7 @@ bool DiskIODriver_SPI_SD::init(const uint8_t sckRateID, const pin_t chipSelectPi | |||||||
|   // Must supply min of 74 clock cycles with CS high. |   // Must supply min of 74 clock cycles with CS high. | ||||||
|   LOOP_L_N(i, 10) spiSend(0xFF); |   LOOP_L_N(i, 10) spiSend(0xFF); | ||||||
|  |  | ||||||
|   watchdog_refresh(); // In case init takes too long |   hal.watchdog_refresh(); // In case init takes too long | ||||||
|  |  | ||||||
|   // Command to go idle in SPI mode |   // Command to go idle in SPI mode | ||||||
|   while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { |   while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { | ||||||
| @@ -284,7 +284,7 @@ bool DiskIODriver_SPI_SD::init(const uint8_t sckRateID, const pin_t chipSelectPi | |||||||
|     crcSupported = (cardCommand(CMD59, 1) == R1_IDLE_STATE); |     crcSupported = (cardCommand(CMD59, 1) == R1_IDLE_STATE); | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|   watchdog_refresh(); // In case init takes too long |   hal.watchdog_refresh(); // In case init takes too long | ||||||
|  |  | ||||||
|   // check SD version |   // check SD version | ||||||
|   for (;;) { |   for (;;) { | ||||||
| @@ -306,7 +306,7 @@ bool DiskIODriver_SPI_SD::init(const uint8_t sckRateID, const pin_t chipSelectPi | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   watchdog_refresh(); // In case init takes too long |   hal.watchdog_refresh(); // In case init takes too long | ||||||
|  |  | ||||||
|   // Initialize card and send host supports SDHC if SD2 |   // Initialize card and send host supports SDHC if SD2 | ||||||
|   arg = type() == SD_CARD_TYPE_SD2 ? 0x40000000 : 0; |   arg = type() == SD_CARD_TYPE_SD2 ? 0x40000000 : 0; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user