summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/esp32/machine_pin.c10
-rw-r--r--ports/esp32/mphalport.h10
2 files changed, 20 insertions, 0 deletions
diff --git a/ports/esp32/machine_pin.c b/ports/esp32/machine_pin.c
index 74202d6f7..b821abf1f 100644
--- a/ports/esp32/machine_pin.c
+++ b/ports/esp32/machine_pin.c
@@ -287,6 +287,15 @@ static mp_obj_t machine_pin_on(mp_obj_t self_in) {
}
static MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_on_obj, machine_pin_on);
+// pin.toggle()
+static mp_obj_t machine_pin_toggle(mp_obj_t self_in) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ gpio_num_t index = PIN_OBJ_PTR_INDEX(self);
+ gpio_set_level(index, 1 - mp_hal_pin_read_output(index));
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_toggle_obj, machine_pin_toggle);
+
// pin.irq(handler=None, trigger=IRQ_FALLING|IRQ_RISING)
static mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
enum { ARG_handler, ARG_trigger, ARG_wake };
@@ -366,6 +375,7 @@ static const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&machine_pin_value_obj) },
{ MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&machine_pin_off_obj) },
{ MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&machine_pin_on_obj) },
+ { MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&machine_pin_toggle_obj) },
{ MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_pin_irq_obj) },
// class attributes
diff --git a/ports/esp32/mphalport.h b/ports/esp32/mphalport.h
index a908d784d..a919a859a 100644
--- a/ports/esp32/mphalport.h
+++ b/ports/esp32/mphalport.h
@@ -36,6 +36,7 @@
#include "freertos/task.h"
#include "driver/spi_master.h"
+#include "soc/gpio_reg.h"
#define MICROPY_PLATFORM_VERSION "IDF" IDF_VER
@@ -133,6 +134,15 @@ static inline void mp_hal_pin_od_high(mp_hal_pin_obj_t pin) {
static inline int mp_hal_pin_read(mp_hal_pin_obj_t pin) {
return gpio_get_level(pin);
}
+static inline int mp_hal_pin_read_output(mp_hal_pin_obj_t pin) {
+ #if defined(GPIO_OUT1_REG)
+ return pin < 32
+ ? (*(uint32_t *)GPIO_OUT_REG >> pin) & 1
+ : (*(uint32_t *)GPIO_OUT1_REG >> (pin - 32)) & 1;
+ #else
+ return (*(uint32_t *)GPIO_OUT_REG >> pin) & 1;
+ #endif
+}
static inline void mp_hal_pin_write(mp_hal_pin_obj_t pin, int v) {
gpio_set_level(pin, v);
}