/* * Copyright (c) 2015-2019, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*!**************************************************************************** * @file WatchdogCC32XX.h * @brief Watchdog timer driver implementation for CC32XX * * The Watchdog header file for CC32XX should be included in an application * as follows: * @code * #include * #include * @endcode * * Refer to @ref Watchdog.h for a complete description of APIs. * * This Watchdog driver implementation is designed to operate on a CC32XX * device. Once opened, CC32XX Watchdog will count down from the reload * value specified in the WatchdogCC32XX_HWAttrs. If it times out, the * Watchdog interrupt flag will be set, and a user-provided callback function * will be called. If the Watchdog Timer is allowed to time out again while * the interrupt flag is still pending, a reset signal will be generated. * To prevent a reset, Watchdog_clear() must be called to clear the interrupt * flag. * * @warning The watchdog peripheral does not support a Non-Maskable Interrupt (NMI). * * The reload value from which the Watchdog Timer counts down may be changed * during runtime using Watchdog_setReload(). * * Watchdog_close() is not supported by this driver implementation. * * By default the Watchdog driver has resets turned on. This feature cannot * be disabled. * * To have a user-defined function run at the warning interrupt, first define * a void-type function that takes a Watchdog_Handle cast to a UArg as an * argument. The callback and code to start the Watchdog timer are shown below. * * @code * void watchdogCallback(UArg handle); * * ... * * Watchdog_Handle handle; * Watchdog_Params params; * uint32_t tickValue; * * Watchdog_Params_init(¶ms); * params.callbackFxn = watchdogCallback; * handle = Watchdog_open(Watchdog_configIndex, ¶ms); * // Set timeout period to 100 ms * tickValue = Watchdog_convertMsToTicks(handle, 100); * Watchdog_setReload(handle, tickValue); * * ... * * void watchdogCallback(UArg handle) * { * // User-defined code here * ... * * } * @endcode * * # Power Driver Usage # * * The watchdog timer driver does not set any power constraints. If the power * driver is enabled, the application will continue to aggressively attempt * to place the device into the lowest power state possible. * * When the device enters Low Power Deep Sleep, the peripheral registers are * reset. After a transition from Low Power Deep Sleep, the watchdog timer will * be re-initialized automatically with the most recently set reload value. If * Watchdog_setReload() was never called, the * #WatchdogCC32XX_HWAttrs.reloadValue is used. With each transition to and * from Low Power Deep Sleep, the watchdog timer is implicitly cleared. * ****************************************************************************** */ #ifndef ti_drivers_watchdog_WatchdogCC32XX__include #define ti_drivers_watchdog_WatchdogCC32XX__include #include #include #include #ifdef __cplusplus extern "C" { #endif /** * @addtogroup Watchdog_STATUS * WatchdogCC32XX_STATUS_* macros are command codes only defined in the * WatchdogCC32XX.h driver implementation and need to: * @code * #include * @endcode * @{ */ /* Add WatchdogCC32XX_STATUS_* macros here */ /** @}*/ /** * @addtogroup Watchdog_CMD * WatchdogCC32XX_CMD_* macros are command codes only defined in the * WatchdogCC32XX.h driver implementation and need to: * @code * #include * @endcode * @{ */ /*! * @brief Command used by Watchdog_control to determines * whether the watchdog timer is enabled * * With this command code, @b arg is a pointer to a @c bool. * @b *arg contains @c true if the watchdog timer is enabled, * else @c false if it is not. */ #define WatchdogCC32XX_CMD_IS_TIMER_ENABLE (Watchdog_CMD_RESERVED + 0) /*! * @brief Command used by Watchdog_control * to gets the current watchdog timer value * * With this command code, @b arg is a pointer to an @a integer. * @b *arg contains the current value of the watchdog timer. */ #define WatchdogCC32XX_CMD_GET_TIMER_VALUE (Watchdog_CMD_RESERVED + 1) /*! * @brief Command used by Watchdog_control to determines * whether the watchdog timer is locked * * With this command code, @b arg is a pointer to a @c bool. * @b *arg contains @c true if the watchdog timer is locked, * else @c false if it is not. */ #define WatchdogCC32XX_CMD_IS_TIMER_LOCKED (Watchdog_CMD_RESERVED + 2) /*! * @brief Command used by Watchdog_control * to gets the current watchdog timer reload value * * With this command code, @b arg is a pointer to an @a integer. * @b *arg contains the current value loaded into the watchdog timer when * the count reaches zero for the first time. */ #define WatchdogCC32XX_CMD_GET_TIMER_RELOAD_VALUE (Watchdog_CMD_RESERVED + 3) /** @}*/ /*! @brief Watchdog function table for CC32XX */ extern const Watchdog_FxnTable WatchdogCC32XX_fxnTable; /*! * @brief Watchdog hardware attributes for CC32XX * * intPriority is the Watchdog timer's interrupt priority, as defined by the * underlying OS. It is passed unmodified to the underlying OS's interrupt * handler creation code, so you need to refer to the OS documentation * for usage. For example, for SYS/BIOS applications, refer to the * ti.sysbios.family.arm.m3.Hwi documentation for SYS/BIOS usage of * interrupt priorities. If the driver uses the ti.dpl interface * instead of making OS calls directly, then the HwiP port handles the * interrupt priority in an OS specific way. In the case of the SYS/BIOS * port, intPriority is passed unmodified to Hwi_create(). */ typedef struct { unsigned int baseAddr; /*!< Base address for Watchdog */ unsigned int intNum; /*!< WDT interrupt number */ unsigned int intPriority; /*!< WDT interrupt priority */ uint32_t reloadValue; /*!< Reload value for Watchdog */ } WatchdogCC32XX_HWAttrs; /*! * @brief Watchdog Object for CC32XX * * Not to be accessed by the user. */ typedef struct { Power_NotifyObj notifyObj; /* * The reload value can be set at runtime; therefore we can't rely * on the reload value supplied in the HWAttrs after a LPDS transition. */ uint32_t reloadValue; Watchdog_DebugMode debugMode; bool isOpen; } WatchdogCC32XX_Object; #ifdef __cplusplus } #endif #endif /* ti_drivers_watchdog_WatchdogCC32XX__include */