27
27
#include "shared-bindings/alarm/coproc/CoprocAlarm.h"
28
28
#include "shared-bindings/coproc/__init__.h"
29
29
30
+ #if CIRCUITPY_COPROC
31
+
32
+ #include "supervisor/port.h"
33
+
34
+ #include "driver/rtc_cntl.h"
35
+ #include "soc/rtc_cntl_reg.h"
36
+
30
37
#include "esp_sleep.h"
31
38
32
- #if CIRCUITPY_COPROC
39
+ static volatile bool woke_up = false;
33
40
34
41
mp_obj_t alarm_coproc_coprocalarm_find_triggered_alarm (const size_t n_alarms , const mp_obj_t * alarms ) {
35
42
for (size_t i = 0 ; i < n_alarms ; i ++ ) {
@@ -47,6 +54,13 @@ mp_obj_t alarm_coproc_coprocalarm_create_wakeup_alarm(void) {
47
54
return alarm ;
48
55
}
49
56
57
+ // This is used to wake the main CircuitPython task.
58
+ STATIC void coproc_interrupt (void * arg ) {
59
+ (void )arg ;
60
+ woke_up = true;
61
+ port_wake_main_task_from_isr ();
62
+ }
63
+
50
64
void alarm_coproc_coprocalarm_set_alarm (const bool deep_sleep , const size_t n_alarms , const mp_obj_t * alarms ) {
51
65
bool coproc_alarm_set = false;
52
66
alarm_coproc_coprocalarm_obj_t * coproc_alarm = MP_OBJ_NULL ;
@@ -65,24 +79,30 @@ void alarm_coproc_coprocalarm_set_alarm(const bool deep_sleep, const size_t n_al
65
79
return ;
66
80
}
67
81
68
- // load coproc program
69
- common_hal_coproc_load (coproc_alarm -> coproc );
82
+ // enable coproc interrupt
83
+ rtc_isr_register (& coproc_interrupt , NULL , RTC_CNTL_COCPU_INT_ST );
84
+ REG_SET_BIT (RTC_CNTL_INT_ENA_REG , RTC_CNTL_COCPU_INT_ENA );
85
+
86
+ // start coproc program
87
+ common_hal_coproc_run (coproc_alarm -> coproc );
70
88
}
71
89
72
90
void alarm_coproc_coprocalarm_prepare_for_deep_sleep (void ) {
73
- // start coproc program
74
- common_hal_coproc_run (NULL );
91
+ // disbale coproc interrupt
92
+ rtc_isr_deregister (& coproc_interrupt , NULL );
93
+ REG_CLR_BIT (RTC_CNTL_INT_ENA_REG , RTC_CNTL_COCPU_INT_ENA );
75
94
76
95
// enable coproc wakeup
77
96
esp_sleep_enable_ulp_wakeup ();
78
97
esp_sleep_pd_config (ESP_PD_DOMAIN_RTC_SLOW_MEM , ESP_PD_OPTION_ON );
79
98
}
80
99
81
100
bool alarm_coproc_coprocalarm_woke_this_cycle (void ) {
82
- return false ;
101
+ return woke_up ;
83
102
}
84
103
85
104
void alarm_coproc_coprocalarm_reset (void ) {
105
+ woke_up = false;
86
106
}
87
107
88
108
#else // CIRCUITPY_COPROC
0 commit comments