summaryrefslogtreecommitdiff
path: root/ports/esp32s2/common-hal/alarm_io/__init__.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/esp32s2/common-hal/alarm_io/__init__.c')
-rw-r--r--ports/esp32s2/common-hal/alarm_io/__init__.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/ports/esp32s2/common-hal/alarm_io/__init__.c b/ports/esp32s2/common-hal/alarm_io/__init__.c
new file mode 100644
index 000000000..b39693c6a
--- /dev/null
+++ b/ports/esp32s2/common-hal/alarm_io/__init__.c
@@ -0,0 +1,35 @@
+#include "shared-bindings/alarm_io/__init__.h"
+
+#include "esp_sleep.h"
+#include "driver/rtc_io.h"
+
+mp_obj_t common_hal_alarm_io_pin_state (alarm_io_obj_t *self_in) {
+ if (!rtc_gpio_is_valid_gpio(self_in->gpio)) {
+ mp_raise_ValueError(translate("io must be rtc io"));
+ }
+
+ if (self_in->pull && !self_in->level) {
+ for (uint8_t i = 0; i<=4; i+=2) {
+ if (self_in->gpio == i) {
+ mp_raise_ValueError(translate("IOs 0, 2 & 4 do not support internal pullup in sleep"));
+ }
+ }
+ }
+
+ switch(esp_sleep_enable_ext0_wakeup(self_in->gpio, self_in->level)) {
+ case ESP_ERR_INVALID_ARG:
+ mp_raise_ValueError(translate("trigger level must be 0 or 1"));
+ case ESP_ERR_INVALID_STATE:
+ mp_raise_RuntimeError(translate("wakeup conflict"));
+ default:
+ break;
+ }
+
+ if (self_in->pull) { (self_in->level) ? rtc_gpio_pulldown_en(self_in->gpio) : rtc_gpio_pullup_en(self_in->gpio); }
+
+ return self_in;
+}
+
+void common_hal_alarm_io_disable (void) {
+ esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_EXT0 | ESP_SLEEP_WAKEUP_EXT1);
+}