@@ -202,12 +202,17 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
202
202
MBED_ASSERT ("Invalid pin ID!" );
203
203
return (-1 );
204
204
}
205
- obj -> handler = (uint32_t ) handler ;
205
+ obj -> handler = (uint32_t )handler ;
206
206
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
+ }
208
212
} else {
209
213
return (-1 );
210
214
}
215
+ return 0 ;
211
216
}
212
217
213
218
void gpio_irq_free (gpio_irq_t * obj )
@@ -218,6 +223,7 @@ void gpio_irq_free(gpio_irq_t *obj)
218
223
irq_port_usage [obj -> port_id ].pin_mask &= ~(1 << obj -> pin );
219
224
if (irq_port_usage [obj -> port_id ].pin_mask == 0 ) {
220
225
gpio_irq_release_channel (irq_port_usage [obj -> port_id ].irqn , obj -> port_id );
226
+ irq_objects [obj -> port_id ][obj -> pin ] = NULL ;
221
227
return ;
222
228
}
223
229
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)
230
236
if (obj -> mode == IRQ_FALL ) {
231
237
obj -> mode += IRQ_RISE ;
232
238
Cy_GPIO_SetInterruptEdge (obj -> port , obj -> pin , CY_GPIO_INTR_BOTH );
233
- } else {
239
+ } else if ( obj -> mode == IRQ_NONE ) {
234
240
obj -> mode = IRQ_RISE ;
235
241
Cy_GPIO_SetInterruptEdge (obj -> port , obj -> pin , CY_GPIO_INTR_RISING );
242
+ gpio_irq_enable (obj );
236
243
}
237
244
} else if (event == IRQ_FALL ) {
238
245
if (obj -> mode == IRQ_RISE ) {
239
246
obj -> mode += IRQ_FALL ;
240
247
Cy_GPIO_SetInterruptEdge (obj -> port , obj -> pin , CY_GPIO_INTR_BOTH );
241
- } else {
248
+ } else if ( obj -> mode == IRQ_NONE ) {
242
249
obj -> mode = IRQ_FALL ;
243
250
Cy_GPIO_SetInterruptEdge (obj -> port , obj -> pin , CY_GPIO_INTR_FALLING );
251
+ gpio_irq_enable (obj );
244
252
}
245
253
} else {
246
254
obj -> mode = IRQ_NONE ;
255
+ gpio_irq_disable (obj );
247
256
Cy_GPIO_SetInterruptEdge (obj -> port , obj -> pin , CY_GPIO_INTR_DISABLE );
248
257
}
249
258
} else if (obj -> mode != IRQ_NONE ) {
250
259
if (event == IRQ_RISE ) {
251
260
if (obj -> mode == IRQ_RISE ) {
252
261
obj -> mode = IRQ_NONE ;
262
+ gpio_irq_disable (obj );
253
263
Cy_GPIO_SetInterruptEdge (obj -> port , obj -> pin , CY_GPIO_INTR_DISABLE );
254
264
} else {
255
265
obj -> mode = IRQ_FALL ;
@@ -258,6 +268,7 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
258
268
} else if (event == IRQ_FALL ) {
259
269
if (obj -> mode == IRQ_FALL ) {
260
270
obj -> mode = IRQ_NONE ;
271
+ gpio_irq_disable (obj );
261
272
Cy_GPIO_SetInterruptEdge (obj -> port , obj -> pin , CY_GPIO_INTR_DISABLE );
262
273
} else {
263
274
obj -> mode = IRQ_RISE ;
@@ -266,6 +277,7 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
266
277
} else {
267
278
obj -> mode = IRQ_NONE ;
268
279
Cy_GPIO_SetInterruptEdge (obj -> port , obj -> pin , CY_GPIO_INTR_DISABLE );
280
+ gpio_irq_disable (obj );
269
281
}
270
282
}
271
283
}
0 commit comments