1 /******************************************************************************
2  *
3  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4  * Analog Devices, Inc.),
5  * Copyright (C) 2023-2024 Analog Devices, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************************/
20 
21 #include "mxc_device.h"
22 #include "mxc_assert.h"
23 #include "mxc_sys.h"
24 #include "gcr_regs.h"
25 #include "lp.h"
26 
MXC_LP_EnterSleepMode(void)27 void MXC_LP_EnterSleepMode(void)
28 {
29     MXC_LP_ClearWakeStatus();
30 
31 #ifndef __riscv
32     // Clear SLEEPDEEP bit
33     SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
34 #endif
35 
36     // Go into Sleep mode and wait for an interrupt to wake the processor
37     __WFI();
38 }
39 
MXC_LP_EnterDeepSleepMode(void)40 void MXC_LP_EnterDeepSleepMode(void)
41 {
42     MXC_LP_ClearWakeStatus();
43 
44     // Set SLEEPDEEP bit
45     MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
46     MXC_GCR->pm |= MXC_S_GCR_PM_MODE_DEEPSLEEP;
47 
48 #ifndef __riscv
49     SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
50 #endif
51 
52     // Go into Deepsleep mode and wait for an interrupt to wake the processor
53     __WFI();
54 }
55 
MXC_LP_EnterBackupMode(void)56 void MXC_LP_EnterBackupMode(void)
57 {
58     MXC_LP_ClearWakeStatus();
59 
60     MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
61     MXC_GCR->pm |= MXC_S_GCR_PM_MODE_BACKUP;
62 
63     while (1) {}
64     // Should never reach this line - device will jump to backup vector on exit from background mode.
65 }
66 
MXC_LP_EnterShutDownMode(void)67 void MXC_LP_EnterShutDownMode(void)
68 {
69     // TODO(SDK Team): Check this function once SBT is added for MAX32572.
70 
71     // MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
72     // MXC_GCR->pm |= MXC_S_GCR_PM_MODE_SHUTDOWN;
73 
74     // while (1) {}
75     // // Should never reach this line - device will reset on exit from shutdown mode.
76 
77     return;
78 }
79 
MXC_LP_SetOVR(mxc_lp_ovr_t ovr)80 void MXC_LP_SetOVR(mxc_lp_ovr_t ovr)
81 {
82     //not supported yet
83 }
84 
MXC_LP_RetentionRegEnable(void)85 void MXC_LP_RetentionRegEnable(void)
86 {
87     MXC_PWRSEQ->lpctrl |= MXC_F_PWRSEQ_LPCTRL_RETREG_EN;
88 }
89 
MXC_LP_RetentionRegDisable(void)90 void MXC_LP_RetentionRegDisable(void)
91 {
92     MXC_PWRSEQ->lpctrl &= ~MXC_F_PWRSEQ_LPCTRL_RETREG_EN;
93 }
94 
MXC_LP_RetentionRegIsEnabled(void)95 int MXC_LP_RetentionRegIsEnabled(void)
96 {
97     return (MXC_PWRSEQ->lpctrl & MXC_F_PWRSEQ_LPCTRL_RETREG_EN);
98 }
99 
MXC_LP_BandgapOn(void)100 void MXC_LP_BandgapOn(void)
101 {
102     MXC_PWRSEQ->lpctrl &= ~MXC_F_PWRSEQ_LPCTRL_BGOFF;
103 }
104 
MXC_LP_BandgapOff(void)105 void MXC_LP_BandgapOff(void)
106 {
107     MXC_PWRSEQ->lpctrl |= MXC_F_PWRSEQ_LPCTRL_BGOFF;
108 }
109 
MXC_LP_BandgapIsOn(void)110 int MXC_LP_BandgapIsOn(void)
111 {
112     return (MXC_PWRSEQ->lpctrl & MXC_F_PWRSEQ_LPCTRL_BGOFF);
113 }
114 
MXC_LP_PORVCOREoreMonitorEnable(void)115 void MXC_LP_PORVCOREoreMonitorEnable(void)
116 {
117     MXC_PWRSEQ->lpctrl &= ~MXC_F_PWRSEQ_LPCTRL_VCOREPOR_DIS;
118 }
119 
MXC_LP_PORVCOREoreMonitorDisable(void)120 void MXC_LP_PORVCOREoreMonitorDisable(void)
121 {
122     MXC_PWRSEQ->lpctrl |= MXC_F_PWRSEQ_LPCTRL_VCOREPOR_DIS;
123 }
124 
MXC_LP_PORVCOREoreMonitorIsEnabled(void)125 int MXC_LP_PORVCOREoreMonitorIsEnabled(void)
126 {
127     return (MXC_PWRSEQ->lpctrl & MXC_F_PWRSEQ_LPCTRL_VCOREPOR_DIS);
128 }
129 
MXC_LP_FastWakeupEnable(void)130 void MXC_LP_FastWakeupEnable(void)
131 {
132     MXC_PWRSEQ->lpctrl |= MXC_F_PWRSEQ_LPCTRL_FASTWK_EN;
133 }
134 
MXC_LP_FastWakeupDisable(void)135 void MXC_LP_FastWakeupDisable(void)
136 {
137     MXC_PWRSEQ->lpctrl &= ~MXC_F_PWRSEQ_LPCTRL_FASTWK_EN;
138 }
139 
MXC_LP_FastWakeupIsEnabled(void)140 int MXC_LP_FastWakeupIsEnabled(void)
141 {
142     return (MXC_PWRSEQ->lpctrl & MXC_F_PWRSEQ_LPCTRL_FASTWK_EN);
143 }
144 
MXC_LP_ClearWakeStatus(void)145 void MXC_LP_ClearWakeStatus(void)
146 {
147     // Write 1 to clear
148     MXC_PWRSEQ->lppwkfl = 0xFFFFFFFF;
149 }
150 
MXC_LP_EnableGPIOWakeup(mxc_gpio_cfg_t * wu_pins)151 void MXC_LP_EnableGPIOWakeup(mxc_gpio_cfg_t *wu_pins)
152 {
153     MXC_GCR->pm |= MXC_F_GCR_PM_GPIO_WE;
154 
155     switch (1 << MXC_GPIO_GET_IDX(wu_pins->port)) {
156     case MXC_GPIO_PORT_0:
157         MXC_PWRSEQ->lpwken0 |= wu_pins->mask;
158         break;
159 
160     case MXC_GPIO_PORT_1:
161         MXC_PWRSEQ->lpwken1 |= wu_pins->mask;
162         break;
163     case MXC_GPIO_PORT_2:
164         MXC_PWRSEQ->lpwken2 |= wu_pins->mask;
165         break;
166     case MXC_GPIO_PORT_3:
167         MXC_PWRSEQ->lpwken3 |= wu_pins->mask;
168         break;
169     }
170 }
171 
MXC_LP_DisableGPIOWakeup(mxc_gpio_cfg_t * wu_pins)172 void MXC_LP_DisableGPIOWakeup(mxc_gpio_cfg_t *wu_pins)
173 {
174     switch (1 << MXC_GPIO_GET_IDX(wu_pins->port)) {
175     case MXC_GPIO_PORT_0:
176         MXC_PWRSEQ->lpwken0 &= ~wu_pins->mask;
177         break;
178 
179     case MXC_GPIO_PORT_1:
180         MXC_PWRSEQ->lpwken1 &= ~wu_pins->mask;
181         break;
182     case MXC_GPIO_PORT_2:
183         MXC_PWRSEQ->lpwken2 &= ~wu_pins->mask;
184         break;
185     case MXC_GPIO_PORT_3:
186         MXC_PWRSEQ->lpwken3 &= ~wu_pins->mask;
187         break;
188     }
189 
190     if (MXC_PWRSEQ->lpwken3 == 0 && MXC_PWRSEQ->lpwken2 == 0 && MXC_PWRSEQ->lpwken1 == 0 &&
191         MXC_PWRSEQ->lpwken0 == 0) {
192         MXC_GCR->pm &= ~MXC_F_GCR_PM_GPIO_WE;
193     }
194 }
195 
MXC_LP_EnableRTCAlarmWakeup(void)196 void MXC_LP_EnableRTCAlarmWakeup(void)
197 {
198     MXC_GCR->pm |= MXC_F_GCR_PM_RTC_WE;
199 }
200 
MXC_LP_DisableRTCAlarmWakeup(void)201 void MXC_LP_DisableRTCAlarmWakeup(void)
202 {
203     MXC_GCR->pm &= ~MXC_F_GCR_PM_RTC_WE;
204 }
205 
MXC_LP_EnableUSBWakeup(void)206 void MXC_LP_EnableUSBWakeup(void)
207 {
208     MXC_GCR->pm |= MXC_F_GCR_PM_USB_WE;
209 }
210 
MXC_LP_DisableUSBWakeup(void)211 void MXC_LP_DisableUSBWakeup(void)
212 {
213     MXC_GCR->pm &= ~MXC_F_GCR_PM_USB_WE;
214 }
215 
MXC_LP_ConfigDeepSleepClocks(uint32_t mask)216 int MXC_LP_ConfigDeepSleepClocks(uint32_t mask)
217 {
218     if (!(mask & (MXC_F_GCR_PM_IBRO_PD | MXC_F_GCR_PM_IPO_PD | MXC_F_GCR_PM_ISO_PD |
219                   MXC_F_GCR_PM_ERFO_PD))) {
220         return E_BAD_PARAM;
221     }
222 
223     MXC_GCR->pm |= mask;
224     return E_NO_ERROR;
225 }
226 
MXC_LP_NFCOscBypassEnable(void)227 void MXC_LP_NFCOscBypassEnable(void)
228 {
229     MXC_GCR->pm |= MXC_F_GCR_PM_ERFO_BP;
230 }
231 
MXC_LP_NFCOscBypassDisable(void)232 void MXC_LP_NFCOscBypassDisable(void)
233 {
234     MXC_GCR->pm &= ~MXC_F_GCR_PM_ERFO_BP;
235 }
236 
MXC_LP_NFCOscBypassIsEnabled(void)237 int MXC_LP_NFCOscBypassIsEnabled(void)
238 {
239     return (MXC_GCR->pm & MXC_F_GCR_PM_ERFO_BP);
240 }
241 
MXC_LP_SysRam0LightSleepEnable(void)242 void MXC_LP_SysRam0LightSleepEnable(void)
243 {
244     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM0LS_EN;
245 }
246 
MXC_LP_SysRam1LightSleepEnable(void)247 void MXC_LP_SysRam1LightSleepEnable(void)
248 {
249     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM1LS_EN;
250 }
251 
MXC_LP_SysRam2LightSleepEnable(void)252 void MXC_LP_SysRam2LightSleepEnable(void)
253 {
254     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM2LS_EN;
255 }
256 
MXC_LP_SysRam3LightSleepEnable(void)257 void MXC_LP_SysRam3LightSleepEnable(void)
258 {
259     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM3LS_EN;
260 }
261 
MXC_LP_SysRam4LightSleepEnable(void)262 void MXC_LP_SysRam4LightSleepEnable(void)
263 {
264     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM4LS_EN;
265 }
266 
MXC_LP_SysRam5LightSleepEnable(void)267 void MXC_LP_SysRam5LightSleepEnable(void)
268 {
269     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM5LS_EN;
270 }
271 
MXC_LP_SysRam6LightSleepEnable(void)272 void MXC_LP_SysRam6LightSleepEnable(void)
273 {
274     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM6LS_EN;
275 }
276 
MXC_LP_ICacheXIPLightSleepEnable(void)277 void MXC_LP_ICacheXIPLightSleepEnable(void)
278 {
279     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_ICCXIPLS_EN;
280 }
281 
MXC_LP_CryptoLightSleepEnable(void)282 void MXC_LP_CryptoLightSleepEnable(void)
283 {
284     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_CRYPTOLS_EN;
285 }
286 
MXC_LP_USBFIFOLightSleepEnable(void)287 void MXC_LP_USBFIFOLightSleepEnable(void)
288 {
289     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_USBLS_EN;
290 }
291 
MXC_LP_ROM0LightSleepEnable(void)292 void MXC_LP_ROM0LightSleepEnable(void)
293 {
294     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_ROM0LS_EN;
295 }
296 
MXC_LP_ROM1LightSleepEnable(void)297 void MXC_LP_ROM1LightSleepEnable(void)
298 {
299     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_ROM1LS_EN;
300 }
301 
MXC_LP_MAALightSleepEnable(void)302 void MXC_LP_MAALightSleepEnable(void)
303 {
304     MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_MAALS_EN;
305 }
306 
MXC_LP_SysRam0LightSleepDisable(void)307 void MXC_LP_SysRam0LightSleepDisable(void)
308 {
309     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM0LS_EN;
310 }
311 
MXC_LP_SysRam1LightSleepDisable(void)312 void MXC_LP_SysRam1LightSleepDisable(void)
313 {
314     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM1LS_EN;
315 }
316 
MXC_LP_SysRam2LightSleepDisable(void)317 void MXC_LP_SysRam2LightSleepDisable(void)
318 {
319     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM2LS_EN;
320 }
321 
MXC_LP_SysRam3LightSleepDisable(void)322 void MXC_LP_SysRam3LightSleepDisable(void)
323 {
324     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM3LS_EN;
325 }
326 
MXC_LP_SysRam4LightSleepDisable(void)327 void MXC_LP_SysRam4LightSleepDisable(void)
328 {
329     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM4LS_EN;
330 }
331 
MXC_LP_SysRam5LightSleepDisable(void)332 void MXC_LP_SysRam5LightSleepDisable(void)
333 {
334     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM5LS_EN;
335 }
336 
MXC_LP_SysRam6LightSleepDisable(void)337 void MXC_LP_SysRam6LightSleepDisable(void)
338 {
339     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM6LS_EN;
340 }
341 
MXC_LP_ICacheXIPLightSleepDisable(void)342 void MXC_LP_ICacheXIPLightSleepDisable(void)
343 {
344     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_ICCXIPLS_EN;
345 }
346 
MXC_LP_CryptoLightSleepDisable(void)347 void MXC_LP_CryptoLightSleepDisable(void)
348 {
349     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_CRYPTOLS_EN;
350 }
351 
MXC_LP_USBFIFOLightSleepDisable(void)352 void MXC_LP_USBFIFOLightSleepDisable(void)
353 {
354     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_USBLS_EN;
355 }
356 
MXC_LP_ROM0LightSleepDisable(void)357 void MXC_LP_ROM0LightSleepDisable(void)
358 {
359     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_ROM0LS_EN;
360 }
361 
MXC_LP_ROM1LightSleepDisable(void)362 void MXC_LP_ROM1LightSleepDisable(void)
363 {
364     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_ROM1LS_EN;
365 }
366 
MXC_LP_MAALightSleepDisable(void)367 void MXC_LP_MAALightSleepDisable(void)
368 {
369     MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_MAALS_EN;
370 }
371 
MXC_LP_SysRam0Shutdown(void)372 void MXC_LP_SysRam0Shutdown(void)
373 {
374     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM0;
375 }
376 
MXC_LP_SysRam0PowerUp(void)377 void MXC_LP_SysRam0PowerUp(void)
378 {
379     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM0;
380 }
381 
MXC_LP_SysRam1Shutdown(void)382 void MXC_LP_SysRam1Shutdown(void)
383 {
384     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM1;
385 }
386 
MXC_LP_SysRam1PowerUp(void)387 void MXC_LP_SysRam1PowerUp(void)
388 {
389     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM1;
390 }
391 
MXC_LP_SysRam2Shutdown(void)392 void MXC_LP_SysRam2Shutdown(void)
393 {
394     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM2;
395 }
396 
MXC_LP_SysRam2PowerUp(void)397 void MXC_LP_SysRam2PowerUp(void)
398 {
399     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM2;
400 }
401 
MXC_LP_SysRam3Shutdown(void)402 void MXC_LP_SysRam3Shutdown(void)
403 {
404     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM3;
405 }
406 
MXC_LP_SysRam3PowerUp(void)407 void MXC_LP_SysRam3PowerUp(void)
408 {
409     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM3;
410 }
411 
MXC_LP_SysRam4Shutdown(void)412 void MXC_LP_SysRam4Shutdown(void)
413 {
414     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM4;
415 }
416 
MXC_LP_SysRam4PowerUp(void)417 void MXC_LP_SysRam4PowerUp(void)
418 {
419     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM4;
420 }
421 
MXC_LP_SysRam5Shutdown(void)422 void MXC_LP_SysRam5Shutdown(void)
423 {
424     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM5;
425 }
426 
MXC_LP_SysRam5PowerUp(void)427 void MXC_LP_SysRam5PowerUp(void)
428 {
429     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM5;
430 }
431 
MXC_LP_SysRam6Shutdown(void)432 void MXC_LP_SysRam6Shutdown(void)
433 {
434     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM6;
435 }
436 
MXC_LP_SysRam6PowerUp(void)437 void MXC_LP_SysRam6PowerUp(void)
438 {
439     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM6;
440 }
441 
MXC_LP_ICacheXIPShutdown(void)442 void MXC_LP_ICacheXIPShutdown(void)
443 {
444     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_ICCXIP;
445 }
446 
MXC_LP_ICacheXIPPowerUp(void)447 void MXC_LP_ICacheXIPPowerUp(void)
448 {
449     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_ICCXIP;
450 }
451 
MXC_LP_CryptoShutdown(void)452 void MXC_LP_CryptoShutdown(void)
453 {
454     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_CRYPTO;
455 }
456 
MXC_LP_CryptoPowerUp(void)457 void MXC_LP_CryptoPowerUp(void)
458 {
459     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_CRYPTO;
460 }
461 
MXC_LP_USBFIFOShutdown(void)462 void MXC_LP_USBFIFOShutdown(void)
463 {
464     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_USBFIFO;
465 }
466 
MXC_LP_USBFIFOPowerUp(void)467 void MXC_LP_USBFIFOPowerUp(void)
468 {
469     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_USBFIFO;
470 }
471 
MXC_LP_ROM0Shutdown(void)472 void MXC_LP_ROM0Shutdown(void)
473 {
474     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_ROM0;
475 }
476 
MXC_LP_ROM0PowerUp(void)477 void MXC_LP_ROM0PowerUp(void)
478 {
479     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_ROM0;
480 }
481 
MXC_LP_ROM1Shutdown(void)482 void MXC_LP_ROM1Shutdown(void)
483 {
484     MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_ROM1;
485 }
486 
MXC_LP_ROM1PowerUp(void)487 void MXC_LP_ROM1PowerUp(void)
488 {
489     MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_ROM1;
490 }
491