Skip to content

Commit e784714

Browse files
kwagyemandpgeorge
authored andcommitted
mimxrt/modmachine: Add support for machine.deepsleep.
Signed-off-by: "Kwabena W. Agyeman" <kwagyeman@live.com>
1 parent 4331580 commit e784714

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
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
@@ -50,7 +50,11 @@ void machine_rtc_alarm_set_en() {
5050

5151
void machine_rtc_alarm_off(bool clear) {
5252
machine_rtc_alarm_clear_en();
53+
#ifdef MIMXRT117x_SERIES
54+
DisableIRQ(SNVS_HP_NON_TZ_IRQn);
55+
#else
5356
DisableIRQ(SNVS_HP_WRAPPER_IRQn);
57+
#endif
5458

5559
if (clear) {
5660
SNVS->LPTAR = 0;
@@ -60,7 +64,11 @@ void machine_rtc_alarm_off(bool clear) {
6064
}
6165

6266
void machine_rtc_alarm_on() {
67+
#ifdef MIMXRT117x_SERIES
68+
EnableIRQ(SNVS_HP_NON_TZ_IRQn);
69+
#else
6370
EnableIRQ(SNVS_HP_WRAPPER_IRQn);
71+
#endif
6472
machine_rtc_alarm_set_en();
6573
}
6674

ports/mimxrt/modmachine.c

Lines changed: 46 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"
@@ -74,6 +80,14 @@ STATIC mp_obj_t machine_reset(void) {
7480
MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_obj, machine_reset);
7581

7682
STATIC mp_obj_t machine_reset_cause(void) {
83+
#ifdef MIMXRT117x_SERIES
84+
uint32_t user_reset_flag = kSRC_M7CoreIppUserResetFlag;
85+
#else
86+
uint32_t user_reset_flag = kSRC_IppUserResetFlag;
87+
#endif
88+
if (SRC->SRSR & user_reset_flag) {
89+
return MP_OBJ_NEW_SMALL_INT(MP_DEEPSLEEP_RESET);
90+
}
7791
uint16_t reset_cause =
7892
WDOG_GetStatusFlags(WDOG1) & (kWDOG_PowerOnResetFlag | kWDOG_TimeoutResetFlag | kWDOG_SoftwareResetFlag);
7993
if (reset_cause == kWDOG_PowerOnResetFlag) {
@@ -98,6 +112,37 @@ STATIC mp_obj_t machine_idle(void) {
98112
}
99113
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
100114

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

164209
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) },
210+
{ MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) },
165211

166212
{ MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) },
167213
{ MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) },

ports/mimxrt/modmachine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void mimxrt_sdram_init(void);
5151
void machine_i2s_init0();
5252
void machine_i2s_deinit_all(void);
5353
void machine_rtc_start(void);
54-
54+
void machine_rtc_alarm_helper(int seconds, bool repeat);
5555
void machine_uart_set_baudrate(mp_obj_t uart, uint32_t baudrate);
5656

5757
#endif // MICROPY_INCLUDED_MIMXRT_MODMACHINE_H

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