LCOV - code coverage report
Current view: top level - zephyr/drivers - watchdog.h Coverage Total Hit
Test: new.info Lines: 94.7 % 19 18
Test Date: 2025-09-05 16:43:28

            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_ */
        

Generated by: LCOV version 2.0-1