@@ -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
213218void 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