when performing FOTA, should we disable the watchdog timer?

Hi,

I used sdk 2.6.1,

 when performing FOTA, should we disable the watchdog timer? If so, how can we disable it?

Parents
  • Some FOTA applications do disable watchdog, but it is an architectural choice that you can make. A code snippet on how to do it can be as below. Please use this as a reference only as I have not tested this to work.

    #include <zephyr.h>
    #include <drivers/watchdog.h>
    
    #define WDT_TIMEOUT_MS 10000  // Watchdog timeout in milliseconds (adjust as needed)
    #define WDT_DEVICE_NAME DT_LABEL(DT_NODELABEL(wdt0))
    
    static const struct device *wdt_dev;
    static int wdt_channel_id = -1;
    
    // Set up the watchdog timer to ensure system stability by resetting on timeouts
    void watchdog_init(void) {
        // Get the watchdog device
        wdt_dev = device_get_binding(WDT_DEVICE_NAME);
        if (!wdt_dev) {
            printk("Error: Cannot find watchdog device\n");
            return;
        }
    
        // Configure the watchdog timer with the specified timeout and reset behavior
        struct wdt_timeout_cfg wdt_config = {
            .window = { .min = 0, .max = K_MSEC(WDT_TIMEOUT_MS) },
            .callback = NULL,  // We’re not using a callback for simplicity
            .flags = WDT_FLAG_RESET_SOC  // Trigger a full system reset on timeout
        };
    
        // Install the watchdog timeout with the configuration above
        wdt_channel_id = wdt_install_timeout(wdt_dev, &wdt_config);
        if (wdt_channel_id < 0) {
            printk("Error: Failed to install watchdog timeout\n");
            return;
        }
    
        // Start the watchdog timer
        int err = wdt_setup(wdt_dev, 0);
        if (err) {
            printk("Error: Failed to set up watchdog\n");
            return;
        }
    
        printk("Watchdog initialized with %d ms timeout\n", WDT_TIMEOUT_MS);
    }
    
    // Function to enable the watchdog, which starts the countdown
    void watchdog_enable(void) {
        if (wdt_channel_id >= 0) {
            wdt_feed(wdt_dev, wdt_channel_id);  // Feed the watchdog to start it
            printk("Watchdog enabled\n");
        } else {
            printk("Error: Watchdog channel not initialized\n");
        }
    }
    
    // Function to disable the watchdog, typically before long operations like FOTA
    void watchdog_disable(void) {
        if (wdt_channel_id >= 0) {
            int err = wdt_disable(wdt_dev);  // Disables the watchdog, if supported by your SDK
            if (err == 0) {
                printk("Watchdog disabled\n");
            } else {
                printk("Error: Unable to disable watchdog\n");
            }
        } else {
            printk("Error: Watchdog channel not initialized\n");
        }
    }
    
    // Call this function right before starting a FOTA update to avoid unexpected resets
    void prepare_for_fota(void) {
        watchdog_disable();  // Temporarily turn off watchdog for the update
        // Any other FOTA preparation steps can go here
    }
    
    // Call this function after FOTA completes to re-enable the watchdog
    void post_fota_cleanup(void) {
        // Any necessary cleanup steps after FOTA can go here
        watchdog_enable();  // Re-enable the watchdog to restore normal operation
    }
    
    // Function to regularly feed the watchdog to prevent unwanted resets
    void watchdog_feed_periodic(void) {
        if (wdt_channel_id >= 0) {
            wdt_feed(wdt_dev, wdt_channel_id);  // Reset the watchdog timer countdown
        }
    }
    

Reply
  • Some FOTA applications do disable watchdog, but it is an architectural choice that you can make. A code snippet on how to do it can be as below. Please use this as a reference only as I have not tested this to work.

    #include <zephyr.h>
    #include <drivers/watchdog.h>
    
    #define WDT_TIMEOUT_MS 10000  // Watchdog timeout in milliseconds (adjust as needed)
    #define WDT_DEVICE_NAME DT_LABEL(DT_NODELABEL(wdt0))
    
    static const struct device *wdt_dev;
    static int wdt_channel_id = -1;
    
    // Set up the watchdog timer to ensure system stability by resetting on timeouts
    void watchdog_init(void) {
        // Get the watchdog device
        wdt_dev = device_get_binding(WDT_DEVICE_NAME);
        if (!wdt_dev) {
            printk("Error: Cannot find watchdog device\n");
            return;
        }
    
        // Configure the watchdog timer with the specified timeout and reset behavior
        struct wdt_timeout_cfg wdt_config = {
            .window = { .min = 0, .max = K_MSEC(WDT_TIMEOUT_MS) },
            .callback = NULL,  // We’re not using a callback for simplicity
            .flags = WDT_FLAG_RESET_SOC  // Trigger a full system reset on timeout
        };
    
        // Install the watchdog timeout with the configuration above
        wdt_channel_id = wdt_install_timeout(wdt_dev, &wdt_config);
        if (wdt_channel_id < 0) {
            printk("Error: Failed to install watchdog timeout\n");
            return;
        }
    
        // Start the watchdog timer
        int err = wdt_setup(wdt_dev, 0);
        if (err) {
            printk("Error: Failed to set up watchdog\n");
            return;
        }
    
        printk("Watchdog initialized with %d ms timeout\n", WDT_TIMEOUT_MS);
    }
    
    // Function to enable the watchdog, which starts the countdown
    void watchdog_enable(void) {
        if (wdt_channel_id >= 0) {
            wdt_feed(wdt_dev, wdt_channel_id);  // Feed the watchdog to start it
            printk("Watchdog enabled\n");
        } else {
            printk("Error: Watchdog channel not initialized\n");
        }
    }
    
    // Function to disable the watchdog, typically before long operations like FOTA
    void watchdog_disable(void) {
        if (wdt_channel_id >= 0) {
            int err = wdt_disable(wdt_dev);  // Disables the watchdog, if supported by your SDK
            if (err == 0) {
                printk("Watchdog disabled\n");
            } else {
                printk("Error: Unable to disable watchdog\n");
            }
        } else {
            printk("Error: Watchdog channel not initialized\n");
        }
    }
    
    // Call this function right before starting a FOTA update to avoid unexpected resets
    void prepare_for_fota(void) {
        watchdog_disable();  // Temporarily turn off watchdog for the update
        // Any other FOTA preparation steps can go here
    }
    
    // Call this function after FOTA completes to re-enable the watchdog
    void post_fota_cleanup(void) {
        // Any necessary cleanup steps after FOTA can go here
        watchdog_enable();  // Re-enable the watchdog to restore normal operation
    }
    
    // Function to regularly feed the watchdog to prevent unwanted resets
    void watchdog_feed_periodic(void) {
        if (wdt_channel_id >= 0) {
            wdt_feed(wdt_dev, wdt_channel_id);  // Reset the watchdog timer countdown
        }
    }
    

Children
No Data
Related