@@ -125,15 +125,10 @@ const int sum_ngpios = sum_in_list(
125125 * GPIO callback implementation
126126 */
127127
128- struct arduino_callback {
129- voidFuncPtr handler;
130- bool enabled;
131- };
132-
133128struct gpio_port_callback {
134129 struct gpio_callback callback;
135- struct arduino_callback handlers[max_ngpios];
136- gpio_port_pins_t pins ;
130+ voidFuncPtr handlers[max_ngpios];
131+ uint64_t enabled_pins ;
137132 const struct device *dev;
138133} port_callback[ARRAY_SIZE(gpios)] = {0 };
139134
@@ -157,7 +152,7 @@ void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
157152 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
158153
159154 if (pcb) {
160- pcb->handlers [local_gpio_pin (pinNumber)]. handler = func;
155+ pcb->handlers [local_gpio_pin (pinNumber)] = func;
161156 }
162157}
163158
@@ -166,8 +161,10 @@ void handleGpioCallback(const struct device *port, struct gpio_callback *cb, uin
166161 struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
167162
168163 for (uint32_t i = 0 ; i < max_ngpios; i++) {
169- if (pins & BIT (i) && pcb->handlers [i].enabled ) {
170- pcb->handlers [i].handler ();
164+ if (pins & BIT (i) && pcb->enabled_pins & BIT (i) {
165+ if (pcb->handlers [i]) {
166+ pcb->handlers [i]();
167+ }
171168 }
172169 }
173170}
@@ -517,15 +514,15 @@ void enableInterrupt(pin_size_t pinNumber) {
517514 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
518515
519516 if (pcb) {
520- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
517+ pcb->enabled_pins |= BIT ( local_gpio_pin (pinNumber)) ;
521518 }
522519}
523520
524521void disableInterrupt (pin_size_t pinNumber) {
525522 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
526523
527524 if (pcb) {
528- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
525+ pcb->enabled_pins &= ~BIT ( local_gpio_pin(pinNumber)) ;
529526 }
530527}
531528
0 commit comments