K64F: watchdog HAL: Fix max_timeout.

Limit MAX_TIMEOUT_MS to UINT32_MAX.
Improve MAX_TIMEOUT_MS handling.
Fix hal_watchdog_get_platform_features() returning
.max_timeout = 0xfffffff8 instead of 0xffffffff.
pull/10657/head
Filip Jagodzinski 2018-01-09 17:51:28 +01:00 committed by Filip Jagodzinski
parent 2ab738fc66
commit 90bb2929e0
1 changed files with 14 additions and 8 deletions

View File

@ -22,26 +22,32 @@
// Platform specific watchdog definitions // Platform specific watchdog definitions
#define LPO_CLOCK_FREQUENCY 1000 #define LPO_CLOCK_FREQUENCY 1000
#define MAX_PRESCALER 8 #define MAX_PRESCALER 8
#define MAX_TIMEOUT 0xFFFFFFFFULL #define MAX_TIMEOUT 0xFFFFFFFFUL
// Number of decrements in the timeout register per millisecond // Number of decrements in the timeout register per millisecond
#define TICKS_PER_MS (LPO_CLOCK_FREQUENCY / 1000) #define TICKS_PER_MS ((LPO_CLOCK_FREQUENCY) / 1000)
// Maximum timeout that can be specified in milliseconds // Maximum timeout that can be specified in milliseconds
const uint64_t max_timeout_ms = ((MAX_TIMEOUT / TICKS_PER_MS) * MAX_PRESCALER); #define MAX_TIMEOUT_MS_UINT64 (1ULL * ((MAX_TIMEOUT) / (TICKS_PER_MS)) * (MAX_PRESCALER))
#if (MAX_TIMEOUT_MS_UINT64 > UINT32_MAX)
#define MAX_TIMEOUT_MS UINT32_MAX
#else
#define MAX_TIMEOUT_MS (MAX_TIMEOUT_MS_UINT64 & 0xFFFFFFFFUL)
#endif
// Maximum supported watchdog timeout for given prescaler value // Maximum supported watchdog timeout for given prescaler value
#define CALCULATE_MAX_TIMEOUT_MS(scale) \ #define CALCULATE_MAX_TIMEOUT_MS_UINT64(scale) \
((MAX_TIMEOUT / TICKS_PER_MS) * scale) (1ULL * ((MAX_TIMEOUT) / (TICKS_PER_MS)) * (scale))
static uint32_t calculate_prescaler_value(const uint32_t timeout_ms) 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; return 0;
} }
for (uint32_t scale = 1; scale <= MAX_PRESCALER; ++scale) { for (uint32_t scale = 1; scale <= MAX_PRESCALER; ++scale) {
if (timeout_ms < CALCULATE_MAX_TIMEOUT_MS(scale)) { if (timeout_ms <= CALCULATE_MAX_TIMEOUT_MS_UINT64(scale)) {
return scale; return scale;
} }
} }
@ -103,7 +109,7 @@ uint32_t hal_watchdog_get_reload_value(void)
watchdog_features_t hal_watchdog_get_platform_features(void) watchdog_features_t hal_watchdog_get_platform_features(void)
{ {
watchdog_features_t features; watchdog_features_t features;
features.max_timeout = max_timeout_ms; features.max_timeout = MAX_TIMEOUT_MS;
features.update_config = true; features.update_config = true;
features.disable_watchdog = true; features.disable_watchdog = true;