1 /*
2  * Copyright (c) 2018 - 2023, Nordic Semiconductor ASA
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice, this
11  *    list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the copyright holder nor the names of its
18  *    contributors may be used to endorse or promote products derived from this
19  *    software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef NRF_REGULATORS_H__
35 #define NRF_REGULATORS_H__
36 
37 #include <nrfx.h>
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 /**
44  * @defgroup nrf_regulators_hal REGULATORS HAL
45  * @{
46  * @ingroup nrf_power
47  * @brief   Hardware access layer for managing the REGULATORS peripheral.
48  */
49 
50 #if defined(REGULATORS_VREGH_DCDCEN_DCDCEN_Msk) || defined(__NRFX_DOXYGEN__)
51 /** @brief Symbol indicating whether high voltage regulator (VREGH) is present. */
52 #define NRF_REGULATORS_HAS_VREG_HIGH 1
53 #else
54 #define NRF_REGULATORS_HAS_VREG_HIGH 0
55 #endif
56 
57 #if defined(REGULATORS_VREGM_ENABLE_ENABLE_Msk) || defined(__NRFX_DOXYGEN__)
58 /** @brief Symbol indicating whether medium voltage regulator (VREGM) is present. */
59 #define NRF_REGULATORS_HAS_VREG_MEDIUM 1
60 #else
61 #define NRF_REGULATORS_HAS_VREG_MEDIUM 0
62 #endif
63 
64 #if defined(REGULATORS_VREGRADIO_DCDCEN_DCDCEN_Msk) || defined(__NRFX_DOXYGEN__)
65 /** @brief Symbol indicating whether radio regulator (VREGRADIO) is present. */
66 #define NRF_REGULATORS_HAS_VREG_RADIO 1
67 #else
68 #define NRF_REGULATORS_HAS_VREG_RADIO 0
69 #endif
70 
71 #if defined(REGULATORS_POFCON_POF_Msk) || defined(__NRFX_DOXYGEN__)
72 /** @brief Symbol indicating whether Power-On-Fail Comparator (POF Comparator) is present. */
73 #define NRF_REGULATORS_HAS_POF 1
74 #else
75 #define NRF_REGULATORS_HAS_POF 0
76 #endif
77 
78 #if defined(REGULATORS_POFCON_THRESHOLDVDDH_Msk) || defined(__NRFX_DOXYGEN__)
79 /** @brief Symbol indicating whether POF Comparator for VDDH is present. */
80 #define NRF_REGULATORS_HAS_POF_VDDH 1
81 #else
82 #define NRF_REGULATORS_HAS_POF_VDDH 0
83 #endif
84 
85 #if defined(REGULATORS_POFCON_EVENTDISABLE_Msk) || defined(__NRFX_DOXYGEN__)
86 /** @brief Symbol indicating whether POF Comparator can disable POFWARN event. */
87 #define NRF_REGULATORS_HAS_POF_WARN_DISABLE 1
88 #else
89 #define NRF_REGULATORS_HAS_POF_WARN_DISABLE 0
90 #endif
91 
92 #if defined(REGULATORS_POFSTAT_COMPARATOR_Msk) || defined(__NRFX_DOXYGEN__)
93 /** @brief Symbol indicating whether POF Comparator status is present. */
94 #define NRF_REGULATORS_HAS_POF_STATUS 1
95 #else
96 #define NRF_REGULATORS_HAS_POF_STATUS 0
97 #endif
98 
99 #if defined(REGULATORS_TRIM_ResetValue) || defined(__NRFX_DOXYGEN__)
100 /** @brief Symbol indicating whether TRIM register is present. */
101 #define NRF_REGULATORS_HAS_TRIM 1
102 #else
103 #define NRF_REGULATORS_HAS_TRIM 0
104 #endif
105 
106 #if defined(REGULATORS_MAINREGSTATUS_VREGH_Msk) || defined(__NRFX_DOXYGEN__)
107 /** @brief Symbol indicating whether main supply status is present. */
108 #define NRF_REGULATORS_HAS_MAIN_STATUS 1
109 #else
110 #define NRF_REGULATORS_HAS_MAIN_STATUS 0
111 #endif
112 
113 #if defined(REGULATORS_VREGMAIN_INDUCTORDET_DETECTED_Msk) || defined(__NRFX_DOXYGEN__)
114 /** @brief Symbol indicating whether inductor detection is present. */
115 #define NRF_REGULATORS_HAS_INDUCTOR_DET 1
116 #else
117 #define NRF_REGULATORS_HAS_INDUCTOR_DET 0
118 #endif
119 
120 /** @brief Voltage regulators. */
121 typedef enum
122 {
123     NRF_REGULATORS_VREG_MAIN,   ///< Main voltage regulator (VREGMAIN).
124 #if NRF_REGULATORS_HAS_VREG_HIGH
125     NRF_REGULATORS_VREG_HIGH,   ///< High voltage regulator (VREGH).
126 #endif
127 #if NRF_REGULATORS_HAS_VREG_MEDIUM
128     NRF_REGULATORS_VREG_MEDIUM, ///< Medium voltage regulator (VREGM).
129 #endif
130 #if NRF_REGULATORS_HAS_VREG_RADIO
131     NRF_REGULATORS_VREG_RADIO,  ///< Radio voltage regulator (VREGRADIO).
132 #endif
133 } nrf_regulators_vreg_t;
134 
135 #if NRF_REGULATORS_HAS_POF
136 /** @brief POF Comparator thresholds. */
137 typedef enum
138 {
139 #if defined(REGULATORS_POFCON_THRESHOLD_V17) || defined(__NRFX_DOXYGEN__)
140     NRF_REGULATORS_POF_THR_1V7 = REGULATORS_POFCON_THRESHOLD_V17, ///< Set threshold to 1.7 V.
141 #endif
142 #if defined(REGULATORS_POFCON_THRESHOLD_V18) || defined(__NRFX_DOXYGEN__)
143     NRF_REGULATORS_POF_THR_1V8 = REGULATORS_POFCON_THRESHOLD_V18, ///< Set threshold to 1.8 V.
144 #endif
145     NRF_REGULATORS_POF_THR_1V9 = REGULATORS_POFCON_THRESHOLD_V19, ///< Set threshold to 1.9 V.
146     NRF_REGULATORS_POF_THR_2V0 = REGULATORS_POFCON_THRESHOLD_V20, ///< Set threshold to 2.0 V.
147     NRF_REGULATORS_POF_THR_2V1 = REGULATORS_POFCON_THRESHOLD_V21, ///< Set threshold to 2.1 V.
148     NRF_REGULATORS_POF_THR_2V2 = REGULATORS_POFCON_THRESHOLD_V22, ///< Set threshold to 2.2 V.
149     NRF_REGULATORS_POF_THR_2V3 = REGULATORS_POFCON_THRESHOLD_V23, ///< Set threshold to 2.3 V.
150     NRF_REGULATORS_POF_THR_2V4 = REGULATORS_POFCON_THRESHOLD_V24, ///< Set threshold to 2.4 V.
151     NRF_REGULATORS_POF_THR_2V5 = REGULATORS_POFCON_THRESHOLD_V25, ///< Set threshold to 2.5 V.
152     NRF_REGULATORS_POF_THR_2V6 = REGULATORS_POFCON_THRESHOLD_V26, ///< Set threshold to 2.6 V.
153     NRF_REGULATORS_POF_THR_2V7 = REGULATORS_POFCON_THRESHOLD_V27, ///< Set threshold to 2.7 V.
154     NRF_REGULATORS_POF_THR_2V8 = REGULATORS_POFCON_THRESHOLD_V28, ///< Set threshold to 2.8 V.
155 } nrf_regulators_pof_thr_t;
156 #endif
157 
158 #if NRF_REGULATORS_HAS_POF_VDDH
159 /** @brief POF Comparator thresholds for VDDH. */
160 typedef enum
161 {
162     NRF_REGULATORS_POF_THR_VDDH_2V7 = REGULATORS_POFCON_THRESHOLDVDDH_V27, ///< Set threshold to 2.7 V.
163     NRF_REGULATORS_POF_THR_VDDH_2V8 = REGULATORS_POFCON_THRESHOLDVDDH_V28, ///< Set threshold to 2.8 V.
164     NRF_REGULATORS_POF_THR_VDDH_2V9 = REGULATORS_POFCON_THRESHOLDVDDH_V29, ///< Set threshold to 2.9 V.
165     NRF_REGULATORS_POF_THR_VDDH_3V0 = REGULATORS_POFCON_THRESHOLDVDDH_V30, ///< Set threshold to 3.0 V.
166     NRF_REGULATORS_POF_THR_VDDH_3V1 = REGULATORS_POFCON_THRESHOLDVDDH_V31, ///< Set threshold to 3.1 V.
167     NRF_REGULATORS_POF_THR_VDDH_3V2 = REGULATORS_POFCON_THRESHOLDVDDH_V32, ///< Set threshold to 3.2 V.
168     NRF_REGULATORS_POF_THR_VDDH_3V3 = REGULATORS_POFCON_THRESHOLDVDDH_V33, ///< Set threshold to 3.3 V.
169     NRF_REGULATORS_POF_THR_VDDH_3V4 = REGULATORS_POFCON_THRESHOLDVDDH_V34, ///< Set threshold to 3.4 V.
170     NRF_REGULATORS_POF_THR_VDDH_3V5 = REGULATORS_POFCON_THRESHOLDVDDH_V35, ///< Set threshold to 3.5 V.
171     NRF_REGULATORS_POF_THR_VDDH_3V6 = REGULATORS_POFCON_THRESHOLDVDDH_V36, ///< Set threshold to 3.6 V.
172     NRF_REGULATORS_POF_THR_VDDH_3V7 = REGULATORS_POFCON_THRESHOLDVDDH_V37, ///< Set threshold to 3.7 V.
173     NRF_REGULATORS_POF_THR_VDDH_3V8 = REGULATORS_POFCON_THRESHOLDVDDH_V38, ///< Set threshold to 3.8 V.
174     NRF_REGULATORS_POF_THR_VDDH_3V9 = REGULATORS_POFCON_THRESHOLDVDDH_V39, ///< Set threshold to 3.9 V.
175     NRF_REGULATORS_POF_THR_VDDH_4V0 = REGULATORS_POFCON_THRESHOLDVDDH_V40, ///< Set threshold to 4.0 V.
176     NRF_REGULATORS_POF_THR_VDDH_4V1 = REGULATORS_POFCON_THRESHOLDVDDH_V41, ///< Set threshold to 4.1 V.
177     NRF_REGULATORS_POF_THR_VDDH_4V2 = REGULATORS_POFCON_THRESHOLDVDDH_V42, ///< Set threshold to 4.2 V.
178 } nrf_regulators_pof_thr_vddh_t;
179 #endif
180 
181 #if NRF_REGULATORS_HAS_TRIM
182 /** @brief Components allowed to introduce ELV mode. */
183 typedef enum
184 {
185     NRF_REGULATORS_ELV_MODE_ALLOW_MASK_EXT ///< Reserved. For internal use only.
186 } nrf_regulators_elv_mode_allow_mask_t;
187 #endif // NRF_REGULATORS_HAS_TRIM
188 
189 #if NRF_REGULATORS_HAS_POF
190 /** @brief POF Comparator configuration structure. */
191 typedef struct {
192     bool                          enable;       ///< Enable or disable POF Comparator.
193     nrf_regulators_pof_thr_t      thr;          ///< Threshold to be set for POF Comparator.
194 #if NRF_REGULATORS_HAS_POF_VDDH
195     nrf_regulators_pof_thr_vddh_t thr_vddh;     ///< Threshold to be set for POF Comparator for VDDH.
196 #endif
197 #if NRF_REGULATORS_HAS_POF_WARN_DISABLE
198     bool                          warn_disable; ///< Disable or enable POFWARN event.
199 #endif
200 } nrf_regulators_pof_config_t;
201 #endif
202 
203 #if NRF_REGULATORS_HAS_MAIN_STATUS
204 /** @brief Main supply status. */
205 typedef enum
206 {
207     NRF_REGULATORS_MAIN_STATUS_NORMAL = REGULATORS_MAINREGSTATUS_VREGH_Inactive, ///< Normal voltage mode. Voltage supplied on VDD and VDDH.
208     NRF_REGULATORS_MAIN_STATUS_HIGH   = REGULATORS_MAINREGSTATUS_VREGH_Active    ///< High voltage mode. Voltage supplied on VDDH.
209 } nrf_regulators_main_status_t;
210 #endif
211 
212 /**
213  * @brief Function for enabling or disabling the specified voltage regulator.
214  *
215  * @param[in] p_reg     Pointer to the structure of registers of the peripheral.
216  * @param[in] regulator Regulator to be enabled or disabled.
217  * @param[in] enable    True if specified voltage regulator is to be enabled, false otherwise.
218  */
219 NRF_STATIC_INLINE void nrf_regulators_vreg_enable_set(NRF_REGULATORS_Type * p_reg,
220                                                       nrf_regulators_vreg_t regulator,
221                                                       bool                  enable);
222 
223 /**
224  * @brief Function for checking whether the specified voltage regulator is enabled.
225  *
226  * @param[in] p_reg     Pointer to the structure of registers of the peripheral.
227  * @param[in] regulator Regulator to be checked.
228  *
229  * @retval true  Specified voltage regulator is enabled.
230  * @retval false Specified voltage regulator is disabled.
231  */
232 NRF_STATIC_INLINE bool nrf_regulators_vreg_enable_check(NRF_REGULATORS_Type const * p_reg,
233                                                        nrf_regulators_vreg_t        regulator);
234 
235 /**
236  * @brief Function for putting the CPU in System OFF mode.
237  *
238  * @note This function never returns.
239  *
240  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
241  */
242 NRF_STATIC_INLINE void nrf_regulators_system_off(NRF_REGULATORS_Type * p_reg);
243 
244 #if NRF_REGULATORS_HAS_MAIN_STATUS
245 /**
246  * @brief Function for getting the main supply status.
247  *
248  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
249  *
250  * @return The current main supply status.
251  */
252 NRF_STATIC_INLINE
253 nrf_regulators_main_status_t nrf_regulators_main_status_get(NRF_REGULATORS_Type const * p_reg);
254 #endif
255 
256 #if NRF_REGULATORS_HAS_POF
257 /**
258  * @brief Function for setting the POF Comparator configuration.
259  *
260  * @param[in] p_reg    Pointer to the structure of registers of the peripheral.
261  * @param[in] p_config Pointer to the structure containing POF Comparator configuration.
262  */
263 NRF_STATIC_INLINE void nrf_regulators_pof_config_set(NRF_REGULATORS_Type *               p_reg,
264                                                      nrf_regulators_pof_config_t const * p_config);
265 
266 /**
267  * @brief Function for getting the POF Comparator configuration.
268  *
269  * @param[in]  p_reg    Pointer to the structure of registers of the peripheral.
270  * @param[out] p_config Pointer to the structure to be filled with POF Comparator configuration.
271  */
272 NRF_STATIC_INLINE void nrf_regulators_pof_config_get(NRF_REGULATORS_Type const *   p_reg,
273                                                      nrf_regulators_pof_config_t * p_config);
274 #endif // NRF_REGULATORS_HAS_POF
275 
276 #if NRF_REGULATORS_HAS_POF_STATUS
277 /**
278  * @brief Function for checking if the detected voltage is below or above the threshold of VPOF (POF Comparator's threshold voltage).
279  *
280  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
281  *
282  * @retval true  Voltage below VPOF threshold has been detected.
283  * @retval false Voltage above VPOF threshold has been detected.
284  */
285 NRF_STATIC_INLINE bool nrf_regulators_pof_below_thr_check(NRF_REGULATORS_Type const * p_reg);
286 #endif
287 
288 #if NRF_REGULATORS_HAS_TRIM
289 /**
290  * @brief Function for setting components that are allowed to introduce the ELV mode.
291  *
292  * @warning This register is retained when retention is enabled.
293  *
294  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
295  * @param[in] mask  Mask of components to be set, created using @ref nrf_regulators_elv_mode_allow_mask_t.
296  */
297 NRF_STATIC_INLINE void nrf_regulators_elv_mode_allow_set(NRF_REGULATORS_Type * p_reg,
298                                                          uint32_t              mask);
299 
300 /**
301  * @brief Function for geting components that are allowed to introduce the ELV mode.
302  *
303  * @warning This register is retained when retention is enabled.
304  *
305  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
306  *
307  * @return Mask of components allowed to introduce ELV mode,
308  *         created using @ref nrf_regulators_elv_mode_allow_mask_t.
309  */
310 NRF_STATIC_INLINE uint32_t nrf_regulators_elv_mode_allow_get(NRF_REGULATORS_Type const * p_reg);
311 #endif // NRF_REGULATORS_HAS_TRIM
312 
313 #if NRF_REGULATORS_HAS_INDUCTOR_DET
314 /**
315  * @brief Function for checking whether an inductor is connected to the DCC pin.
316  *
317  * @note The detection can only take place if the VREG_MAIN DC/DC converter is not enabled.
318  *
319  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
320  *
321  * @retval true  Inductor detected.
322  * @retval false Inductor not detected.
323  */
324 NRF_STATIC_INLINE bool nrf_regulators_inductor_check(NRF_REGULATORS_Type const * p_reg);
325 #endif
326 
327 #ifndef NRF_DECLARE_ONLY
328 
nrf_regulators_vreg_enable_set(NRF_REGULATORS_Type * p_reg,nrf_regulators_vreg_t regulator,bool enable)329 NRF_STATIC_INLINE void nrf_regulators_vreg_enable_set(NRF_REGULATORS_Type * p_reg,
330                                                       nrf_regulators_vreg_t regulator,
331                                                       bool                  enable)
332 {
333     switch (regulator)
334     {
335         case NRF_REGULATORS_VREG_MAIN:
336 #if defined(REGULATORS_DCDCEN_DCDCEN_Msk)
337             p_reg->DCDCEN = (enable ? REGULATORS_DCDCEN_DCDCEN_Enabled :
338                              REGULATORS_DCDCEN_DCDCEN_Disabled) << REGULATORS_DCDCEN_DCDCEN_Pos;
339 #elif defined(REGULATORS_VREGMAIN_DCDCEN_VAL_Msk)
340             p_reg->VREGMAIN.DCDCEN = (enable ? REGULATORS_VREGMAIN_DCDCEN_VAL_Enabled :
341                                       REGULATORS_VREGMAIN_DCDCEN_VAL_Disabled)
342                                      << REGULATORS_VREGMAIN_DCDCEN_VAL_Pos;
343 #else
344             p_reg->VREGMAIN.DCDCEN = (enable ? REGULATORS_VREGMAIN_DCDCEN_DCDCEN_Enabled :
345                                       REGULATORS_VREGMAIN_DCDCEN_DCDCEN_Disabled)
346                                      << REGULATORS_VREGMAIN_DCDCEN_DCDCEN_Pos;
347 #endif
348             break;
349 
350 #if NRF_REGULATORS_HAS_VREG_HIGH
351         case NRF_REGULATORS_VREG_HIGH:
352             p_reg->VREGH.DCDCEN = (enable ? REGULATORS_VREGH_DCDCEN_DCDCEN_Enabled :
353                                    REGULATORS_VREGH_DCDCEN_DCDCEN_Disabled)
354                                   << REGULATORS_VREGH_DCDCEN_DCDCEN_Pos;
355             break;
356 #endif
357 
358 #if NRF_REGULATORS_HAS_VREG_MEDIUM
359         case NRF_REGULATORS_VREG_MEDIUM:
360             p_reg->VREGM.ENABLE = (enable ? REGULATORS_VREGM_ENABLE_ENABLE_Enabled :
361                                    REGULATORS_VREGM_ENABLE_ENABLE_Disabled)
362                                   << REGULATORS_VREGM_ENABLE_ENABLE_Pos;
363             break;
364 #endif
365 
366 #if NRF_REGULATORS_HAS_VREG_RADIO
367         case NRF_REGULATORS_VREG_RADIO:
368             p_reg->VREGRADIO.DCDCEN = (enable ? REGULATORS_VREGRADIO_DCDCEN_DCDCEN_Enabled :
369                                        REGULATORS_VREGRADIO_DCDCEN_DCDCEN_Disabled)
370                                       << REGULATORS_VREGRADIO_DCDCEN_DCDCEN_Pos;
371             break;
372 #endif
373 
374         default:
375             NRFX_ASSERT(false);
376             break;
377     }
378 }
379 
nrf_regulators_vreg_enable_check(NRF_REGULATORS_Type const * p_reg,nrf_regulators_vreg_t regulator)380 NRF_STATIC_INLINE bool nrf_regulators_vreg_enable_check(NRF_REGULATORS_Type const * p_reg,
381                                                         nrf_regulators_vreg_t       regulator)
382 {
383     switch (regulator)
384     {
385         case NRF_REGULATORS_VREG_MAIN:
386 #if defined(REGULATORS_DCDCEN_DCDCEN_Msk)
387             return (p_reg->DCDCEN >> REGULATORS_DCDCEN_DCDCEN_Pos) ==
388                    REGULATORS_DCDCEN_DCDCEN_Enabled;
389 #elif defined(REGULATORS_VREGMAIN_DCDCEN_VAL_Msk)
390             return (p_reg->VREGMAIN.DCDCEN >> REGULATORS_VREGMAIN_DCDCEN_VAL_Pos) ==
391                    REGULATORS_VREGMAIN_DCDCEN_VAL_Enabled;
392 #else
393             return (p_reg->VREGMAIN.DCDCEN >> REGULATORS_VREGMAIN_DCDCEN_DCDCEN_Pos) ==
394                     REGULATORS_VREGMAIN_DCDCEN_DCDCEN_Enabled;
395 #endif
396 
397 #if NRF_REGULATORS_HAS_VREG_HIGH
398         case NRF_REGULATORS_VREG_HIGH:
399             return (p_reg->VREGH.DCDCEN >> REGULATORS_VREGH_DCDCEN_DCDCEN_Pos) ==
400                    REGULATORS_VREGH_DCDCEN_DCDCEN_Enabled;
401 #endif
402 
403 #if NRF_REGULATORS_HAS_VREG_MEDIUM
404         case NRF_REGULATORS_VREG_MEDIUM:
405             return (p_reg->VREGM.ENABLE >> REGULATORS_VREGM_ENABLE_ENABLE_Pos) ==
406                    REGULATORS_VREGM_ENABLE_ENABLE_Enabled;
407 #endif
408 
409 #if NRF_REGULATORS_HAS_VREG_RADIO
410         case NRF_REGULATORS_VREG_RADIO:
411             return (p_reg->VREGRADIO.DCDCEN >> REGULATORS_VREGRADIO_DCDCEN_DCDCEN_Pos) ==
412                    REGULATORS_VREGRADIO_DCDCEN_DCDCEN_Enabled;
413 #endif
414 
415         default:
416             NRFX_ASSERT(false);
417             return false;
418     }
419 }
420 
nrf_regulators_system_off(NRF_REGULATORS_Type * p_reg)421 NRF_STATIC_INLINE void nrf_regulators_system_off(NRF_REGULATORS_Type * p_reg)
422 {
423     p_reg->SYSTEMOFF = REGULATORS_SYSTEMOFF_SYSTEMOFF_Msk;
424     __DSB();
425 
426     /* Solution for simulated System OFF in debug mode */
427     while (true)
428     {
429         __WFE();
430     }
431 }
432 
433 #if NRF_REGULATORS_HAS_MAIN_STATUS
434 NRF_STATIC_INLINE
nrf_regulators_main_status_get(NRF_REGULATORS_Type const * p_reg)435 nrf_regulators_main_status_t nrf_regulators_main_status_get(NRF_REGULATORS_Type const * p_reg)
436 {
437     return (nrf_regulators_main_status_t)p_reg->MAINREGSTATUS;
438 }
439 #endif
440 
441 #if NRF_REGULATORS_HAS_POF
nrf_regulators_pof_config_set(NRF_REGULATORS_Type * p_reg,nrf_regulators_pof_config_t const * p_config)442 NRF_STATIC_INLINE void nrf_regulators_pof_config_set(NRF_REGULATORS_Type *               p_reg,
443                                                      nrf_regulators_pof_config_t const * p_config)
444 {
445     NRFX_ASSERT(p_config);
446 
447     p_reg->POFCON = ((p_config->enable ? REGULATORS_POFCON_POF_Enabled :
448                       REGULATORS_POFCON_POF_Disabled) << REGULATORS_POFCON_POF_Pos) |
449                     (((uint32_t)p_config->thr) << REGULATORS_POFCON_THRESHOLD_Pos) |
450 #if NRF_REGULATORS_HAS_POF_VDDH
451                     (((uint32_t)p_config->thr_vddh) << REGULATORS_POFCON_THRESHOLDVDDH_Pos) |
452 #endif
453 #if NRF_REGULATORS_HAS_POF_WARN_DISABLE
454                     ((p_config->warn_disable ? REGULATORS_POFCON_EVENTDISABLE_Disabled :
455                       REGULATORS_POFCON_EVENTDISABLE_Enabled)
456                      << REGULATORS_POFCON_EVENTDISABLE_Pos) |
457 #endif
458                     0;
459 }
460 
nrf_regulators_pof_config_get(NRF_REGULATORS_Type const * p_reg,nrf_regulators_pof_config_t * p_config)461 NRF_STATIC_INLINE void nrf_regulators_pof_config_get(NRF_REGULATORS_Type const *   p_reg,
462                                                      nrf_regulators_pof_config_t * p_config)
463 {
464     NRFX_ASSERT(p_config);
465 
466     p_config->enable = ((p_reg->POFCON & REGULATORS_POFCON_POF_Msk) >> REGULATORS_POFCON_POF_Pos)
467                         == REGULATORS_POFCON_POF_Enabled;
468 
469     p_config->thr = (nrf_regulators_pof_thr_t)((p_reg->POFCON & REGULATORS_POFCON_THRESHOLD_Msk)
470                                                >> REGULATORS_POFCON_THRESHOLD_Pos);
471 
472 
473 #if NRF_REGULATORS_HAS_POF_VDDH
474     p_config->thr_vddh = (nrf_regulators_pof_thr_vddh_t)((p_reg->POFCON &
475                                                           REGULATORS_POFCON_THRESHOLDVDDH_Msk)
476                                                          >> REGULATORS_POFCON_THRESHOLDVDDH_Pos);
477 #endif
478 
479 #if NRF_REGULATORS_HAS_POF_WARN_DISABLE
480     p_config->warn_disable = ((p_reg->POFCON & REGULATORS_POFCON_EVENTDISABLE_Msk)
481                               >> REGULATORS_POFCON_EVENTDISABLE_Pos)
482                              == REGULATORS_POFCON_EVENTDISABLE_Disabled;
483 #endif
484 }
485 #endif // NRF_REGULATORS_HAS_POF
486 
487 #if NRF_REGULATORS_HAS_POF_STATUS
nrf_regulators_pof_below_thr_check(NRF_REGULATORS_Type const * p_reg)488 NRF_STATIC_INLINE bool nrf_regulators_pof_below_thr_check(NRF_REGULATORS_Type const * p_reg)
489 {
490     return (p_reg->POFSTAT & REGULATORS_POFSTAT_COMPARATOR_Msk) >> REGULATORS_POFSTAT_COMPARATOR_Pos
491            == REGULATORS_POFSTAT_COMPARATOR_Below;
492 }
493 #endif
494 
495 #if NRF_REGULATORS_HAS_TRIM
nrf_regulators_elv_mode_allow_set(NRF_REGULATORS_Type * p_reg,uint32_t mask)496 NRF_STATIC_INLINE void nrf_regulators_elv_mode_allow_set(NRF_REGULATORS_Type * p_reg,
497                                                          uint32_t              mask)
498 {
499     p_reg->TRIM = ((p_reg->TRIM & ~NRF_REGULATORS_ELV_MODE_ALL_MASK) |
500                    (~mask & NRF_REGULATORS_ELV_MODE_ALL_MASK));
501 }
502 
nrf_regulators_elv_mode_allow_get(NRF_REGULATORS_Type const * p_reg)503 NRF_STATIC_INLINE uint32_t nrf_regulators_elv_mode_allow_get(NRF_REGULATORS_Type const * p_reg)
504 {
505     return ~(p_reg->TRIM & NRF_REGULATORS_ELV_MODE_ALL_MASK);
506 }
507 #endif // NRF_REGULATORS_HAS_TRIM
508 
509 #if NRF_REGULATORS_HAS_INDUCTOR_DET
nrf_regulators_inductor_check(NRF_REGULATORS_Type const * p_reg)510 NRF_STATIC_INLINE bool nrf_regulators_inductor_check(NRF_REGULATORS_Type const * p_reg)
511 {
512     return (p_reg->VREGMAIN.INDUCTORDET & REGULATORS_VREGMAIN_INDUCTORDET_DETECTED_Msk)
513            >> REGULATORS_VREGMAIN_INDUCTORDET_DETECTED_Pos
514            == REGULATORS_VREGMAIN_INDUCTORDET_DETECTED_InductorDetected;
515 }
516 #endif
517 
518 #endif // NRF_DECLARE_ONLY
519 
520 /** @} */
521 
522 #ifdef __cplusplus
523 }
524 #endif
525 
526 #endif // NRF_REGULATORS_H__
527