Skip to content

Commit 465ce5d

Browse files
kwagyemaniabdalkader
authored andcommitted
ports/mimxrt: Add support for deepsleep.
Signed-off-by: "Kwabena W. Agyeman" <kwagyeman@live.com>
1 parent 8e7ef8e commit 465ce5d

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

ports/mimxrt/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ SRC_HAL_IMX_C += \
128128
$(MCU_DIR)/drivers/fsl_edma.c \
129129
$(MCU_DIR)/drivers/fsl_flexram.c \
130130
$(MCU_DIR)/drivers/fsl_flexspi.c \
131+
$(MCU_DIR)/drivers/fsl_gpc.c \
131132
$(MCU_DIR)/drivers/fsl_gpio.c \
132133
$(MCU_DIR)/drivers/fsl_gpt.c \
133134
$(MCU_DIR)/drivers/fsl_lpi2c.c \

ports/mimxrt/machine_rtc.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ void machine_rtc_alarm_set_en() {
5151

5252
void machine_rtc_alarm_off(bool clear) {
5353
machine_rtc_alarm_clear_en();
54+
#ifdef MIMXRT117x_SERIES
55+
DisableIRQ(SNVS_HP_NON_TZ_IRQn);
56+
#else
5457
DisableIRQ(SNVS_HP_WRAPPER_IRQn);
58+
#endif
5559

5660
if (clear) {
5761
SNVS->LPTAR = 0;
@@ -61,7 +65,11 @@ void machine_rtc_alarm_off(bool clear) {
6165
}
6266

6367
void machine_rtc_alarm_on() {
68+
#ifdef MIMXRT117x_SERIES
69+
EnableIRQ(SNVS_HP_NON_TZ_IRQn);
70+
#else
6471
EnableIRQ(SNVS_HP_WRAPPER_IRQn);
72+
#endif
6573
machine_rtc_alarm_set_en();
6674
}
6775

ports/mimxrt/modmachine.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@
3737
#include "led.h"
3838
#include "pin.h"
3939
#include "modmachine.h"
40+
#include "fsl_gpc.h"
41+
#ifdef MIMXRT117x_SERIES
42+
#include "fsl_soc_src.h"
43+
#else
44+
#include "fsl_src.h"
45+
#endif
4046
#include "fsl_wdog.h"
4147
#if FSL_FEATURE_BOOT_ROM_HAS_ROMAPI
4248
#include "fsl_romapi.h"
@@ -54,6 +60,8 @@ typedef enum {
5460
MP_SOFT_RESET
5561
} reset_reason_t;
5662

63+
extern void machine_rtc_alarm_helper(int seconds, bool repeat);
64+
5765
STATIC mp_obj_t machine_unique_id(void) {
5866
unsigned char id[8];
5967
mp_hal_get_unique_id(id);
@@ -74,6 +82,14 @@ STATIC mp_obj_t machine_reset(void) {
7482
MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_obj, machine_reset);
7583

7684
STATIC mp_obj_t machine_reset_cause(void) {
85+
#ifdef MIMXRT117x_SERIES
86+
uint32_t user_reset_flag = kSRC_M7CoreIppUserResetFlag;
87+
#else
88+
uint32_t user_reset_flag = kSRC_IppUserResetFlag;
89+
#endif
90+
if (SRC->SRSR & user_reset_flag) {
91+
return MP_OBJ_NEW_SMALL_INT(MP_DEEPSLEEP_RESET);
92+
}
7793
uint16_t reset_cause =
7894
WDOG_GetStatusFlags(WDOG1) & (kWDOG_PowerOnResetFlag | kWDOG_TimeoutResetFlag | kWDOG_SoftwareResetFlag);
7995
if (reset_cause == kWDOG_PowerOnResetFlag) {
@@ -98,6 +114,37 @@ STATIC mp_obj_t machine_idle(void) {
98114
}
99115
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
100116

117+
STATIC mp_obj_t machine_deepsleep(size_t n_args, const mp_obj_t *args) {
118+
if (n_args != 0) {
119+
mp_int_t seconds = mp_obj_get_int(args[0]) / 1000;
120+
if (seconds > 0) {
121+
machine_rtc_alarm_helper(seconds, false);
122+
#ifdef MIMXRT117x_SERIES
123+
GPC_CM_EnableIrqWakeup(GPC_CPU_MODE_CTRL_0, SNVS_HP_NON_TZ_IRQn, true);
124+
#else
125+
GPC_EnableIRQ(GPC, SNVS_HP_WRAPPER_IRQn);
126+
#endif
127+
}
128+
}
129+
130+
#ifdef MIMXRT117x_SERIES
131+
machine_pin_config(&pin_WAKEUP_DIG, PIN_MODE_IT_RISING, PIN_PULL_DISABLED, PIN_DRIVE_OFF, 0, PIN_AF_MODE_ALT5);
132+
GPC_CM_EnableIrqWakeup(GPC_CPU_MODE_CTRL_0, GPIO13_Combined_0_31_IRQn, true);
133+
#elif defined IOMUXC_SNVS_WAKEUP_GPIO5_IO00
134+
machine_pin_config(&pin_WAKEUP, PIN_MODE_IT_RISING, PIN_PULL_DISABLED, PIN_DRIVE_OFF, 0, PIN_AF_MODE_ALT5);
135+
GPC_EnableIRQ(GPC, GPIO5_Combined_0_15_IRQn);
136+
#endif
137+
138+
SNVS->LPCR |= SNVS_LPCR_TOP_MASK;
139+
140+
while (true) {
141+
;
142+
}
143+
144+
return mp_const_none;
145+
}
146+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_deepsleep_obj, 0, 1, machine_deepsleep);
147+
101148
STATIC mp_obj_t machine_disable_irq(void) {
102149
uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION();
103150
return mp_obj_new_int(state);
@@ -162,6 +209,7 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
162209
{ MP_ROM_QSTR(MP_QSTR_WDT), MP_ROM_PTR(&machine_wdt_type) },
163210

164211
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) },
212+
{ MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) },
165213

166214
{ MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) },
167215
{ MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) },

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy