@@ -67,6 +67,13 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
67
67
return -1 ;
68
68
}
69
69
70
+ obj -> pin = pin & 0x1F ;
71
+ obj -> port = pin / 32 ;
72
+
73
+ if (obj -> port >= INTERRUPT_PORTS ) {
74
+ return -1 ;
75
+ }
76
+
70
77
irq_handler = handler ;
71
78
72
79
for (i = 0 ; i < NUMBER_OF_GPIO_INTS ; i ++ ) {
@@ -82,13 +89,6 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
82
89
return -1 ;
83
90
}
84
91
85
- obj -> pin = pin & 0x1F ;
86
- obj -> port = pin / 32 ;
87
-
88
- if (obj -> port >= INTERRUPT_PORTS ) {
89
- return -1 ;
90
- }
91
-
92
92
/* Connect trigger sources to PINT */
93
93
INPUTMUX_Init (INPUTMUX );
94
94
@@ -139,7 +139,26 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
139
139
}
140
140
}
141
141
} else {
142
- PINT_PinInterruptConfig (PINT , (pint_pin_int_t )obj -> ch , kPINT_PinIntEnableNone , NULL );
142
+ if (event == IRQ_RISE ) {
143
+ /* Checking if falling edge interrupt is already enabled on this pin */
144
+ if (PINT -> IENF & (1U << obj -> ch )) {
145
+ /* Leave falling edge interrupt enabled */
146
+ PINT_PinInterruptConfig (PINT , (pint_pin_int_t )obj -> ch , kPINT_PinIntEnableFallEdge , pint_intr_callback );
147
+ } else {
148
+ /* Both rising and falling edge interrupt are disabled */
149
+ PINT_PinInterruptConfig (PINT , (pint_pin_int_t )obj -> ch , kPINT_PinIntEnableNone , pint_intr_callback );
150
+ }
151
+ } else {
152
+ /* Checking if rising edge interrupt is already enabled on this pin */
153
+ if (PINT -> IENR & (1U << obj -> ch )) {
154
+ /* Leave rising edge interrupt enabled */
155
+ PINT_PinInterruptConfig (PINT , (pint_pin_int_t )obj -> ch , kPINT_PinIntEnableRiseEdge , pint_intr_callback );
156
+ } else {
157
+ /* Both rising and falling edge interrupt are disabled */
158
+ PINT_PinInterruptConfig (PINT , (pint_pin_int_t )obj -> ch , kPINT_PinIntEnableNone , pint_intr_callback );
159
+ }
160
+ }
161
+
143
162
}
144
163
}
145
164
0 commit comments