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"
@@ -54,6 +60,8 @@ typedef enum {
54
60
MP_SOFT_RESET
55
61
} reset_reason_t ;
56
62
63
+ extern void machine_rtc_alarm_helper (int seconds , bool repeat );
64
+
57
65
STATIC mp_obj_t machine_unique_id (void ) {
58
66
unsigned char id [8 ];
59
67
mp_hal_get_unique_id (id );
@@ -74,6 +82,14 @@ STATIC mp_obj_t machine_reset(void) {
74
82
MP_DEFINE_CONST_FUN_OBJ_0 (machine_reset_obj , machine_reset );
75
83
76
84
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
+ }
77
93
uint16_t reset_cause =
78
94
WDOG_GetStatusFlags (WDOG1 ) & (kWDOG_PowerOnResetFlag | kWDOG_TimeoutResetFlag | kWDOG_SoftwareResetFlag );
79
95
if (reset_cause == kWDOG_PowerOnResetFlag ) {
@@ -98,6 +114,37 @@ STATIC mp_obj_t machine_idle(void) {
98
114
}
99
115
STATIC MP_DEFINE_CONST_FUN_OBJ_0 (machine_idle_obj , machine_idle );
100
116
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
+
101
148
STATIC mp_obj_t machine_disable_irq (void ) {
102
149
uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION ();
103
150
return mp_obj_new_int (state );
@@ -162,6 +209,7 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
162
209
{ MP_ROM_QSTR (MP_QSTR_WDT ), MP_ROM_PTR (& machine_wdt_type ) },
163
210
164
211
{ 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 ) },
165
213
166
214
{ MP_ROM_QSTR (MP_QSTR_disable_irq ), MP_ROM_PTR (& machine_disable_irq_obj ) },
167
215
{ MP_ROM_QSTR (MP_QSTR_enable_irq ), MP_ROM_PTR (& machine_enable_irq_obj ) },
0 commit comments