From a9821c01852201426e9439d7a704e791add333ab Mon Sep 17 00:00:00 2001 From: robert-hh Date: Fri, 28 Jul 2023 22:29:32 +0200 Subject: [PATCH] mimxrt/machine_pin: Fix bug when Pin.irq is called without a handler. When called without a handler, the IRQ data was not cleared. That caused a crash at the second soft reset in a row. Signed-off-by: robert-hh --- ports/mimxrt/machine_pin.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ports/mimxrt/machine_pin.c b/ports/mimxrt/machine_pin.c index f005e38d697d..c66718e976cb 100644 --- a/ports/mimxrt/machine_pin.c +++ b/ports/mimxrt/machine_pin.c @@ -337,6 +337,13 @@ STATIC mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_ } machine_pin_irq_obj_t *irq = MP_STATE_PORT(machine_pin_irq_objects[index]); + if (args[ARG_handler].u_obj == mp_const_none) { + // remove the IRQ from the table, leave it to gc to free it. + GPIO_PortDisableInterrupts(self->gpio, 1U << self->pin); + MP_STATE_PORT(machine_pin_irq_objects[index]) = NULL; + return mp_const_none; + } + // Allocate the IRQ object if it doesn't already exist. if (irq == NULL) { irq = m_new_obj(machine_pin_irq_obj_t); @@ -371,9 +378,9 @@ STATIC mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_ GPIO_PinSetInterruptConfig(self->gpio, self->pin, irq->trigger); // Enable the specific Pin interrupt GPIO_PortEnableInterrupts(self->gpio, 1U << self->pin); + // Enable LEVEL1 interrupt again + EnableIRQ(irq_num); } - // Enable LEVEL1 interrupt again - EnableIRQ(irq_num); } return MP_OBJ_FROM_PTR(irq);