From 0128edd996394da98f84d9a0eebaa4e4d00e0c1b Mon Sep 17 00:00:00 2001 From: Steven Cartmell Date: Mon, 4 Dec 2017 11:38:24 +0000 Subject: [PATCH] Remove window and sleep mode options for watchdog API --- drivers/ResetReason.h | 19 +++---- drivers/Watchdog.cpp | 13 +---- drivers/Watchdog.h | 35 ++---------- hal/watchdog_api.h | 54 +------------------ .../TARGET_MCU_K64F/watchdog.c | 30 ++--------- targets/TARGET_STM/TARGET_STM32F4/watchdog.c | 27 ++++------ targets/targets.json | 24 ++++++--- 7 files changed, 42 insertions(+), 160 deletions(-) diff --git a/drivers/ResetReason.h b/drivers/ResetReason.h index 7c9f85422a..54f4ff102d 100644 --- a/drivers/ResetReason.h +++ b/drivers/ResetReason.h @@ -1,5 +1,3 @@ -/** \addtogroup hal */ -/** @{*/ /* mbed Microcontroller Library * Copyright (c) 2017 ARM Limited * @@ -25,10 +23,11 @@ namespace mbed { /** \addtogroup drivers */ -/** @{*/ -/** - * \defgroup reset_reason reset reason functions - * @{ +/** ResetReason API. When the system is restarted, the reason for the restart is + * contained in the system registers at boot time in a platform specific manner, + * this API provides a generic method of fetching the reason for the restart. + * + * @ingroup drivers */ class ResetReason { @@ -58,20 +57,14 @@ public: * Example: * @code * if (ResetReason::get() == RESET_REASON_PLATFORM) { - * const uint32_t platform_reason = ResetReason::get_raw(); + * const uint32_t platform_reason = ResetReason::get_raw(); * } * @endcode */ static uint32_t get_raw(); }; - -/**@}*/ -/**@}*/ - } // namespace mbed -/**@}*/ - #endif // DEVICE_RESET_REASON #endif // MBED_RESET_REASON_H diff --git a/drivers/Watchdog.cpp b/drivers/Watchdog.cpp index 358b41003a..6c8a6edf6d 100644 --- a/drivers/Watchdog.cpp +++ b/drivers/Watchdog.cpp @@ -20,19 +20,10 @@ namespace mbed { -watchdog_status_t Watchdog::start(const uint32_t timeout, const bool enable_sleep) -{ - return start(timeout, 0, enable_sleep); -} - - -watchdog_status_t Watchdog::start(const uint32_t timeout, const uint32_t window, const bool enable_sleep) +watchdog_status_t Watchdog::start(const uint32_t timeout) { watchdog_config_t config; - config.timeout_ms = timeout; - config.window_ms = window; - config.enable_window = (window != 0); - config.enable_sleep = enable_sleep; + config.timeout_ms = timeout; return hal_watchdog_init(&config); } diff --git a/drivers/Watchdog.h b/drivers/Watchdog.h index dca16740bc..66cefcaed7 100644 --- a/drivers/Watchdog.h +++ b/drivers/Watchdog.h @@ -1,5 +1,3 @@ -/** \addtogroup hal */ -/** @{*/ /* mbed Microcontroller Library * Copyright (c) 2017 ARM Limited * @@ -28,7 +26,6 @@ namespace mbed { /** \addtogroup drivers */ -/** @{*/ /** A system timer that will reset the system in the case of system failures or * malfunctions. * @@ -36,8 +33,7 @@ namespace mbed { * @code * * Watchdog watchdog = Watchdog(); - * watchdog.set_timeout(2000); - * watchdog.start(); + * watchdog.start(2000); * * while (true) { * watchdog.kick(); @@ -45,7 +41,7 @@ namespace mbed { * // Application code * } * @endcode - * + * @ingroup drivers */ class Watchdog { @@ -56,10 +52,6 @@ public: /** Start an independent watchdog timer with specified parameters * * @param timeout Timeout of the watchdog in milliseconds - * @param enable_sleep Sets sleep mode behaviour. When enabled the watchdog - * will continue to run in sleep mode. When disable the - * watchdog will be paused. This feature is not - * supported on all platforms. * * @return status WATCHDOG_STATUS_OK if the watchdog timer was started * successfully. WATCHDOG_INVALID_ARGUMENT if one of the input @@ -67,25 +59,7 @@ public: * WATCHDOG_NOT_SUPPORTED if one of the enabled input * parameters is not supported by the current platform. */ - watchdog_status_t start(const uint32_t timeout, const bool enable_sleep = true); - - - /** Start a windowed watchdog timer with specified parameters - * - * @param timeout Timeout of the watchdog in milliseconds - * @param window Time period of the window of the watchdog - * @param enable_sleep Sets sleep mode behaviour. When enabled the watchdog - * will continue to run in sleep mode. When disable the - * watchdog will be paused. This feature is not - * supported on all platforms. - * - * @return status WATCHDOG_STATUS_OK if the watchdog timer was started - * successfully. WATCHDOG_INVALID_ARGUMENT if one of the input - * parameters is out of range for the current platform. - * WATCHDOG_NOT_SUPPORTED if one of the enabled input - * parameters is not supported by the current platform. - */ - watchdog_status_t start(const uint32_t timeout, const uint32_t window, const bool enable_sleep = true); + watchdog_status_t start(const uint32_t timeout); /** Refreshes the watchdog timer. @@ -130,8 +104,5 @@ public: } // namespace mbed -/**@}*/ -/**@}*/ - #endif // DEVICE_WATCHDOG #endif // MBED_WATCHDOG_H diff --git a/hal/watchdog_api.h b/hal/watchdog_api.h index e403fcaedf..24396da7b3 100644 --- a/hal/watchdog_api.h +++ b/hal/watchdog_api.h @@ -35,13 +35,6 @@ * wraps. To prevent the system reset the timer must be continually * kicked/refreshed by calling hal_watchdog_kick which will reset the countdown * to the user specified reset value. - * - * The watchdog timer supports a second mode of operation called windowed mode. - * When configured in this mode by setting enable_window to true, the watchdog - * will enable a restriction on the kick. If the watchdog timer is kicked too - * soon after it has last been refreshed a system reset occurs. The earliest - * time in milliseconds the timer can be kicked without triggering a reset is - * specified by window_ms. */ typedef struct @@ -55,28 +48,6 @@ typedef struct * WATCHDOG_STATUS_INVALID_ARGUMENT. */ uint32_t timeout_ms; - /** - * Configures the watchdog for windowed mode of operation instead of running - * the independent watchdog. In this mode a restriction is placed on the - * time period in which the watchdog can be refreshed/kicked. If the - * watchdog is kicked too soon after it has last been refreshed the system - * will be reset. The period of time in which the reset will be triggered is - * defined by window_ms. This value is false by default. - */ - bool enable_window; - /** - * Specifies the time window for the watchdog window in milliseconds. If the - * watchdog is configured to run in windowed mode kicking the watchdog less - * than this many milliseconds after it has last been kicked will trigger a - * system reset. This value must be less than timeout_ms. - */ - uint32_t window_ms; - /** - * Configures the watchdog behaviour while the system is in sleep mode. When - * this flag is enabled the watchdog timer runs normally while the system is - * in sleep mode, when disabled the watchdog is paused during this time. - */ - bool enable_sleep; } watchdog_config_t; @@ -86,15 +57,6 @@ typedef struct * Maximum timeout value for the watchdog in milliseconds. */ uint32_t max_timeout; - /** - * Maximum timeout value for the watchdog in milliseconds during window - * operation mode - */ - uint32_t max_timeout_window_mode; - /** - * Watchdog timer supports window mode operation - */ - bool window_mode; /** * Watchdog configuration can be updated after the watchdog has been started */ @@ -103,10 +65,6 @@ typedef struct * Watchdog can be stopped after it is started without a reset */ bool disable_watchdog; - /** - * Watchdog can be paused while the core is in sleep mode - */ - bool pause_during_sleep; } watchdog_features_t; @@ -125,12 +83,8 @@ typedef enum { * If the watchdog timer is configured and started successfully this * function will return WATCHDOG_STATUS_OK. * - * If the enable_window is set but windowed mode is not supported by the - * platform the function will return WATCHDOG_STATUS_NOT_SUPPORTED. - * - * If the timeout specified is outside the range supported by the platform, - * or if the window period is greater than the timeout period it will return - * WATCHDOG_STATUS_INVALID_ARGUMENT. + * If the timeout specified is outside the range supported by the platform + * it will return WATCHDOG_STATUS_INVALID_ARGUMENT. * * @param[in] config Configuration settings for the watchdog timer * @@ -144,10 +98,6 @@ watchdog_status_t hal_watchdog_init(const watchdog_config_t *config); * This function should be called periodically before the watchdog times out. * Otherwise, the system is reset. * - * If using the windowed operation mode this function must be called within the - * configured timeout window. If the function is called before the window is - * reached the system is reset. - * * If a watchdog is not currently running this function does nothing */ void hal_watchdog_kick(void); diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/watchdog.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/watchdog.c index d0e540789e..84cabf44ec 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/watchdog.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/watchdog.c @@ -19,13 +19,6 @@ const uint64_t max_timeout_ms = ((MAX_TIMEOUT / TICKS_PER_MS) * MAX_PRESCALER); ((MAX_TIMEOUT / TICKS_PER_MS) * scale) -#if defined(FSL_FEATURE_WDOG_HAS_WAITEN) && FSL_FEATURE_WDOG_HAS_WAITEN - #define PLATFORM_SUPPORTS_SLEEP true -#else - #define PLATFORM_SUPPORTS_SLEEP false -#endif - - static uint32_t calculate_prescaler_value(const uint32_t timeout_ms) { if (timeout_ms > max_timeout_ms) { @@ -57,27 +50,15 @@ watchdog_status_t hal_watchdog_init(const watchdog_config_t *config) return WATCHDOG_STATUS_INVALID_ARGUMENT; } - if (config->window_ms > max_timeout_ms) { - return WATCHDOG_STATUS_INVALID_ARGUMENT; - } - - if (config->window_ms > config->timeout_ms) { - return WATCHDOG_STATUS_INVALID_ARGUMENT; - } - - if (config->enable_sleep && !PLATFORM_SUPPORTS_SLEEP) { - return WATCHDOG_STATUS_NOT_SUPPORTED; - } wdog_config_t cfg; cfg.enableWdog = true; cfg.clockSource = kWDOG_LpoClockSource; + cfg.windowValue = 0; cfg.enableUpdate = true; cfg.enableInterrupt = false; - cfg.enableWindowMode = config->enable_window; -#if PLATFORM_SUPPORTS_SLEEP - cfg.workMode.enableWait = config->enable_sleep; -#endif + cfg.enableWindowMode = false; + cfg.workMode.enableWait = true; cfg.workMode.enableStop = false; cfg.workMode.enableDebug = false; @@ -89,7 +70,6 @@ watchdog_status_t hal_watchdog_init(const watchdog_config_t *config) cfg.prescaler = (wdog_clock_prescaler_t)(prescaler - 1); cfg.timeoutValue = (TICKS_PER_MS * config->timeout_ms) / prescaler; - cfg.windowValue = (TICKS_PER_MS * config->window_ms) / prescaler; WDOG_Init(WDOG, &cfg); @@ -119,14 +99,12 @@ uint32_t hal_watchdog_get_reload_value(void) } -watchdog_features_t hal_watchdog_get_max_timeout(void) +watchdog_features_t hal_watchdog_get_platform_features(void) { watchdog_features_t features; features.max_timeout = max_timeout_ms; - features.max_timeout_window_mode = max_timeout_ms; features.update_config = true; features.disable_watchdog = true; - features.pause_during_sleep = true; return features; } diff --git a/targets/TARGET_STM/TARGET_STM32F4/watchdog.c b/targets/TARGET_STM/TARGET_STM32F4/watchdog.c index 95c394a817..6ee416b191 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/watchdog.c +++ b/targets/TARGET_STM/TARGET_STM32F4/watchdog.c @@ -2,8 +2,11 @@ #include "reset_reason_api.h" +#ifdef DEVICE_WATCHDOG + #include "device.h" +#include // Platform specific watchdog definitions #define LPO_CLOCK_FREQUENCY 40000 @@ -22,7 +25,7 @@ const uint64_t max_timeout_ms = ((MAX_TIMEOUT / TICKS_PER_MS) * MAX_PRESCALER); static uint32_t calculate_prescaler_value(const uint32_t timeout_ms) { - if (timeout_ms > MAX_TIMEOUT_MS) { + if (timeout_ms > max_timeout_ms) { return 0; } @@ -49,23 +52,10 @@ watchdog_status_t hal_watchdog_init(const watchdog_config_t *config) return WATCHDOG_STATUS_INVALID_ARGUMENT; } - if (config->timeout_ms > MAX_TIMEOUT_MS) { + if (config->timeout_ms > max_timeout_ms) { return WATCHDOG_STATUS_INVALID_ARGUMENT; } - if (config->window_ms > MAX_TIMEOUT_MS) { - return WATCHDOG_STATUS_INVALID_ARGUMENT; - } - - if (config->window_ms > config->timeout_ms) { - return WATCHDOG_STATUS_INVALID_ARGUMENT; - } - - if (config->enable_sleep == false) { - return WATCHDOG_STATUS_NOT_SUPPORTED; - } - - const uint32_t prescaler = calculate_prescaler_value(config->timeout_ms); if (prescaler == 0) { @@ -108,14 +98,15 @@ uint32_t hal_watchdog_get_reload_value(void) return ((timeout / TICKS_PER_MS) * prescaler); } -watchdog_features_t hal_watchdog_get_max_timeout(void) + +watchdog_features_t hal_watchdog_get_platform_features(void) { watchdog_features_t features; features.max_timeout = max_timeout_ms; - features.max_timeout_window_mode = max_timeout_ms; features.update_config = true; features.disable_watchdog = false; - features.pause_during_sleep = true; return features; } + +#endif // DEVICE_WATCHDOG diff --git a/targets/targets.json b/targets/targets.json index e1e1485383..6f5cde1563 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -2497,7 +2497,8 @@ "device_has_add": [ "SERIAL_ASYNCH", "FLASH", - "MPU" + "MPU", + "WATCHDOG" ], "release_versions": ["2", "5"], "device_name": "STM32F401RE" @@ -2554,7 +2555,8 @@ "SERIAL_ASYNCH", "TRNG", "FLASH", - "MPU" + "MPU", + "WATCHDOG" ], "release_versions": ["2", "5"], "device_name": "STM32F410RB" @@ -2577,7 +2579,8 @@ "device_has_add": [ "SERIAL_ASYNCH", "FLASH", - "MPU" + "MPU", + "WATCHDOG" ], "release_versions": ["2", "5"], "device_name": "STM32F411RE", @@ -2905,7 +2908,8 @@ "SERIAL_ASYNCH", "TRNG", "FLASH", - "MPU" + "MPU", + "WATCHDOG", ], "detect_code": ["0797"], "release_versions": ["2", "5"], @@ -2970,7 +2974,8 @@ "CAN", "SERIAL_ASYNCH", "FLASH", - "MPU" + "MPU", + "WATCHDOG" ], "release_versions": ["2", "5"], "device_name": "STM32F446RE", @@ -3012,7 +3017,8 @@ "CAN", "SERIAL_ASYNCH", "FLASH", - "MPU" + "MPU", + "WATCHDOG" ], "release_versions": ["2", "5"], "device_name": "STM32F446VE" @@ -4373,7 +4379,7 @@ "function": "MTSCode.combine_bins_mts_dragonfly", "toolchains": ["GCC_ARM", "ARM_STD", "ARM_MICRO", "IAR"] }, - "device_has_add": ["MPU", "FLASH"], + "device_has_add": ["MPU", "FLASH", "WATCHDOG"], "device_has_remove": [ "SERIAL_FC" ], @@ -4581,6 +4587,7 @@ "EMAC", "TRNG", "FLASH", + "WATCHDOG", "WIFI", "SERIAL" ], @@ -4677,7 +4684,8 @@ "EMAC", "TRNG", "FLASH", - "MPU" + "MPU", + "WATCHDOG" ], "public": false, "device_name": "STM32F437VG",