Skip to content

Commit b33a2b4

Browse files
committed
add coproc alarm
1 parent b5b6498 commit b33a2b4

File tree

20 files changed

+339
-12
lines changed

20 files changed

+339
-12
lines changed

locale/circuitpython.pot

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ msgstr ""
100100
msgid "%q failure: %d"
101101
msgstr ""
102102

103+
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
103104
#: shared-bindings/digitalio/DigitalInOut.c
104105
#: shared-bindings/microcontroller/Pin.c
105106
msgid "%q in use"
@@ -913,9 +914,9 @@ msgid "Error: Failure to bind"
913914
msgstr ""
914915

915916
#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c
916-
#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c
917-
#: shared-bindings/coproc/Coproc.c shared-bindings/coproc/__init__.c
918-
#: shared-bindings/microcontroller/Pin.c
917+
#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c
918+
#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c
919+
#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c
919920
#: shared-bindings/neopixel_write/__init__.c
920921
msgid "Expected a %q"
921922
msgstr ""
@@ -1615,8 +1616,9 @@ msgid ""
16151616
"%d bpp given"
16161617
msgstr ""
16171618

1619+
#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c
16181620
#: ports/espressif/common-hal/alarm/touch/TouchAlarm.c
1619-
msgid "Only one TouchAlarm can be set in deep sleep."
1621+
msgid "Only one %q can be set in deep sleep."
16201622
msgstr ""
16211623

16221624
#: ports/espressif/common-hal/i2ctarget/I2CTarget.c
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty file
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty file

ports/espressif/common-hal/alarm/__init__.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "shared-bindings/alarm/pin/PinAlarm.h"
3636
#include "shared-bindings/alarm/time/TimeAlarm.h"
3737
#include "shared-bindings/alarm/touch/TouchAlarm.h"
38+
#include "shared-bindings/alarm/coproc/CoprocAlarm.h"
3839

3940
#include "shared-bindings/wifi/__init__.h"
4041
#include "shared-bindings/microcontroller/__init__.h"
@@ -62,6 +63,7 @@ void alarm_reset(void) {
6263
alarm_pin_pinalarm_reset();
6364
alarm_time_timealarm_reset();
6465
alarm_touch_touchalarm_reset();
66+
alarm_coproc_coprocalarm_reset();
6567
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);
6668
}
6769

@@ -76,6 +78,9 @@ STATIC esp_sleep_wakeup_cause_t _get_wakeup_cause(void) {
7678
if (alarm_touch_touchalarm_woke_this_cycle()) {
7779
return ESP_SLEEP_WAKEUP_TOUCHPAD;
7880
}
81+
if (alarm_coproc_coprocalarm_woke_this_cycle()) {
82+
return ESP_SLEEP_WAKEUP_ULP;
83+
}
7984
// If waking from true deep sleep, modules will have lost their state,
8085
// so check the deep wakeup cause manually
8186
return esp_sleep_get_wakeup_cause();
@@ -104,6 +109,10 @@ mp_obj_t common_hal_alarm_create_wake_alarm(void) {
104109
return alarm_touch_touchalarm_create_wakeup_alarm();
105110
}
106111

112+
case ESP_SLEEP_WAKEUP_ULP: {
113+
return alarm_coproc_coprocalarm_create_wakeup_alarm();
114+
}
115+
107116
case ESP_SLEEP_WAKEUP_UNDEFINED:
108117
default:
109118
// Not a deep sleep reset.
@@ -117,6 +126,7 @@ STATIC void _setup_sleep_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t
117126
alarm_pin_pinalarm_set_alarms(deep_sleep, n_alarms, alarms);
118127
alarm_time_timealarm_set_alarms(deep_sleep, n_alarms, alarms);
119128
alarm_touch_touchalarm_set_alarm(deep_sleep, n_alarms, alarms);
129+
alarm_coproc_coprocalarm_set_alarm(deep_sleep, n_alarms, alarms);
120130
}
121131

122132
mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms) {
@@ -143,6 +153,10 @@ mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj
143153
wake_alarm = alarm_touch_touchalarm_find_triggered_alarm(n_alarms,alarms);
144154
break;
145155
}
156+
case ESP_SLEEP_WAKEUP_ULP: {
157+
wake_alarm = alarm_coproc_coprocalarm_find_triggered_alarm(n_alarms,alarms);
158+
break;
159+
}
146160
default:
147161
// Should not reach this, if all light sleep types are covered correctly
148162
break;
@@ -169,6 +183,7 @@ void common_hal_alarm_set_deep_sleep_alarms(size_t n_alarms, const mp_obj_t *ala
169183
void NORETURN common_hal_alarm_enter_deep_sleep(void) {
170184
alarm_pin_pinalarm_prepare_for_deep_sleep();
171185
alarm_touch_touchalarm_prepare_for_deep_sleep();
186+
alarm_coproc_coprocalarm_prepare_for_deep_sleep();
172187

173188
// We no longer need to remember the pin preservations, since any pin resets are all done.
174189
clear_pin_preservations();
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2022 microDev
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#include "shared-bindings/alarm/coproc/CoprocAlarm.h"
28+
#include "shared-bindings/coproc/__init__.h"
29+
30+
#include "esp_sleep.h"
31+
32+
#if CIRCUITPY_COPROC
33+
34+
mp_obj_t alarm_coproc_coprocalarm_find_triggered_alarm(const size_t n_alarms, const mp_obj_t *alarms) {
35+
for (size_t i = 0; i < n_alarms; i++) {
36+
if (mp_obj_is_type(alarms[i], &alarm_coproc_coprocalarm_type)) {
37+
return alarms[i];
38+
}
39+
}
40+
return mp_const_none;
41+
}
42+
43+
mp_obj_t alarm_coproc_coprocalarm_create_wakeup_alarm(void) {
44+
// Create CoprocAlarm object.
45+
alarm_coproc_coprocalarm_obj_t *alarm = m_new_obj(alarm_coproc_coprocalarm_obj_t);
46+
alarm->base.type = &alarm_coproc_coprocalarm_type;
47+
return alarm;
48+
}
49+
50+
void alarm_coproc_coprocalarm_set_alarm(const bool deep_sleep, const size_t n_alarms, const mp_obj_t *alarms) {
51+
bool coproc_alarm_set = false;
52+
alarm_coproc_coprocalarm_obj_t *coproc_alarm = MP_OBJ_NULL;
53+
54+
for (size_t i = 0; i < n_alarms; i++) {
55+
if (mp_obj_is_type(alarms[i], &alarm_coproc_coprocalarm_type)) {
56+
if (deep_sleep && coproc_alarm_set) {
57+
mp_raise_ValueError_varg(translate("Only one %q can be set in deep sleep."), MP_QSTR_CoprocAlarm);
58+
}
59+
coproc_alarm = MP_OBJ_TO_PTR(alarms[i]);
60+
coproc_alarm_set = true;
61+
}
62+
}
63+
64+
if (!coproc_alarm_set) {
65+
return;
66+
}
67+
68+
// load coproc program
69+
common_hal_coproc_load(coproc_alarm->coproc);
70+
}
71+
72+
void alarm_coproc_coprocalarm_prepare_for_deep_sleep(void) {
73+
// start coproc program
74+
common_hal_coproc_run(NULL);
75+
76+
// enable coproc wakeup
77+
esp_sleep_enable_ulp_wakeup();
78+
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON);
79+
}
80+
81+
bool alarm_coproc_coprocalarm_woke_this_cycle(void) {
82+
return false;
83+
}
84+
85+
void alarm_coproc_coprocalarm_reset(void) {
86+
}
87+
88+
#else // CIRCUITPY_COPROC
89+
90+
mp_obj_t alarm_coproc_coprocalarm_find_triggered_alarm(const size_t n_alarms, const mp_obj_t *alarms) {
91+
return mp_const_none;
92+
}
93+
94+
mp_obj_t alarm_coproc_coprocalarm_create_wakeup_alarm(void) {
95+
return mp_const_none;
96+
}
97+
98+
void alarm_coproc_coprocalarm_set_alarm(const bool deep_sleep, const size_t n_alarms, const mp_obj_t *alarms) {
99+
}
100+
101+
void alarm_coproc_coprocalarm_prepare_for_deep_sleep(void) {
102+
}
103+
104+
bool alarm_coproc_coprocalarm_woke_this_cycle(void) {
105+
return false;
106+
}
107+
108+
void alarm_coproc_coprocalarm_reset(void) {
109+
}
110+
111+
#endif // CIRCUITPY_COPROC
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2022 microDev
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#ifndef MICROPY_INCLUDED_COMMON_HAL_ALARM_COPROC_COPROCALARM_H
28+
#define MICROPY_INCLUDED_COMMON_HAL_ALARM_COPROC_COPROCALARM_H
29+
30+
#include "py/obj.h"
31+
#include "py/runtime.h"
32+
33+
#include "common-hal/coproc/Coproc.h"
34+
35+
typedef struct {
36+
mp_obj_base_t base;
37+
coproc_coproc_obj_t *coproc;
38+
} alarm_coproc_coprocalarm_obj_t;
39+
40+
mp_obj_t alarm_coproc_coprocalarm_find_triggered_alarm(const size_t n_alarms, const mp_obj_t *alarms);
41+
mp_obj_t alarm_coproc_coprocalarm_create_wakeup_alarm(void);
42+
43+
void alarm_coproc_coprocalarm_prepare_for_deep_sleep(void);
44+
void alarm_coproc_coprocalarm_reset(void);
45+
void alarm_coproc_coprocalarm_set_alarm(const bool deep_sleep, const size_t n_alarms, const mp_obj_t *alarms);
46+
bool alarm_coproc_coprocalarm_woke_this_cycle(void);
47+
48+
#endif // MICROPY_INCLUDED_COMMON_HAL_ALARM_COPROC_COPROCALARM_H

ports/espressif/common-hal/alarm/touch/TouchAlarm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ void alarm_touch_touchalarm_set_alarm(const bool deep_sleep, const size_t n_alar
9696
for (size_t i = 0; i < n_alarms; i++) {
9797
if (mp_obj_is_type(alarms[i], &alarm_touch_touchalarm_type)) {
9898
if (deep_sleep && touch_alarm_set) {
99-
mp_raise_ValueError(translate("Only one TouchAlarm can be set in deep sleep."));
99+
mp_raise_ValueError_varg(translate("Only one %q can be set in deep sleep."), MP_QSTR_TouchAlarm);
100100
}
101101
touch_alarm = MP_OBJ_TO_PTR(alarms[i]);
102102
touch_channel_mask |= 1 << touch_alarm->pin->number;

ports/espressif/common-hal/coproc/__init__.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,6 @@
4040
#include "soc/rtc_cntl_reg.h"
4141

4242
void common_hal_coproc_run(coproc_coproc_obj_t *self) {
43-
if (ulp_riscv_load_binary(self->buf, self->buf_len) != ESP_OK) {
44-
mp_raise_RuntimeError(translate("Firmware is too big"));
45-
}
46-
m_free(self->buf);
47-
self->buf = (uint8_t *)RTC_SLOW_MEM;
4843
ulp_riscv_run();
4944
}
5045

@@ -64,6 +59,14 @@ void common_hal_coproc_halt(coproc_coproc_obj_t *self) {
6459
SET_PERI_REG_MASK(RTC_CNTL_COCPU_CTRL_REG, RTC_CNTL_COCPU_SHUT_RESET_EN);
6560
}
6661

62+
void common_hal_coproc_load(coproc_coproc_obj_t *self) {
63+
if (ulp_riscv_load_binary(self->buf, self->buf_len) != ESP_OK) {
64+
mp_raise_RuntimeError(translate("Firmware is too big"));
65+
}
66+
m_free(self->buf);
67+
self->buf = (uint8_t *)RTC_SLOW_MEM;
68+
}
69+
6770
mp_obj_t common_hal_coproc_memory(coproc_coproc_obj_t *self) {
6871
return (self->coproc_memory) ? MP_OBJ_FROM_PTR(self->coproc_memory) : mp_const_none;
6972
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty file
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty file
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty file
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty file
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty file
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty file

py/circuitpy_defns.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ SRC_COMMON_HAL_ALL = \
400400
alarm/pin/PinAlarm.c \
401401
alarm/time/TimeAlarm.c \
402402
alarm/touch/TouchAlarm.c \
403+
alarm/coproc/CoprocAlarm.c \
403404
analogbufio/BufferedIn.c \
404405
analogbufio/__init__.c \
405406
analogio/AnalogIn.c \

shared-bindings/alarm/__init__.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "shared-bindings/alarm/pin/PinAlarm.h"
3333
#include "shared-bindings/alarm/time/TimeAlarm.h"
3434
#include "shared-bindings/alarm/touch/TouchAlarm.h"
35+
#include "shared-bindings/alarm/coproc/CoprocAlarm.h"
3536
#include "shared-bindings/digitalio/DigitalInOut.h"
3637
#include "shared-bindings/supervisor/Runtime.h"
3738
#include "shared-bindings/time/__init__.h"
@@ -76,7 +77,8 @@ STATIC void validate_objs_are_alarms(size_t n_args, const mp_obj_t *objs) {
7677
for (size_t i = 0; i < n_args; i++) {
7778
if (mp_obj_is_type(objs[i], &alarm_pin_pinalarm_type) ||
7879
mp_obj_is_type(objs[i], &alarm_time_timealarm_type) ||
79-
mp_obj_is_type(objs[i], &alarm_touch_touchalarm_type)) {
80+
mp_obj_is_type(objs[i], &alarm_touch_touchalarm_type) ||
81+
mp_obj_is_type(objs[i], &alarm_coproc_coprocalarm_type)) {
8082
continue;
8183
}
8284
mp_raise_TypeError_varg(translate("Expected an %q"), MP_QSTR_Alarm);
@@ -252,6 +254,18 @@ STATIC const mp_obj_module_t alarm_touch_module = {
252254
.globals = (mp_obj_dict_t *)&alarm_touch_globals,
253255
};
254256

257+
STATIC const mp_map_elem_t alarm_coproc_globals_table[] = {
258+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_coproc) },
259+
{ MP_ROM_QSTR(MP_QSTR_CoprocAlarm), MP_OBJ_FROM_PTR(&alarm_coproc_coprocalarm_type) },
260+
};
261+
262+
STATIC MP_DEFINE_CONST_DICT(alarm_coproc_globals, alarm_coproc_globals_table);
263+
264+
STATIC const mp_obj_module_t alarm_coproc_module = {
265+
.base = { &mp_type_module },
266+
.globals = (mp_obj_dict_t *)&alarm_coproc_globals,
267+
};
268+
255269
// The module table is mutable because .wake_alarm is a mutable attribute.
256270
STATIC mp_map_elem_t alarm_module_globals_table[] = {
257271
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_alarm) },
@@ -266,6 +280,7 @@ STATIC mp_map_elem_t alarm_module_globals_table[] = {
266280
{ MP_ROM_QSTR(MP_QSTR_pin), MP_OBJ_FROM_PTR(&alarm_pin_module) },
267281
{ MP_ROM_QSTR(MP_QSTR_time), MP_OBJ_FROM_PTR(&alarm_time_module) },
268282
{ MP_ROM_QSTR(MP_QSTR_touch), MP_OBJ_FROM_PTR(&alarm_touch_module) },
283+
{ MP_ROM_QSTR(MP_QSTR_coproc), MP_OBJ_FROM_PTR(&alarm_coproc_module) },
269284

270285
{ MP_ROM_QSTR(MP_QSTR_SleepMemory), MP_OBJ_FROM_PTR(&alarm_sleep_memory_type) },
271286
{ MP_ROM_QSTR(MP_QSTR_sleep_memory), MP_OBJ_FROM_PTR(&alarm_sleep_memory_obj) },

0 commit comments

Comments
 (0)