37
37
#include "led.h"
38
38
#include "pin.h"
39
39
#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
40
46
#include "fsl_wdog.h"
41
47
#if FSL_FEATURE_BOOT_ROM_HAS_ROMAPI
42
48
#include "fsl_romapi.h"
@@ -74,6 +80,14 @@ STATIC mp_obj_t machine_reset(void) {
74
80
MP_DEFINE_CONST_FUN_OBJ_0 (machine_reset_obj , machine_reset );
75
81
76
82
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
+ }
77
91
uint16_t reset_cause =
78
92
WDOG_GetStatusFlags (WDOG1 ) & (kWDOG_PowerOnResetFlag | kWDOG_TimeoutResetFlag | kWDOG_SoftwareResetFlag );
79
93
if (reset_cause == kWDOG_PowerOnResetFlag ) {
@@ -98,6 +112,37 @@ STATIC mp_obj_t machine_idle(void) {
98
112
}
99
113
STATIC MP_DEFINE_CONST_FUN_OBJ_0 (machine_idle_obj , machine_idle );
100
114
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
+
101
146
STATIC mp_obj_t machine_disable_irq (void ) {
102
147
uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION ();
103
148
return mp_obj_new_int (state );
@@ -162,6 +207,7 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
162
207
{ MP_ROM_QSTR (MP_QSTR_WDT ), MP_ROM_PTR (& machine_wdt_type ) },
163
208
164
209
{ 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 ) },
165
211
166
212
{ MP_ROM_QSTR (MP_QSTR_disable_irq ), MP_ROM_PTR (& machine_disable_irq_obj ) },
167
213
{ MP_ROM_QSTR (MP_QSTR_enable_irq ), MP_ROM_PTR (& machine_enable_irq_obj ) },
0 commit comments