Line data Source code
1 0 : /* 2 : * Copyright (c) 2017 Nordic Semiconductor ASA 3 : * Copyright (c) 2015 Intel Corporation 4 : * 5 : * SPDX-License-Identifier: Apache-2.0 6 : */ 7 : 8 : #ifndef ZEPHYR_INCLUDE_DRIVERS_WATCHDOG_H_ 9 : #define ZEPHYR_INCLUDE_DRIVERS_WATCHDOG_H_ 10 : 11 : /** 12 : * @brief Watchdog Interface 13 : * @defgroup watchdog_interface Watchdog Interface 14 : * @since 1.0 15 : * @version 1.0.0 16 : * @ingroup io_interfaces 17 : * @{ 18 : */ 19 : 20 : #include <zephyr/types.h> 21 : #include <zephyr/sys/util.h> 22 : #include <zephyr/device.h> 23 : 24 : #ifdef __cplusplus 25 : extern "C" { 26 : #endif 27 : 28 : /** 29 : * @name Watchdog options 30 : * @anchor WDT_OPT 31 : * @{ 32 : */ 33 : 34 : /** @brief Pause watchdog timer when CPU is in sleep state. */ 35 1 : #define WDT_OPT_PAUSE_IN_SLEEP BIT(0) 36 : 37 : /** @brief Pause watchdog timer when CPU is halted by the debugger. */ 38 1 : #define WDT_OPT_PAUSE_HALTED_BY_DBG BIT(1) 39 : 40 : /** @} */ 41 : 42 : /** 43 : * @name Watchdog behavior flags 44 : * @anchor WDT_FLAGS 45 : * @{ 46 : */ 47 : 48 : /** @cond INTERNAL_HIDDEN */ 49 : /** @brief Watchdog reset flag bit field mask shift. */ 50 : #define WDT_FLAG_RESET_SHIFT (0) 51 : /** @brief Watchdog reset flag bit field mask. */ 52 : #define WDT_FLAG_RESET_MASK (0x3 << WDT_FLAG_RESET_SHIFT) 53 : /** @endcond */ 54 : 55 : /** Reset: none */ 56 1 : #define WDT_FLAG_RESET_NONE (0 << WDT_FLAG_RESET_SHIFT) 57 : /** Reset: CPU core */ 58 1 : #define WDT_FLAG_RESET_CPU_CORE (1 << WDT_FLAG_RESET_SHIFT) 59 : /** Reset: SoC */ 60 1 : #define WDT_FLAG_RESET_SOC (2 << WDT_FLAG_RESET_SHIFT) 61 : 62 : /** @} */ 63 : 64 : /** 65 : * @brief Watchdog timeout window. 66 : * 67 : * Each installed timeout needs feeding within the specified time window, 68 : * otherwise the watchdog will trigger. If the watchdog instance does not 69 : * support window timeouts then min value must be equal to 0. 70 : * 71 : * @note If specified values can not be precisely set they are always rounded 72 : * up. 73 : */ 74 1 : struct wdt_window { 75 : /** Lower limit of watchdog feed timeout in milliseconds. */ 76 1 : uint32_t min; 77 : /** Upper limit of watchdog feed timeout in milliseconds. */ 78 1 : uint32_t max; 79 : }; 80 : 81 : /** 82 : * @brief Watchdog callback. 83 : * 84 : * @param dev Watchdog device instance. 85 : * @param channel_id Channel identifier. 86 : */ 87 1 : typedef void (*wdt_callback_t)(const struct device *dev, int channel_id); 88 : 89 : /** @brief Watchdog timeout configuration. */ 90 1 : struct wdt_timeout_cfg { 91 : /** Timing parameters of watchdog timeout. */ 92 1 : struct wdt_window window; 93 : /** Timeout callback (can be `NULL`). */ 94 1 : wdt_callback_t callback; 95 : #if defined(CONFIG_WDT_MULTISTAGE) || defined(__DOXYGEN__) 96 : /** 97 : * Pointer to the next timeout configuration. 98 : * 99 : * This field is only available if @kconfig{CONFIG_WDT_MULTISTAGE} is 100 : * enabled (watchdogs with staged timeouts functionality). Value must be 101 : * `NULL` for single stage timeout. 102 : */ 103 1 : struct wdt_timeout_cfg *next; 104 : #endif 105 : /** Flags (see @ref WDT_FLAGS). */ 106 1 : uint8_t flags; 107 : }; 108 : 109 : /** @cond INTERNAL_HIDDEN */ 110 : 111 : /** 112 : * @brief Callback API for setting up watchdog instance. 113 : * @see wdt_setup(). 114 : */ 115 : typedef int (*wdt_api_setup)(const struct device *dev, uint8_t options); 116 : 117 : /** 118 : * @brief Callback API for disabling watchdog instance. 119 : * @see wdt_disable(). 120 : */ 121 : typedef int (*wdt_api_disable)(const struct device *dev); 122 : 123 : /** 124 : * @brief Callback API for installing new timeout. 125 : * @see wdt_install_timeout(). 126 : */ 127 : typedef int (*wdt_api_install_timeout)(const struct device *dev, 128 : const struct wdt_timeout_cfg *cfg); 129 : 130 : /** 131 : * @brief Callback API for feeding specified watchdog timeout. 132 : * @see wdt_feed(). 133 : */ 134 : typedef int (*wdt_api_feed)(const struct device *dev, int channel_id); 135 : 136 : __subsystem struct wdt_driver_api { 137 : wdt_api_setup setup; 138 : wdt_api_disable disable; 139 : wdt_api_install_timeout install_timeout; 140 : wdt_api_feed feed; 141 : }; 142 : /** 143 : * @endcond 144 : */ 145 : 146 : /** 147 : * @brief Set up watchdog instance. 148 : * 149 : * This function is used for configuring global watchdog settings that 150 : * affect all timeouts. It should be called after installing timeouts. 151 : * After successful return, all installed timeouts are valid and must be 152 : * serviced periodically by calling wdt_feed(). 153 : * 154 : * @param dev Watchdog device instance. 155 : * @param options Configuration options (see @ref WDT_OPT). 156 : * 157 : * @retval 0 If successful. 158 : * @retval -ENOTSUP If any of the set options is not supported. 159 : * @retval -EBUSY If watchdog instance has been already setup. 160 : * @retval -errno In case of any other failure. 161 : */ 162 1 : __syscall int wdt_setup(const struct device *dev, uint8_t options); 163 : 164 : static inline int z_impl_wdt_setup(const struct device *dev, uint8_t options) 165 : { 166 : const struct wdt_driver_api *api = 167 : (const struct wdt_driver_api *)dev->api; 168 : 169 : return api->setup(dev, options); 170 : } 171 : 172 : /** 173 : * @brief Disable watchdog instance. 174 : * 175 : * This function disables the watchdog instance and automatically uninstalls all 176 : * timeouts. To set up a new watchdog, install timeouts and call wdt_setup() 177 : * again. Not all watchdogs can be restarted after they are disabled. 178 : * 179 : * @param dev Watchdog device instance. 180 : * 181 : * @retval 0 If successful. 182 : * @retval -EFAULT If watchdog instance is not enabled. 183 : * @retval -EPERM If watchdog can not be disabled directly by application code. 184 : * @retval -errno In case of any other failure. 185 : */ 186 1 : __syscall int wdt_disable(const struct device *dev); 187 : 188 : static inline int z_impl_wdt_disable(const struct device *dev) 189 : { 190 : const struct wdt_driver_api *api = 191 : (const struct wdt_driver_api *)dev->api; 192 : 193 : return api->disable(dev); 194 : } 195 : 196 : /** 197 : * @brief Install a new timeout. 198 : * 199 : * @note This function must be used before wdt_setup(). Changes applied here 200 : * have no effects until wdt_setup() is called. 201 : * 202 : * @param dev Watchdog device instance. 203 : * @param[in] cfg Timeout configuration. 204 : * 205 : * @retval channel_id If successful, a non-negative value indicating the index 206 : * of the channel to which the timeout was assigned. This value is supposed to 207 : * be used as the parameter in calls to wdt_feed(). 208 : * @retval -EBUSY If timeout can not be installed while watchdog has already 209 : * been setup. 210 : * @retval -ENOMEM If no more timeouts can be installed. 211 : * @retval -ENOTSUP If any of the set flags is not supported. 212 : * @retval -EINVAL If any of the window timeout value is out of possible range. 213 : * This value is also returned if watchdog supports only one timeout value for 214 : * all timeouts and the supplied timeout window differs from windows for alarms 215 : * installed so far. 216 : * @retval -errno In case of any other failure. 217 : */ 218 1 : static inline int wdt_install_timeout(const struct device *dev, 219 : const struct wdt_timeout_cfg *cfg) 220 : { 221 : const struct wdt_driver_api *api = 222 : (const struct wdt_driver_api *) dev->api; 223 : 224 : return api->install_timeout(dev, cfg); 225 : } 226 : 227 : /** 228 : * @brief Feed specified watchdog timeout. 229 : * 230 : * @param dev Watchdog device instance. 231 : * @param channel_id Channel index. 232 : * 233 : * @retval 0 If successful. 234 : * @retval -EAGAIN If completing the feed operation would stall the caller, for 235 : * example due to an in-progress watchdog operation such as a previous 236 : * wdt_feed() call. 237 : * @retval -EINVAL If there is no installed timeout for supplied channel. 238 : * @retval -errno In case of any other failure. 239 : */ 240 1 : __syscall int wdt_feed(const struct device *dev, int channel_id); 241 : 242 : static inline int z_impl_wdt_feed(const struct device *dev, int channel_id) 243 : { 244 : const struct wdt_driver_api *api = 245 : (const struct wdt_driver_api *)dev->api; 246 : 247 : return api->feed(dev, channel_id); 248 : } 249 : 250 : #ifdef __cplusplus 251 : } 252 : #endif 253 : 254 : /** @} */ 255 : 256 : #include <zephyr/syscalls/watchdog.h> 257 : 258 : #endif /* ZEPHYR_INCLUDE_DRIVERS_WATCHDOG_H_ */