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_MAX78000_WDT_H_
28 #define LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX78000_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 {
96     MXC_WDT_PCLK = 0,
97     MXC_WDT_IBRO_CLK,
98     MXC_WDT_INRO_CLK,
99     MXC_WDT_ERTCO_CLK
100 } mxc_wdt_clock_t;
101 
102 /**
103  * @brief Timer Configuration
104  */
105 typedef struct {
106     mxc_wdt_mode_t mode; ///< WDT mode
107     mxc_wdt_period_t upperResetPeriod; ///< Reset upper limit
108     mxc_wdt_period_t lowerResetPeriod; ///< Reset lower limit
109     mxc_wdt_period_t upperIntPeriod; ///< Interrupt upper limit
110     mxc_wdt_period_t lowerIntPeriod; ///< Interrupt lower limit
111 } mxc_wdt_cfg_t;
112 /* **** Function Prototypes **** */
113 
114 /**
115  * @brief Initialize the Watchdog Timer
116  * @note  On default this function enables WDT peripheral clock.
117  *        if you wish to manage clock and gpio related things in upper level instead of here.
118  *        Define MSDK_NO_GPIO_CLK_INIT flag in project.mk file.
119  *        By this flag this function will remove clock and gpio related codes from file.
120  *
121  * @param       wdt     Pointer to the watchdog registers
122  * @param       cfg     watchdog configuration
123  * @return      See \ref MXC_Error_Codes for the list of error codes.
124  */
125 int MXC_WDT_Init(mxc_wdt_regs_t *wdt, mxc_wdt_cfg_t *cfg);
126 
127 /**
128  * @brief Shutdown the Watchdog Timer
129  * @param       wdt     Pointer to the watchdog registers
130  * @return      See \ref MXC_Error_Codes for the list of error codes.
131  */
132 int MXC_WDT_Shutdown(mxc_wdt_regs_t *wdt);
133 
134 /**
135  * @brief       Set the period of the watchdog interrupt.
136  * @param       wdt     Pointer to watchdog registers.
137  * @param       cfg     watchdog configuration.
138  */
139 void MXC_WDT_SetIntPeriod(mxc_wdt_regs_t *wdt, mxc_wdt_cfg_t *cfg);
140 
141 /**
142  * @brief       Set the period of the watchdog reset.
143  * @param       wdt     Pointer to watchdog registers.
144  * @param       cfg     watchdog configuration.
145  */
146 void MXC_WDT_SetResetPeriod(mxc_wdt_regs_t *wdt, mxc_wdt_cfg_t *cfg);
147 
148 /**
149  * @brief       Enable the watchdog timer.
150  * @param       wdt     Pointer to watchdog registers.
151  */
152 void MXC_WDT_Enable(mxc_wdt_regs_t *wdt);
153 
154 /**
155  * @brief       Disable the watchdog timer.
156  * @param       wdt     Pointer to watchdog registers.
157  */
158 void MXC_WDT_Disable(mxc_wdt_regs_t *wdt);
159 
160 /**
161  * @brief       Enable the watchdog interrupt.
162  * @param       wdt     Pointer to watchdog registers.
163  */
164 void MXC_WDT_EnableInt(mxc_wdt_regs_t *wdt);
165 
166 /**
167  * @brief       Disable the watchdog interrupt.
168  * @param       wdt     Pointer to watchdog registers.
169  */
170 void MXC_WDT_DisableInt(mxc_wdt_regs_t *wdt);
171 
172 /**
173  * @brief       Enable the watchdog reset.
174  * @param       wdt     Pointer to watchdog registers.
175  */
176 void MXC_WDT_EnableReset(mxc_wdt_regs_t *wdt);
177 
178 /**
179  * @brief       Disable the watchdog reset.
180  * @param       wdt     Pointer to watchdog registers.
181  */
182 void MXC_WDT_DisableReset(mxc_wdt_regs_t *wdt);
183 
184 /**
185  * @brief       Reset the watchdog timer.
186  * @param       wdt     Pointer to watchdog registers.
187  */
188 void MXC_WDT_ResetTimer(mxc_wdt_regs_t *wdt);
189 
190 /**
191  * @brief       Get the status of the reset flag.
192  * @param       wdt     Pointer to watchdog registers.
193  * @returns     1 if the previous reset was caused by the watchdog, 0 otherwise.
194  */
195 int MXC_WDT_GetResetFlag(mxc_wdt_regs_t *wdt);
196 
197 /**
198  * @brief       Clears the reset flag.
199  * @param       wdt     Pointer to watchdog registers.
200  */
201 void MXC_WDT_ClearResetFlag(mxc_wdt_regs_t *wdt);
202 
203 /**
204  * @brief       Get the status of the interrupt flag.
205  * @param       wdt     Pointer to watchdog registers.
206  * @returns     1 if the interrupt is pending, 0 otherwise.
207  */
208 int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt);
209 
210 /**
211  * @brief       Clears the interrupt flag.
212  * @param       wdt     Pointer to watchdog registers.
213  */
214 void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt);
215 
216 /**
217  * @brief       Sets clock source.
218  * @param       wdt             Pointer to watchdog registers.
219  * @param       clock_source    Clock source.
220  */
221 int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source);
222 
223 /**@} end of group wdt */
224 
225 #ifdef __cplusplus
226 }
227 #endif
228 
229 #endif // LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX78000_WDT_H_
230