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)27void 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)40void 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)56void 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)67void 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)80void MXC_LP_SetOVR(mxc_lp_ovr_t ovr) 81 { 82 //not supported yet 83 } 84 MXC_LP_RetentionRegEnable(void)85void MXC_LP_RetentionRegEnable(void) 86 { 87 MXC_PWRSEQ->lpctrl |= MXC_F_PWRSEQ_LPCTRL_RETREG_EN; 88 } 89 MXC_LP_RetentionRegDisable(void)90void MXC_LP_RetentionRegDisable(void) 91 { 92 MXC_PWRSEQ->lpctrl &= ~MXC_F_PWRSEQ_LPCTRL_RETREG_EN; 93 } 94 MXC_LP_RetentionRegIsEnabled(void)95int MXC_LP_RetentionRegIsEnabled(void) 96 { 97 return (MXC_PWRSEQ->lpctrl & MXC_F_PWRSEQ_LPCTRL_RETREG_EN); 98 } 99 MXC_LP_BandgapOn(void)100void MXC_LP_BandgapOn(void) 101 { 102 MXC_PWRSEQ->lpctrl &= ~MXC_F_PWRSEQ_LPCTRL_BGOFF; 103 } 104 MXC_LP_BandgapOff(void)105void MXC_LP_BandgapOff(void) 106 { 107 MXC_PWRSEQ->lpctrl |= MXC_F_PWRSEQ_LPCTRL_BGOFF; 108 } 109 MXC_LP_BandgapIsOn(void)110int MXC_LP_BandgapIsOn(void) 111 { 112 return (MXC_PWRSEQ->lpctrl & MXC_F_PWRSEQ_LPCTRL_BGOFF); 113 } 114 MXC_LP_PORVCOREoreMonitorEnable(void)115void MXC_LP_PORVCOREoreMonitorEnable(void) 116 { 117 MXC_PWRSEQ->lpctrl &= ~MXC_F_PWRSEQ_LPCTRL_VCOREPOR_DIS; 118 } 119 MXC_LP_PORVCOREoreMonitorDisable(void)120void MXC_LP_PORVCOREoreMonitorDisable(void) 121 { 122 MXC_PWRSEQ->lpctrl |= MXC_F_PWRSEQ_LPCTRL_VCOREPOR_DIS; 123 } 124 MXC_LP_PORVCOREoreMonitorIsEnabled(void)125int MXC_LP_PORVCOREoreMonitorIsEnabled(void) 126 { 127 return (MXC_PWRSEQ->lpctrl & MXC_F_PWRSEQ_LPCTRL_VCOREPOR_DIS); 128 } 129 MXC_LP_FastWakeupEnable(void)130void MXC_LP_FastWakeupEnable(void) 131 { 132 MXC_PWRSEQ->lpctrl |= MXC_F_PWRSEQ_LPCTRL_FASTWK_EN; 133 } 134 MXC_LP_FastWakeupDisable(void)135void MXC_LP_FastWakeupDisable(void) 136 { 137 MXC_PWRSEQ->lpctrl &= ~MXC_F_PWRSEQ_LPCTRL_FASTWK_EN; 138 } 139 MXC_LP_FastWakeupIsEnabled(void)140int MXC_LP_FastWakeupIsEnabled(void) 141 { 142 return (MXC_PWRSEQ->lpctrl & MXC_F_PWRSEQ_LPCTRL_FASTWK_EN); 143 } 144 MXC_LP_ClearWakeStatus(void)145void 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)151void 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)172void 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)196void MXC_LP_EnableRTCAlarmWakeup(void) 197 { 198 MXC_GCR->pm |= MXC_F_GCR_PM_RTC_WE; 199 } 200 MXC_LP_DisableRTCAlarmWakeup(void)201void MXC_LP_DisableRTCAlarmWakeup(void) 202 { 203 MXC_GCR->pm &= ~MXC_F_GCR_PM_RTC_WE; 204 } 205 MXC_LP_EnableUSBWakeup(void)206void MXC_LP_EnableUSBWakeup(void) 207 { 208 MXC_GCR->pm |= MXC_F_GCR_PM_USB_WE; 209 } 210 MXC_LP_DisableUSBWakeup(void)211void MXC_LP_DisableUSBWakeup(void) 212 { 213 MXC_GCR->pm &= ~MXC_F_GCR_PM_USB_WE; 214 } 215 MXC_LP_ConfigDeepSleepClocks(uint32_t mask)216int 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)227void MXC_LP_NFCOscBypassEnable(void) 228 { 229 MXC_GCR->pm |= MXC_F_GCR_PM_ERFO_BP; 230 } 231 MXC_LP_NFCOscBypassDisable(void)232void MXC_LP_NFCOscBypassDisable(void) 233 { 234 MXC_GCR->pm &= ~MXC_F_GCR_PM_ERFO_BP; 235 } 236 MXC_LP_NFCOscBypassIsEnabled(void)237int MXC_LP_NFCOscBypassIsEnabled(void) 238 { 239 return (MXC_GCR->pm & MXC_F_GCR_PM_ERFO_BP); 240 } 241 MXC_LP_SysRam0LightSleepEnable(void)242void MXC_LP_SysRam0LightSleepEnable(void) 243 { 244 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM0LS_EN; 245 } 246 MXC_LP_SysRam1LightSleepEnable(void)247void MXC_LP_SysRam1LightSleepEnable(void) 248 { 249 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM1LS_EN; 250 } 251 MXC_LP_SysRam2LightSleepEnable(void)252void MXC_LP_SysRam2LightSleepEnable(void) 253 { 254 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM2LS_EN; 255 } 256 MXC_LP_SysRam3LightSleepEnable(void)257void MXC_LP_SysRam3LightSleepEnable(void) 258 { 259 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM3LS_EN; 260 } 261 MXC_LP_SysRam4LightSleepEnable(void)262void MXC_LP_SysRam4LightSleepEnable(void) 263 { 264 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM4LS_EN; 265 } 266 MXC_LP_SysRam5LightSleepEnable(void)267void MXC_LP_SysRam5LightSleepEnable(void) 268 { 269 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM5LS_EN; 270 } 271 MXC_LP_SysRam6LightSleepEnable(void)272void MXC_LP_SysRam6LightSleepEnable(void) 273 { 274 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_RAM6LS_EN; 275 } 276 MXC_LP_ICacheXIPLightSleepEnable(void)277void MXC_LP_ICacheXIPLightSleepEnable(void) 278 { 279 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_ICCXIPLS_EN; 280 } 281 MXC_LP_CryptoLightSleepEnable(void)282void MXC_LP_CryptoLightSleepEnable(void) 283 { 284 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_CRYPTOLS_EN; 285 } 286 MXC_LP_USBFIFOLightSleepEnable(void)287void MXC_LP_USBFIFOLightSleepEnable(void) 288 { 289 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_USBLS_EN; 290 } 291 MXC_LP_ROM0LightSleepEnable(void)292void MXC_LP_ROM0LightSleepEnable(void) 293 { 294 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_ROM0LS_EN; 295 } 296 MXC_LP_ROM1LightSleepEnable(void)297void MXC_LP_ROM1LightSleepEnable(void) 298 { 299 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_ROM1LS_EN; 300 } 301 MXC_LP_MAALightSleepEnable(void)302void MXC_LP_MAALightSleepEnable(void) 303 { 304 MXC_GCR->memctrl |= MXC_F_GCR_MEMCTRL_MAALS_EN; 305 } 306 MXC_LP_SysRam0LightSleepDisable(void)307void MXC_LP_SysRam0LightSleepDisable(void) 308 { 309 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM0LS_EN; 310 } 311 MXC_LP_SysRam1LightSleepDisable(void)312void MXC_LP_SysRam1LightSleepDisable(void) 313 { 314 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM1LS_EN; 315 } 316 MXC_LP_SysRam2LightSleepDisable(void)317void MXC_LP_SysRam2LightSleepDisable(void) 318 { 319 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM2LS_EN; 320 } 321 MXC_LP_SysRam3LightSleepDisable(void)322void MXC_LP_SysRam3LightSleepDisable(void) 323 { 324 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM3LS_EN; 325 } 326 MXC_LP_SysRam4LightSleepDisable(void)327void MXC_LP_SysRam4LightSleepDisable(void) 328 { 329 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM4LS_EN; 330 } 331 MXC_LP_SysRam5LightSleepDisable(void)332void MXC_LP_SysRam5LightSleepDisable(void) 333 { 334 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM5LS_EN; 335 } 336 MXC_LP_SysRam6LightSleepDisable(void)337void MXC_LP_SysRam6LightSleepDisable(void) 338 { 339 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_RAM6LS_EN; 340 } 341 MXC_LP_ICacheXIPLightSleepDisable(void)342void MXC_LP_ICacheXIPLightSleepDisable(void) 343 { 344 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_ICCXIPLS_EN; 345 } 346 MXC_LP_CryptoLightSleepDisable(void)347void MXC_LP_CryptoLightSleepDisable(void) 348 { 349 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_CRYPTOLS_EN; 350 } 351 MXC_LP_USBFIFOLightSleepDisable(void)352void MXC_LP_USBFIFOLightSleepDisable(void) 353 { 354 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_USBLS_EN; 355 } 356 MXC_LP_ROM0LightSleepDisable(void)357void MXC_LP_ROM0LightSleepDisable(void) 358 { 359 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_ROM0LS_EN; 360 } 361 MXC_LP_ROM1LightSleepDisable(void)362void MXC_LP_ROM1LightSleepDisable(void) 363 { 364 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_ROM1LS_EN; 365 } 366 MXC_LP_MAALightSleepDisable(void)367void MXC_LP_MAALightSleepDisable(void) 368 { 369 MXC_GCR->memctrl &= ~MXC_F_GCR_MEMCTRL_MAALS_EN; 370 } 371 MXC_LP_SysRam0Shutdown(void)372void MXC_LP_SysRam0Shutdown(void) 373 { 374 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM0; 375 } 376 MXC_LP_SysRam0PowerUp(void)377void MXC_LP_SysRam0PowerUp(void) 378 { 379 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM0; 380 } 381 MXC_LP_SysRam1Shutdown(void)382void MXC_LP_SysRam1Shutdown(void) 383 { 384 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM1; 385 } 386 MXC_LP_SysRam1PowerUp(void)387void MXC_LP_SysRam1PowerUp(void) 388 { 389 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM1; 390 } 391 MXC_LP_SysRam2Shutdown(void)392void MXC_LP_SysRam2Shutdown(void) 393 { 394 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM2; 395 } 396 MXC_LP_SysRam2PowerUp(void)397void MXC_LP_SysRam2PowerUp(void) 398 { 399 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM2; 400 } 401 MXC_LP_SysRam3Shutdown(void)402void MXC_LP_SysRam3Shutdown(void) 403 { 404 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM3; 405 } 406 MXC_LP_SysRam3PowerUp(void)407void MXC_LP_SysRam3PowerUp(void) 408 { 409 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM3; 410 } 411 MXC_LP_SysRam4Shutdown(void)412void MXC_LP_SysRam4Shutdown(void) 413 { 414 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM4; 415 } 416 MXC_LP_SysRam4PowerUp(void)417void MXC_LP_SysRam4PowerUp(void) 418 { 419 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM4; 420 } 421 MXC_LP_SysRam5Shutdown(void)422void MXC_LP_SysRam5Shutdown(void) 423 { 424 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM5; 425 } 426 MXC_LP_SysRam5PowerUp(void)427void MXC_LP_SysRam5PowerUp(void) 428 { 429 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM5; 430 } 431 MXC_LP_SysRam6Shutdown(void)432void MXC_LP_SysRam6Shutdown(void) 433 { 434 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_RAM6; 435 } 436 MXC_LP_SysRam6PowerUp(void)437void MXC_LP_SysRam6PowerUp(void) 438 { 439 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_RAM6; 440 } 441 MXC_LP_ICacheXIPShutdown(void)442void MXC_LP_ICacheXIPShutdown(void) 443 { 444 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_ICCXIP; 445 } 446 MXC_LP_ICacheXIPPowerUp(void)447void MXC_LP_ICacheXIPPowerUp(void) 448 { 449 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_ICCXIP; 450 } 451 MXC_LP_CryptoShutdown(void)452void MXC_LP_CryptoShutdown(void) 453 { 454 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_CRYPTO; 455 } 456 MXC_LP_CryptoPowerUp(void)457void MXC_LP_CryptoPowerUp(void) 458 { 459 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_CRYPTO; 460 } 461 MXC_LP_USBFIFOShutdown(void)462void MXC_LP_USBFIFOShutdown(void) 463 { 464 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_USBFIFO; 465 } 466 MXC_LP_USBFIFOPowerUp(void)467void MXC_LP_USBFIFOPowerUp(void) 468 { 469 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_USBFIFO; 470 } 471 MXC_LP_ROM0Shutdown(void)472void MXC_LP_ROM0Shutdown(void) 473 { 474 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_ROM0; 475 } 476 MXC_LP_ROM0PowerUp(void)477void MXC_LP_ROM0PowerUp(void) 478 { 479 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_ROM0; 480 } 481 MXC_LP_ROM1Shutdown(void)482void MXC_LP_ROM1Shutdown(void) 483 { 484 MXC_PWRSEQ->lpmemsd |= MXC_F_PWRSEQ_LPMEMSD_ROM1; 485 } 486 MXC_LP_ROM1PowerUp(void)487void MXC_LP_ROM1PowerUp(void) 488 { 489 MXC_PWRSEQ->lpmemsd &= ~MXC_F_PWRSEQ_LPMEMSD_ROM1; 490 } 491