diff options
| author | Stephane D'Alu <sdalu@sdalu.com> | 2016-02-09 21:08:18 +0100 | 
|---|---|---|
| committer | Stephane D'Alu <sdalu@sdalu.com> | 2016-02-09 21:08:18 +0100 | 
| commit | 526d92aa624d082ee7ec2e9c61ed943d49dd78c8 (patch) | |
| tree | 504ffa310a4882bfa2420373584389f973ee9f82 /os | |
| parent | 23a4b895cee55079a9fd1821dc6c068e035e75cc (diff) | |
| parent | db994ed1a671fe299499dc9ce0cd28cfebc2f409 (diff) | |
| download | ChibiOS-Contrib-526d92aa624d082ee7ec2e9c61ed943d49dd78c8.tar.gz ChibiOS-Contrib-526d92aa624d082ee7ec2e9c61ed943d49dd78c8.tar.bz2 ChibiOS-Contrib-526d92aa624d082ee7ec2e9c61ed943d49dd78c8.zip | |
Merge branch 'master' into sensor_hdc1000
Diffstat (limited to 'os')
| -rw-r--r-- | os/hal/ports/NRF51/NRF51822/hal_lld.h | 3 | ||||
| -rw-r--r-- | os/hal/ports/NRF51/NRF51822/platform.mk | 8 | ||||
| -rw-r--r-- | os/hal/ports/NRF51/NRF51822/wdg_lld.c | 150 | ||||
| -rw-r--r-- | os/hal/ports/NRF51/NRF51822/wdg_lld.h | 127 | 
4 files changed, 287 insertions, 1 deletions
| 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 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 + + 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..0a25ceb --- /dev/null +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.c @@ -0,0 +1,150 @@ +/*
 +    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.
 +    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    NRF51822/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 no 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..581c25b --- /dev/null +++ b/os/hal/ports/NRF51/NRF51822/wdg_lld.h @@ -0,0 +1,127 @@ +/*
 +    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.
 +    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    NRF51822/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_ */
 +
 +/** @} */
 | 
