summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/esp8266/machine_pin.c24
-rw-r--r--ports/esp8266/mpconfigport.h1
2 files changed, 6 insertions, 19 deletions
diff --git a/ports/esp8266/machine_pin.c b/ports/esp8266/machine_pin.c
index f33f97787..4e74ad652 100644
--- a/ports/esp8266/machine_pin.c
+++ b/ports/esp8266/machine_pin.c
@@ -37,7 +37,6 @@
#include "py/gc.h"
#include "py/mphal.h"
#include "extmod/virtpin.h"
-#include "ets_alt_task.h"
#include "modmachine.h"
#define GET_TRIGGER(phys_port) \
@@ -87,15 +86,11 @@ STATIC uint8_t pin_mode[16 + 1];
// forward declaration
STATIC const pin_irq_obj_t pin_irq_obj[16];
-// whether the irq is hard or soft
-STATIC bool pin_irq_is_hard[16];
-
void pin_init0(void) {
ETS_GPIO_INTR_DISABLE();
ETS_GPIO_INTR_ATTACH(pin_intr_handler_iram, NULL);
// disable all interrupts
memset(&MP_STATE_PORT(pin_irq_handler)[0], 0, 16 * sizeof(mp_obj_t));
- memset(pin_irq_is_hard, 0, sizeof(pin_irq_is_hard));
for (int p = 0; p < 16; ++p) {
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1 << p);
SET_TRIGGER(p, 0);
@@ -103,24 +98,13 @@ void pin_init0(void) {
ETS_GPIO_INTR_ENABLE();
}
-void pin_intr_handler(uint32_t status) {
+void MP_FASTCODE(pin_intr_handler)(uint32_t status) {
status &= 0xffff;
for (int p = 0; status; ++p, status >>= 1) {
if (status & 1) {
mp_obj_t handler = MP_STATE_PORT(pin_irq_handler)[p];
if (handler != MP_OBJ_NULL) {
- if (pin_irq_is_hard[p]) {
- int orig_ets_loop_iter_disable = ets_loop_iter_disable;
- ets_loop_iter_disable = 1;
- mp_sched_lock();
- gc_lock();
- mp_call_function_1_protected(handler, MP_OBJ_FROM_PTR(&pyb_pin_obj[p]));
- gc_unlock();
- mp_sched_unlock();
- ets_loop_iter_disable = orig_ets_loop_iter_disable;
- } else {
- mp_sched_schedule(handler, MP_OBJ_FROM_PTR(&pyb_pin_obj[p]));
- }
+ mp_sched_schedule(handler, MP_OBJ_FROM_PTR(&pyb_pin_obj[p]));
}
}
}
@@ -390,6 +374,9 @@ STATIC mp_obj_t pyb_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k
if (self->phys_port >= 16) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("pin does not have IRQ capabilities"));
}
+ if (args[ARG_hard].u_bool) {
+ mp_raise_ValueError(MP_ERROR_TEXT("hard IRQ not supported"));
+ }
if (n_args > 1 || kw_args->used != 0) {
// configure irq
@@ -401,7 +388,6 @@ STATIC mp_obj_t pyb_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k
}
ETS_GPIO_INTR_DISABLE();
MP_STATE_PORT(pin_irq_handler)[self->phys_port] = handler;
- pin_irq_is_hard[self->phys_port] = args[ARG_hard].u_bool;
SET_TRIGGER(self->phys_port, trigger);
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1 << self->phys_port);
ETS_GPIO_INTR_ENABLE();
diff --git a/ports/esp8266/mpconfigport.h b/ports/esp8266/mpconfigport.h
index 71c49cd24..e27ae1792 100644
--- a/ports/esp8266/mpconfigport.h
+++ b/ports/esp8266/mpconfigport.h
@@ -192,5 +192,6 @@ extern const struct _mp_obj_module_t mp_module_onewire;
#define MP_FASTCODE(n) __attribute__((section(".iram0.text." #n))) n
#define MICROPY_WRAP_MP_KEYBOARD_INTERRUPT(f) MP_FASTCODE(f)
+#define MICROPY_WRAP_MP_SCHED_SCHEDULE(f) MP_FASTCODE(f)
#define _assert(expr) ((expr) ? (void)0 : __assert_func(__FILE__, __LINE__, __func__, #expr))