1 /***************************************************************************//**
2 * @file
3 * @brief Reset Management Unit (RMU) peripheral API
4 *******************************************************************************
5 * # License
6 * <b>Copyright 2018 Silicon Laboratories Inc. www.silabs.com</b>
7 *******************************************************************************
8 *
9 * SPDX-License-Identifier: Zlib
10 *
11 * The licensor of this software is Silicon Laboratories Inc.
12 *
13 * This software is provided 'as-is', without any express or implied
14 * warranty. In no event will the authors be held liable for any damages
15 * arising from the use of this software.
16 *
17 * Permission is granted to anyone to use this software for any purpose,
18 * including commercial applications, and to alter it and redistribute it
19 * freely, subject to the following restrictions:
20 *
21 * 1. The origin of this software must not be misrepresented; you must not
22 * claim that you wrote the original software. If you use this software
23 * in a product, an acknowledgment in the product documentation would be
24 * appreciated but is not required.
25 * 2. Altered source versions must be plainly marked as such, and must not be
26 * misrepresented as being the original software.
27 * 3. This notice may not be removed or altered from any source distribution.
28 *
29 ******************************************************************************/
30
31 #ifndef EM_RMU_H
32 #define EM_RMU_H
33
34 #include "em_device.h"
35 #if (defined(RMU_COUNT) && (RMU_COUNT > 0)) || (_EMU_RSTCTRL_MASK)
36 #include "sl_assert.h"
37
38 #include <stdbool.h>
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 /***************************************************************************//**
45 * @addtogroup rmu
46 * @{
47 ******************************************************************************/
48
49 /*******************************************************************************
50 ******************************** ENUMS ************************************
51 ******************************************************************************/
52
53 /** RMU reset modes. */
54 typedef enum {
55 #if defined(_RMU_CTRL_PINRMODE_MASK)
56 rmuResetModeDisabled = _RMU_CTRL_PINRMODE_DISABLED, /**< Reset mode disabled. */
57 rmuResetModeLimited = _RMU_CTRL_PINRMODE_LIMITED, /**< Reset mode limited. */
58 rmuResetModeExtended = _RMU_CTRL_PINRMODE_EXTENDED, /**< Reset mode extended. */
59 rmuResetModeFull = _RMU_CTRL_PINRMODE_FULL, /**< Reset mode full. */
60 #elif defined(_EMU_RSTCTRL_MASK)
61 rmuResetModeDisabled = 0, /**< Reset mode disabled. */
62 rmuResetModeEnabled = 1, /**< Reset mode enabled. */
63 #else
64 rmuResetModeClear = 0, /**< Reset mode clear. */
65 rmuResetModeSet = 1, /**< Reset mode set. */
66 #endif
67 } RMU_ResetMode_TypeDef;
68
69 /** RMU controlled peripheral reset control and reset source control. */
70 typedef enum {
71 #if defined(RMU_CTRL_BURSTEN)
72 rmuResetBU = _RMU_CTRL_BURSTEN_MASK, /**< Reset control over Backup Power domain select. */
73 #endif
74 #if defined(RMU_CTRL_LOCKUPRDIS)
75 rmuResetLockUp = _RMU_CTRL_LOCKUPRDIS_MASK, /**< Cortex lockup reset select. */
76 #elif defined(_RMU_CTRL_LOCKUPRMODE_MASK)
77 rmuResetLockUp = _RMU_CTRL_LOCKUPRMODE_MASK, /**< Cortex lockup reset select. */
78 #endif
79 #if defined(_RMU_CTRL_WDOGRMODE_MASK)
80 rmuResetWdog = _RMU_CTRL_WDOGRMODE_MASK, /**< WDOG reset select. */
81 #endif
82 #if defined(_RMU_CTRL_LOCKUPRMODE_MASK)
83 rmuResetCoreLockup = _RMU_CTRL_LOCKUPRMODE_MASK, /**< Cortex lockup reset select. */
84 #endif
85 #if defined(_RMU_CTRL_SYSRMODE_MASK)
86 rmuResetSys = _RMU_CTRL_SYSRMODE_MASK, /**< SYSRESET select. */
87 #endif
88 #if defined(_RMU_CTRL_PINRMODE_MASK)
89 rmuResetPin = _RMU_CTRL_PINRMODE_MASK, /**< Pin reset select. */
90 #endif
91
92 #if defined(_EMU_RSTCTRL_WDOG0RMODE_MASK)
93 rmuResetWdog0 = _EMU_RSTCTRL_WDOG0RMODE_MASK, /**< WDOG0 reset select */
94 #endif
95 #if defined(_EMU_RSTCTRL_WDOG1RMODE_MASK)
96 rmuResetWdog1 = _EMU_RSTCTRL_WDOG1RMODE_MASK, /**< WDOG1 reset select */
97 #endif
98 #if defined(_EMU_RSTCTRL_SYSRMODE_MASK)
99 rmuResetSys = _EMU_RSTCTRL_SYSRMODE_MASK, /**< SYSRESET select */
100 #endif
101 #if defined(_EMU_RSTCTRL_LOCKUPRMODE_MASK)
102 rmuResetCoreLockup = _EMU_RSTCTRL_LOCKUPRMODE_MASK, /**< Cortex lockup reset select */
103 #endif
104 #if defined(_EMU_RSTCTRL_AVDDBODRMODE_MASK)
105 rmuResetAVDD = _EMU_RSTCTRL_AVDDBODRMODE_MASK, /**< AVDD monitoring select */
106 #endif
107 #if defined(_EMU_RSTCTRL_IOVDD0BODRMODE_MASK)
108 rmuResetIOVDD0 = _EMU_RSTCTRL_IOVDD0BODRMODE_MASK, /**< IOVDD0 monitoring select */
109 #endif
110 #if defined(_EMU_RSTCTRL_IOVDD1BODRMODE_MASK)
111 rmuResetIOVDD1 = _EMU_RSTCTRL_IOVDD1BODRMODE_MASK, /**< IOVDD1 monitoring select */
112 #endif
113 #if defined(_EMU_RSTCTRL_IOVDD2BODRMODE_MASK)
114 rmuResetIOVDD2 = _EMU_RSTCTRL_IOVDD2BODRMODE_MASK, /**< IOVDD2 monitoring select */
115 #endif
116 #if defined(_EMU_RSTCTRL_DECBODRMODE_MASK)
117 rmuResetDecouple = _EMU_RSTCTRL_DECBODRMODE_MASK, /**< Decouple monitoring select */
118 #endif
119 #if defined(_EMU_RSTCTRL_SESYSRMODE_MASK)
120 rmuResetSESys = _EMU_RSTCTRL_SESYSRMODE_MASK, /**< M0+ (SE) system reset select */
121 #endif
122 #if defined(_EMU_RSTCTRL_SELOCKUPRMODE_MASK)
123 rmuResetSELockup = _EMU_RSTCTRL_SELOCKUPRMODE_MASK, /**< M0+ (SE) lockup select */
124 #endif
125 #if defined(_EMU_RSTCTRL_DCIRMODE_MASK)
126 rmuResetDCI = _EMU_RSTCTRL_DCIRMODE_MASK, /**< DCI reset select */
127 #endif
128 } RMU_Reset_TypeDef;
129
130 /*******************************************************************************
131 ***************************** PROTOTYPES **********************************
132 ******************************************************************************/
133
134 /** RMU_LockupResetDisable kept for backwards compatibility. */
135 #define RMU_LockupResetDisable(A) RMU_ResetControl(rmuResetLockUp, A)
136
137 void RMU_ResetControl(RMU_Reset_TypeDef reset, RMU_ResetMode_TypeDef mode);
138 void RMU_ResetCauseClear(void);
139 uint32_t RMU_ResetCauseGet(void);
140
141 #if defined(_RMU_CTRL_RESETSTATE_MASK)
142 /***************************************************************************//**
143 * @brief
144 * Set user reset state. Reset only by a Power-on-reset and a pin reset.
145 *
146 * @param[in] userState User state to set
147 ******************************************************************************/
RMU_UserResetStateSet(uint32_t userState)148 __STATIC_INLINE void RMU_UserResetStateSet(uint32_t userState)
149 {
150 EFM_ASSERT(!(userState
151 & ~(_RMU_CTRL_RESETSTATE_MASK >> _RMU_CTRL_RESETSTATE_SHIFT)));
152 RMU->CTRL = (RMU->CTRL & ~_RMU_CTRL_RESETSTATE_MASK)
153 | (userState << _RMU_CTRL_RESETSTATE_SHIFT);
154 }
155
156 /***************************************************************************//**
157 * @brief
158 * Get user reset state. Reset only by a Power-on-reset and a pin reset.
159 *
160 * @return
161 * Reset surviving user state.
162 ******************************************************************************/
RMU_UserResetStateGet(void)163 __STATIC_INLINE uint32_t RMU_UserResetStateGet(void)
164 {
165 uint32_t userState = (RMU->CTRL & _RMU_CTRL_RESETSTATE_MASK)
166 >> _RMU_CTRL_RESETSTATE_SHIFT;
167 return userState;
168 }
169 #endif
170
171 /** @} (end addtogroup rmu) */
172
173 #ifdef __cplusplus
174 }
175 #endif
176
177 #endif /* defined(RMU_COUNT) && (RMU_COUNT > 0) */
178 #endif /* EM_RMU_H */
179