@@ -128,7 +128,6 @@ const int sum_ngpios = sum_in_list(
128128struct gpio_port_callback {
129129 struct gpio_callback callback;
130130 voidFuncPtr handlers[max_ngpios];
131- uint64_t enabled_pins;
132131 const struct device *dev;
133132} port_callback[ARRAY_SIZE(gpios)] = {0 };
134133
@@ -158,13 +157,11 @@ void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
158157
159158void handleGpioCallback (const struct device *port, struct gpio_callback *cb, uint32_t pins)
160159{
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) ;
162161
163162 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]();
168165 }
169166 }
170167}
@@ -434,13 +431,15 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
434431 pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
435432 __ASSERT (pcb != nullptr , " gpio_port_callback not found" );
436433
437- pcb->pins |= BIT (local_gpio_pin (pinNumber));
438434 setInterruptHandler (pinNumber, callback);
439- enableInterrupt (pinNumber);
440435
441436 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);
444443}
445444
446445void detachInterrupt (pin_size_t pinNumber)
@@ -514,15 +513,15 @@ void enableInterrupt(pin_size_t pinNumber) {
514513 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
515514
516515 if (pcb) {
517- pcb->enabled_pins |= BIT (local_gpio_pin (pinNumber));
516+ pcb->callback . pin_mask |= BIT (local_gpio_pin (pinNumber));
518517 }
519518}
520519
521520void disableInterrupt (pin_size_t pinNumber) {
522521 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
523522
524523 if (pcb) {
525- pcb->enabled_pins &= ~BIT (local_gpio_pin(pinNumber));
524+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber));
526525 }
527526}
528527
0 commit comments