1 /**
2  * @file    wdt.h
3  * @brief   Watchdog timer (WDT) function prototypes and data types.
4  */
5 
6 /******************************************************************************
7  *
8  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
9  * Analog Devices, Inc.),
10  * Copyright (C) 2023-2024 Analog Devices, Inc.
11  *
12  * Licensed under the Apache License, Version 2.0 (the "License");
13  * you may not use this file except in compliance with the License.
14  * You may obtain a copy of the License at
15  *
16  *     http://www.apache.org/licenses/LICENSE-2.0
17  *
18  * Unless required by applicable law or agreed to in writing, software
19  * distributed under the License is distributed on an "AS IS" BASIS,
20  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  * See the License for the specific language governing permissions and
22  * limitations under the License.
23  *
24  ******************************************************************************/
25 
26 /* Define to prevent redundant inclusion */
27 #ifndef LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32680_WDT_H_
28 #define LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32680_WDT_H_
29 
30 /* **** Includes **** */
31 #include <stdint.h>
32 #include "mxc_device.h"
33 #include "wdt_regs.h"
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 /**
40  * @defgroup wdt WDT
41  * @ingroup periphlibs
42  * @{
43  */
44 
45 /* **** Definitions **** */
46 
47 /** @brief Watchdog upper limit period enumeration.
48     Used to configure the period of the watchdog interrupt */
49 typedef enum {
50     MXC_WDT_PERIOD_2_31 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW31, ///< Period 2^31
51     MXC_WDT_PERIOD_2_30 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW30, ///< Period 2^30
52     MXC_WDT_PERIOD_2_29 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW29, ///< Period 2^29
53     MXC_WDT_PERIOD_2_28 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW28, ///< Period 2^28
54     MXC_WDT_PERIOD_2_27 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW27, ///< Period 2^27
55     MXC_WDT_PERIOD_2_26 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW26, ///< Period 2^26
56     MXC_WDT_PERIOD_2_25 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW25, ///< Period 2^25
57     MXC_WDT_PERIOD_2_24 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW24, ///< Period 2^24
58     MXC_WDT_PERIOD_2_23 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW23, ///< Period 2^23
59     MXC_WDT_PERIOD_2_22 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW22, ///< Period 2^22
60     MXC_WDT_PERIOD_2_21 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW21, ///< Period 2^21
61     MXC_WDT_PERIOD_2_20 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW20, ///< Period 2^20
62     MXC_WDT_PERIOD_2_19 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW19, ///< Period 2^19
63     MXC_WDT_PERIOD_2_18 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW18, ///< Period 2^18
64     MXC_WDT_PERIOD_2_17 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW17, ///< Period 2^17
65     MXC_WDT_PERIOD_2_16 = MXC_S_WDT_CTRL_INT_LATE_VAL_WDT2POW16, ///< Period 2^16
66 } mxc_wdt_period_t;
67 
68 /**
69  * @brief Watchdog interrupt flag enumeration
70  */
71 typedef enum {
72     MXC_WDT_INT_TOO_LATE = MXC_F_WDT_CTRL_INT_LATE,
73     MXC_WDT_INT_TOO_SOON = MXC_F_WDT_CTRL_INT_EARLY,
74 } mxc_wdt_int_t;
75 
76 /**
77  * @brief Watchdog reset flag enumeration
78  */
79 typedef enum {
80     MXC_WDT_RST_TOO_LATE = MXC_F_WDT_CTRL_RST_LATE,
81     MXC_WDT_RST_TOO_SOON = MXC_F_WDT_CTRL_RST_EARLY,
82 } mxc_wdt_rst_t;
83 
84 /**
85  * @brief Watchdog mode enumeration
86  */
87 typedef enum {
88     MXC_WDT_COMPATIBILITY = 0,
89     MXC_WDT_WINDOWED = 1,
90 } mxc_wdt_mode_t;
91 
92 /**
93  * @brief Peripheral Clock settings
94  */
95 typedef enum { MXC_WDT_PCLK = 0, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK } mxc_wdt_clock_t;
96 
97 /**
98  * @brief Timer Configuration
99  */
100 typedef struct {
101     mxc_wdt_mode_t mode; ///< WDT mode
102     mxc_wdt_period_t upperResetPeriod; ///< Reset upper limit
103     mxc_wdt_period_t lowerResetPeriod; ///< Reset lower limit
104     mxc_wdt_period_t upperIntPeriod; ///< Interrupt upper limit
105     mxc_wdt_period_t lowerIntPeriod; ///< Interrupt lower limit
106 } mxc_wdt_cfg_t;
107 /* **** Function Prototypes **** */
108 
109 /**
110  * @brief Initialize the Watchdog Timer
111  * @note  On default this function enables WDT peripheral clock.
112  *        if you wish to manage clock and gpio related things in upper level instead of here.
113  *        Define MSDK_NO_GPIO_CLK_INIT flag in project.mk file.
114  *        By this flag this function will remove clock and gpio related codes from file.
115  *
116  * @param       wdt     Pointer to the watchdog registers
117  * @param       cfg     watchdog configuration
118  * @return      See \ref MXC_Error_Codes for the list of error codes.
119  */
120 int MXC_WDT_Init(mxc_wdt_regs_t *wdt, mxc_wdt_cfg_t *cfg);
121 
122 /**
123  * @brief Shutdown the Watchdog Timer
124  * @param       wdt     Pointer to the watchdog registers
125  * @return      See \ref MXC_Error_Codes for the list of error codes.
126  */
127 int MXC_WDT_Shutdown(mxc_wdt_regs_t *wdt);
128 
129 /**
130  * @brief       Set the period of the watchdog interrupt.
131  * @param       wdt     Pointer to watchdog registers.
132  * @param       cfg     watchdog configuration.
133  */
134 void MXC_WDT_SetIntPeriod(mxc_wdt_regs_t *wdt, mxc_wdt_cfg_t *cfg);
135 
136 /**
137  * @brief       Set the period of the watchdog reset.
138  * @param       wdt     Pointer to watchdog registers.
139  * @param       cfg     watchdog configuration.
140  */
141 void MXC_WDT_SetResetPeriod(mxc_wdt_regs_t *wdt, mxc_wdt_cfg_t *cfg);
142 
143 /**
144  * @brief       Enable the watchdog timer.
145  * @param       wdt     Pointer to watchdog registers.
146  */
147 void MXC_WDT_Enable(mxc_wdt_regs_t *wdt);
148 
149 /**
150  * @brief       Disable the watchdog timer.
151  * @param       wdt     Pointer to watchdog registers.
152  */
153 void MXC_WDT_Disable(mxc_wdt_regs_t *wdt);
154 
155 /**
156  * @brief       Enable the watchdog interrupt.
157  * @param       wdt     Pointer to watchdog registers.
158  */
159 void MXC_WDT_EnableInt(mxc_wdt_regs_t *wdt);
160 
161 /**
162  * @brief       Disable the watchdog interrupt.
163  * @param       wdt     Pointer to watchdog registers.
164  */
165 void MXC_WDT_DisableInt(mxc_wdt_regs_t *wdt);
166 
167 /**
168  * @brief       Enable the watchdog reset.
169  * @param       wdt     Pointer to watchdog registers.
170  */
171 void MXC_WDT_EnableReset(mxc_wdt_regs_t *wdt);
172 
173 /**
174  * @brief       Disable the watchdog reset.
175  * @param       wdt     Pointer to watchdog registers.
176  */
177 void MXC_WDT_DisableReset(mxc_wdt_regs_t *wdt);
178 
179 /**
180  * @brief       Reset the watchdog timer.
181  * @param       wdt     Pointer to watchdog registers.
182  */
183 void MXC_WDT_ResetTimer(mxc_wdt_regs_t *wdt);
184 
185 /**
186  * @brief       Get the status of the reset flag.
187  * @param       wdt     Pointer to watchdog registers.
188  * @returns     1 if the previous reset was caused by the watchdog, 0 otherwise.
189  */
190 int MXC_WDT_GetResetFlag(mxc_wdt_regs_t *wdt);
191 
192 /**
193  * @brief       Clears the reset flag.
194  * @param       wdt     Pointer to watchdog registers.
195  */
196 void MXC_WDT_ClearResetFlag(mxc_wdt_regs_t *wdt);
197 
198 /**
199  * @brief       Get the status of the interrupt flag.
200  * @param       wdt     Pointer to watchdog registers.
201  * @returns     1 if the interrupt is pending, 0 otherwise.
202  */
203 int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt);
204 
205 /**
206  * @brief       Clears the interrupt flag.
207  * @param       wdt     Pointer to watchdog registers.
208  */
209 void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt);
210 
211 /**
212  * @brief       Sets clock source.
213  * @param       wdt             Pointer to watchdog registers.
214  * @param       clock_source    Clock source.
215  */
216 int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source);
217 
218 /**@} end of group wdt */
219 
220 #ifdef __cplusplus
221 }
222 #endif
223 
224 #endif // LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32680_WDT_H_
225