Skip to content

Commit 65d5c72

Browse files
authored
Merge pull request #11404 from lrusinowicz/interrupt_in_fix
FUTURE_SEQUANA: InterruptIn implementation bug fix
2 parents f513bce + 7d540cd commit 65d5c72

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/gpio_irq_api.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,12 +202,17 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
202202
MBED_ASSERT("Invalid pin ID!");
203203
return (-1);
204204
}
205-
obj->handler = (uint32_t) handler;
205+
obj->handler = (uint32_t)handler;
206206
obj->id_arg = id;
207-
return gpio_irq_setup_channel(obj);
207+
irq_objects[obj->port_id][obj->pin] = obj;
208+
if (gpio_irq_setup_channel(obj) != 0) {
209+
irq_objects[obj->port_id][obj->pin] = NULL;
210+
return (-1);
211+
}
208212
} else {
209213
return (-1);
210214
}
215+
return 0;
211216
}
212217

213218
void gpio_irq_free(gpio_irq_t *obj)
@@ -218,6 +223,7 @@ void gpio_irq_free(gpio_irq_t *obj)
218223
irq_port_usage[obj->port_id].pin_mask &= ~(1 << obj->pin);
219224
if (irq_port_usage[obj->port_id].pin_mask == 0) {
220225
gpio_irq_release_channel(irq_port_usage[obj->port_id].irqn, obj->port_id);
226+
irq_objects[obj->port_id][obj->pin] = NULL;
221227
return;
222228
}
223229
NVIC_EnableIRQ(irq_port_usage[obj->port_id].irqn);
@@ -230,26 +236,30 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
230236
if (obj->mode == IRQ_FALL) {
231237
obj->mode += IRQ_RISE;
232238
Cy_GPIO_SetInterruptEdge(obj->port, obj->pin, CY_GPIO_INTR_BOTH);
233-
} else {
239+
} else if (obj->mode == IRQ_NONE) {
234240
obj->mode = IRQ_RISE;
235241
Cy_GPIO_SetInterruptEdge(obj->port, obj->pin, CY_GPIO_INTR_RISING);
242+
gpio_irq_enable(obj);
236243
}
237244
} else if (event == IRQ_FALL) {
238245
if (obj->mode == IRQ_RISE) {
239246
obj->mode += IRQ_FALL;
240247
Cy_GPIO_SetInterruptEdge(obj->port, obj->pin, CY_GPIO_INTR_BOTH);
241-
} else {
248+
} else if (obj->mode == IRQ_NONE) {
242249
obj->mode = IRQ_FALL;
243250
Cy_GPIO_SetInterruptEdge(obj->port, obj->pin, CY_GPIO_INTR_FALLING);
251+
gpio_irq_enable(obj);
244252
}
245253
} else {
246254
obj->mode = IRQ_NONE;
255+
gpio_irq_disable(obj);
247256
Cy_GPIO_SetInterruptEdge(obj->port, obj->pin, CY_GPIO_INTR_DISABLE);
248257
}
249258
} else if (obj->mode != IRQ_NONE) {
250259
if (event == IRQ_RISE) {
251260
if (obj->mode == IRQ_RISE) {
252261
obj->mode = IRQ_NONE;
262+
gpio_irq_disable(obj);
253263
Cy_GPIO_SetInterruptEdge(obj->port, obj->pin, CY_GPIO_INTR_DISABLE);
254264
} else {
255265
obj->mode = IRQ_FALL;
@@ -258,6 +268,7 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
258268
} else if (event == IRQ_FALL) {
259269
if (obj->mode == IRQ_FALL) {
260270
obj->mode = IRQ_NONE;
271+
gpio_irq_disable(obj);
261272
Cy_GPIO_SetInterruptEdge(obj->port, obj->pin, CY_GPIO_INTR_DISABLE);
262273
} else {
263274
obj->mode = IRQ_RISE;
@@ -266,6 +277,7 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
266277
} else {
267278
obj->mode = IRQ_NONE;
268279
Cy_GPIO_SetInterruptEdge(obj->port, obj->pin, CY_GPIO_INTR_DISABLE);
280+
gpio_irq_disable(obj);
269281
}
270282
}
271283
}

0 commit comments

Comments
 (0)