From 9740836e615a24d6053f1a858ce27f62697da13c Mon Sep 17 00:00:00 2001 From: Stephane D'Alu Date: Sat, 6 Feb 2016 20:11:26 +0100 Subject: Added watchdog WDT --- os/hal/ports/NRF51/NRF51822/wdg_lld.c | 150 ++++++++++++++++++++++++++++++++++ os/hal/ports/NRF51/NRF51822/wdg_lld.h | 127 ++++++++++++++++++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 os/hal/ports/NRF51/NRF51822/wdg_lld.c create mode 100644 os/hal/ports/NRF51/NRF51822/wdg_lld.h (limited to 'os/hal') diff --git a/os/hal/ports/NRF51/NRF51822/wdg_lld.c b/os/hal/ports/NRF51/NRF51822/wdg_lld.c new file mode 100644 index 0000000..bd17ef7 --- /dev/null +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.c @@ -0,0 +1,150 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/wdg_lld.c + * @brief WDG Driver subsystem low level driver source template. + * + * @addtogroup WDG + * @{ + */ + +#include "hal.h" + +#if HAL_USE_WDG || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +#define RELOAD_REQUEST_VALUE 0x6E524635 + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +WDGDriver WDGD1; + +/*===========================================================================*/ +/* Driver local variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +#if WDG_USE_TIMEOUT_CALLBACK == TRUE +/** + * @brief Watchdog vector. + * @details This interrupt is used when watchdog timeout. + * + * @note Only 2 cycles at NRF51_LFCLK_FREQUENCY are available + * to they good bye. + * + * @isr + */ +OSAL_IRQ_HANDLER(Vector84) { + + OSAL_IRQ_PROLOGUE(); + osalSysLockFromISR(); + + /* Notify */ + if (WDGD1.config->callback) + WDGD1.config->callback(); + + /* Wait for reboot */ + while (1) { /* */ } + + osalSysUnlockFromISR(); + OSAL_IRQ_EPILOGUE(); +} +#endif + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level WDG driver initialization. + * + * @notapi + */ +void wdg_lld_init(void) { + WDGD1.state = WDG_STOP; + WDGD1.wdt = NRF_WDT; +} + +/** + * @brief Configures and activates the WDG peripheral. + * + * @note Once started there is now way out. + * + * @param[in] wdgp pointer to the @p WDGDriver object + * + * @notapi + */ +void wdg_lld_start(WDGDriver *wdgp) { +#if WDG_USE_TIMEOUT_CALLBACK == TRUE + wdgp->wdt->INTENSET = WDT_INTENSET_TIMEOUT_Msk; +#endif + + /* When to pause? (halt, sleep) */ + wdgp->wdt->CONFIG = + (wdgp->config->flags.pause_on_sleep * WDT_CONFIG_SLEEP_Msk) | + (wdgp->config->flags.pause_on_halt * WDT_CONFIG_HALT_Msk ); + + /* Timeout in milli-seconds */ + uint64_t tout = (NRF51_LFCLK_FREQUENCY * wdgp->config->timeout_ms / 1000) - 1; + osalDbgAssert(tout <= 0xFFFFFFFF, "watchdog timout value exceeded"); + wdgp->wdt->CRV = (uint32_t)tout; + + /* Reload request (using RR0) */ + wdgp->wdt->RREN = WDT_RREN_RR0_Msk; + + /* Say your prayers, little one. */ + wdgp->wdt->TASKS_START = 1; +} + +/** + * @brief Deactivates the WDG peripheral. + * + * @param[in] wdgp pointer to the @p WDGDriver object + * + * @api + */ +void wdg_lld_stop(WDGDriver *wdgp) { + (void)wdgp; + osalDbgAssert(false, "WDG cannot be stopped once activated"); +} + +/** + * @brief Reloads WDG's counter. + * + * @param[in] wdgp pointer to the @p WDGDriver object + * + * @notapi + */ +void wdg_lld_reset(WDGDriver * wdgp) { + wdgp->wdt->RR[0] = RELOAD_REQUEST_VALUE; +} + +#endif /* HAL_USE_WDG */ + +/** @} */ diff --git a/os/hal/ports/NRF51/NRF51822/wdg_lld.h b/os/hal/ports/NRF51/NRF51822/wdg_lld.h new file mode 100644 index 0000000..8a3f97d --- /dev/null +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.h @@ -0,0 +1,127 @@ +/* + ChibiOS - Copyright (C) 2006 Stephane D'Alu + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/wdg_lld.h + * @brief WDG Driver subsystem low level driver header template. + * + * @addtogroup WDG + * @{ + */ + +#ifndef _WDG_LLD_H_ +#define _WDG_LLD_H_ + +#if (HAL_USE_WDG == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +#define WDG_MAX_TIMEOUT_MS \ + ((uint32_t)(0xFFFFFFFFu * 1000 / NRF51_LFCLK_FREQUENCY)) + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @name Configuration options + * @{ + */ + +/** + * @brief WDG driver implement timeout callback. + * @note The default is @p FALSE. + */ +#if !defined(WDG_USE_TIMEOUT_CALLBACK) || defined(__DOXYGEN__) +#define WDG_USE_TIMEOUT_CALLBACK FALSE +#endif +/** @} */ + + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of a structure representing an WDG driver. + */ +typedef struct WDGDriver WDGDriver; + +/** + * @brief Driver configuration structure. + * @note It could be empty on some architectures. + */ +typedef struct { + struct { + uint8_t pause_on_sleep : 1; + uint8_t pause_on_halt : 1; + } flags; + uint32_t timeout_ms; +#if WDG_USE_TIMEOUT_CALLBACK == TRUE + void (*callback)(void); +#endif +} WDGConfig; + + + +/** + * @brief Structure representing an WDG driver. + */ +struct WDGDriver { + /** + * @brief Driver state. + */ + wdgstate_t state; + /** + * @brief Current configuration data. + */ + const WDGConfig *config; + /* End of the mandatory fields.*/ + NRF_WDT_Type *wdt; +}; + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +extern WDGDriver WDGD1; + +#ifdef __cplusplus +extern "C" { +#endif + void wdg_lld_init(void); + void wdg_lld_start(WDGDriver *wdgp); + void wdg_lld_stop(WDGDriver *wdgp); + void wdg_lld_reset(WDGDriver *wdgp); +#ifdef __cplusplus +} +#endif + +#endif /* HAL_USE_WDG == TRUE */ + +#endif /* _WDG_LLD_H_ */ + +/** @} */ -- cgit v1.2.3 From ed2a1f3e5c45eae6729e1cff338a4c4c6575aaed Mon Sep 17 00:00:00 2001 From: Stephane D'Alu Date: Sat, 6 Feb 2016 20:13:08 +0100 Subject: changed author --- os/hal/ports/NRF51/NRF51822/wdg_lld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'os/hal') diff --git a/os/hal/ports/NRF51/NRF51822/wdg_lld.c b/os/hal/ports/NRF51/NRF51822/wdg_lld.c index bd17ef7..2641c13 100644 --- a/os/hal/ports/NRF51/NRF51822/wdg_lld.c +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.c @@ -1,5 +1,5 @@ /* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + ChibiOS - Copyright (C) 2006 Stephane D'Alu Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. -- cgit v1.2.3 From a36b59eacd63f91c521cbad1bff981a611fb66e7 Mon Sep 17 00:00:00 2001 From: Stephane D'Alu Date: Sat, 6 Feb 2016 20:14:32 +0100 Subject: s/template/NRF51822/g --- os/hal/ports/NRF51/NRF51822/wdg_lld.c | 2 +- os/hal/ports/NRF51/NRF51822/wdg_lld.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'os/hal') diff --git a/os/hal/ports/NRF51/NRF51822/wdg_lld.c b/os/hal/ports/NRF51/NRF51822/wdg_lld.c index 2641c13..0a8a4fd 100644 --- a/os/hal/ports/NRF51/NRF51822/wdg_lld.c +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.c @@ -15,7 +15,7 @@ */ /** - * @file templates/wdg_lld.c + * @file NRF51822/wdg_lld.c * @brief WDG Driver subsystem low level driver source template. * * @addtogroup WDG diff --git a/os/hal/ports/NRF51/NRF51822/wdg_lld.h b/os/hal/ports/NRF51/NRF51822/wdg_lld.h index 8a3f97d..131fd21 100644 --- a/os/hal/ports/NRF51/NRF51822/wdg_lld.h +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.h @@ -15,7 +15,7 @@ */ /** - * @file templates/wdg_lld.h + * @file NRF51822/wdg_lld.h * @brief WDG Driver subsystem low level driver header template. * * @addtogroup WDG -- cgit v1.2.3 From c4d7b8d17850b082681eeccd2ea019cf2d392a33 Mon Sep 17 00:00:00 2001 From: Stephane D'Alu Date: Sat, 6 Feb 2016 22:52:33 +0100 Subject: added LFCLK and HFCLK frequencies --- os/hal/ports/NRF51/NRF51822/hal_lld.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'os/hal') diff --git a/os/hal/ports/NRF51/NRF51822/hal_lld.h b/os/hal/ports/NRF51/NRF51822/hal_lld.h index 1cc9057..436789c 100644 --- a/os/hal/ports/NRF51/NRF51822/hal_lld.h +++ b/os/hal/ports/NRF51/NRF51822/hal_lld.h @@ -61,6 +61,9 @@ #include "nvic.h" +#define NRF51_LFCLK_FREQUENCY 32768 +#define NRF51_HFCLK_FREQUENCY 16000000 + #ifdef __cplusplus extern "C" { #endif -- cgit v1.2.3 From 879e031a231e9d17f3e8603010ec650d58aca4aa Mon Sep 17 00:00:00 2001 From: Stephane D'Alu Date: Sat, 6 Feb 2016 22:56:30 +0100 Subject: add driver to plateform.mk --- os/hal/ports/NRF51/NRF51822/platform.mk | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'os/hal') diff --git a/os/hal/ports/NRF51/NRF51822/platform.mk b/os/hal/ports/NRF51/NRF51822/platform.mk index 4fb50bc..1a4d876 100644 --- a/os/hal/ports/NRF51/NRF51822/platform.mk +++ b/os/hal/ports/NRF51/NRF51822/platform.mk @@ -28,6 +28,9 @@ endif ifneq ($(findstring HAL_USE_GPT TRUE,$(HALCONF)),) PLATFORMSRC += ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/gpt_lld.c endif +ifneq ($(findstring HAL_USE_WDG TRUE,$(HALCONF)),) +PLATFORMSRC += ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/wdg_lld.c +endif else PLATFORMSRC = ${CHIBIOS}/os/hal/ports/common/ARMCMx/nvic.c \ ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/hal_lld.c \ @@ -39,9 +42,12 @@ PLATFORMSRC = ${CHIBIOS}/os/hal/ports/common/ARMCMx/nvic.c \ ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/ext_lld.c \ ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/i2c_lld.c \ ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/adc_lld.c \ - ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/gpt_lld.c + ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/gpt_lld.c \ + ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822/wdg_lld.c endif # Required include directories PLATFORMINC = ${CHIBIOS}/os/hal/ports/common/ARMCMx \ ${CHIBIOS_CONTRIB}/os/hal/ports/NRF51/NRF51822 + + -- cgit v1.2.3 From b7e24328d51390b16d33896b93589886f014667b Mon Sep 17 00:00:00 2001 From: Stephane D'Alu Date: Tue, 9 Feb 2016 17:40:44 +0100 Subject: fixed typos --- os/hal/ports/NRF51/NRF51822/wdg_lld.c | 4 ++-- os/hal/ports/NRF51/NRF51822/wdg_lld.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'os/hal') diff --git a/os/hal/ports/NRF51/NRF51822/wdg_lld.c b/os/hal/ports/NRF51/NRF51822/wdg_lld.c index 0a8a4fd..0a25ceb 100644 --- a/os/hal/ports/NRF51/NRF51822/wdg_lld.c +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.c @@ -1,5 +1,5 @@ /* - ChibiOS - Copyright (C) 2006 Stephane D'Alu + ChibiOS - Copyright (C) 2016 Stephane D'Alu Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -94,7 +94,7 @@ void wdg_lld_init(void) { /** * @brief Configures and activates the WDG peripheral. * - * @note Once started there is now way out. + * @note Once started there is no way out. * * @param[in] wdgp pointer to the @p WDGDriver object * diff --git a/os/hal/ports/NRF51/NRF51822/wdg_lld.h b/os/hal/ports/NRF51/NRF51822/wdg_lld.h index 131fd21..581c25b 100644 --- a/os/hal/ports/NRF51/NRF51822/wdg_lld.h +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.h @@ -1,5 +1,5 @@ /* - ChibiOS - Copyright (C) 2006 Stephane D'Alu + ChibiOS - Copyright (C) 2016 Stephane D'Alu Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. -- cgit v1.2.3