@@ -128,7 +128,6 @@ const int sum_ngpios = sum_in_list(
128
128
struct gpio_port_callback {
129
129
struct gpio_callback callback;
130
130
voidFuncPtr handlers[max_ngpios];
131
- uint64_t enabled_pins;
132
131
const struct device *dev;
133
132
} port_callback[ARRAY_SIZE(gpios)] = {0 };
134
133
@@ -158,13 +157,11 @@ void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
158
157
159
158
void handleGpioCallback (const struct device *port, struct gpio_callback *cb, uint32_t pins)
160
159
{
161
- struct gpio_port_callback *pcb = ( struct gpio_port_callback *)cb ;
160
+ struct gpio_port_callback *pcb = CONTAINER_OF (cb, struct gpio_port_callback , callback) ;
162
161
163
162
for (uint32_t i = 0 ; i < max_ngpios; i++) {
164
- if (pins & BIT (i) && pcb->enabled_pins & BIT (i) {
165
- if (pcb->handlers [i]) {
166
- pcb->handlers [i]();
167
- }
163
+ if (pins & BIT (i) && pcb->handlers [i]) {
164
+ pcb->handlers [i]();
168
165
}
169
166
}
170
167
}
@@ -434,13 +431,15 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
434
431
pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
435
432
__ASSERT (pcb != nullptr , " gpio_port_callback not found" );
436
433
437
- pcb->pins |= BIT (local_gpio_pin (pinNumber));
438
434
setInterruptHandler (pinNumber, callback);
439
- enableInterrupt (pinNumber);
440
435
441
436
gpio_pin_interrupt_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), intmode);
442
- gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
443
- gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
437
+ if (pcb->callback .handler == NULL ) {
438
+ gpio_init_callback (&pcb->callback , handleGpioCallback, 0 );
439
+ gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
440
+ }
441
+
442
+ enableInterrupt (pinNumber);
444
443
}
445
444
446
445
void detachInterrupt (pin_size_t pinNumber)
@@ -514,15 +513,15 @@ void enableInterrupt(pin_size_t pinNumber) {
514
513
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
515
514
516
515
if (pcb) {
517
- pcb->enabled_pins |= BIT (local_gpio_pin (pinNumber));
516
+ pcb->callback . pin_mask |= BIT (local_gpio_pin (pinNumber));
518
517
}
519
518
}
520
519
521
520
void disableInterrupt (pin_size_t pinNumber) {
522
521
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
523
522
524
523
if (pcb) {
525
- pcb->enabled_pins &= ~BIT (local_gpio_pin(pinNumber));
524
+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber));
526
525
}
527
526
}
528
527
0 commit comments