@@ -137,49 +137,36 @@ const int sum_ngpios = sum_of_list(
137137 * GPIO callback implementation
138138 */
139139
140- struct arduino_callback {
141- voidFuncPtr handler;
142- bool enabled;
143- };
144-
145140struct gpio_port_callback {
146141 struct gpio_callback callback;
147- struct arduino_callback handlers[max_ngpios];
148- gpio_port_pins_t pins;
149- const struct device *dev;
150- } port_callback[port_num] = {0 };
142+ voidFuncPtr handlers[max_ngpios];
143+ } port_callback[ARRAY_SIZE(gpios)] = { 0 };
151144
152145struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
153146{
154- for (size_t i = 0 ; i < ARRAY_SIZE (port_callback); i++) {
155- if (port_callback[i].dev == dev) {
156- return &port_callback[i];
157- }
158- if (port_callback[i].dev == nullptr ) {
159- port_callback[i].dev = dev;
147+ for (size_t i = 0 ; i < ARRAY_SIZE (gpios); i++) {
148+ if (dev == gpios[i]) {
160149 return &port_callback[i];
161150 }
162151 }
163152
164153 return nullptr ;
165154}
166155
167- void setInterruptHandler (pin_size_t pinNumber, voidFuncPtr func)
168- {
156+ void set_interrupt_handler (pin_size_t pinNumber, voidFuncPtr func) {
169157 struct gpio_port_callback *pcb = find_gpio_port_callback (arduino_pins[pinNumber].port );
170158
171159 if (pcb) {
172- pcb->handlers [arduino_pins[pinNumber].pin ]. handler = func;
160+ pcb->handlers [arduino_pins[pinNumber].pin ] = func;
173161 }
174162}
175163
176- void handleGpioCallback (const struct device *port, struct gpio_callback *cb, uint32_t pins)
177- {
178- struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
164+ void handle_gpio_callback (const struct device *port, struct gpio_callback *cb, uint32_t pins) {
165+ struct gpio_port_callback *pcb = CONTAINER_OF (cb, struct gpio_port_callback , callback);
179166
180167 for (uint32_t i = 0 ; i < max_ngpios; i++) {
181- if (pins & BIT (i) && pcb->handlers [i]. enabled ) {
182- pcb->handlers [i]. handler ();
168+ if (pins & BIT (i) && pcb->handlers [i]) {
169+ pcb->handlers [i]();
183170 }
184171 }
185172}
@@ -466,19 +453,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
466453 pcb = find_gpio_port_callback (arduino_pins[pinNumber].port );
467454 __ASSERT (pcb != nullptr , " gpio_port_callback not found" );
468455
469- pcb->pins |= BIT (arduino_pins[pinNumber].pin );
470- setInterruptHandler (pinNumber, callback);
471- enableInterrupt (pinNumber);
456+ set_interrupt_handler (pinNumber, callback);
472457
458+ if (pcb->callback .handler == NULL ) {
459+ gpio_init_callback (&pcb->callback , handle_gpio_callback, 0 );
460+ gpio_add_callback (arduino_pins[pinNumber].port , &pcb->callback );
461+ }
462+
463+ enableInterrupt (pinNumber);
473464 gpio_pin_interrupt_configure (arduino_pins[pinNumber].port , arduino_pins[pinNumber].pin , intmode);
474- gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
475- gpio_add_callback (arduino_pins[pinNumber].port , &pcb->callback );
476465}
477466
478467void detachInterrupt (pin_size_t pinNumber)
479468{
480- setInterruptHandler ( pinNumber, nullptr );
469+ gpio_pin_interrupt_configure (arduino_pins[ pinNumber]. port , arduino_pins[pinNumber]. pin , 0 );
481470 disableInterrupt (pinNumber);
471+ set_interrupt_handler (pinNumber, nullptr );
482472}
483473
484474#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -539,15 +529,15 @@ void enableInterrupt(pin_size_t pinNumber) {
539529 struct gpio_port_callback *pcb = find_gpio_port_callback (arduino_pins[pinNumber].port );
540530
541531 if (pcb) {
542- pcb->handlers [ arduino_pins[pinNumber].pin ]. enabled = true ;
532+ pcb->callback . pin_mask |= BIT ( arduino_pins[pinNumber].pin ) ;
543533 }
544534}
545535
546536void disableInterrupt (pin_size_t pinNumber) {
547537 struct gpio_port_callback *pcb = find_gpio_port_callback (arduino_pins[pinNumber].port );
548538
549539 if (pcb) {
550- pcb->handlers [ arduino_pins[pinNumber].pin ]. enabled = false ;
540+ pcb->callback . pin_mask &= ~BIT ( arduino_pins[pinNumber].pin) ;
551541 }
552542}
553543
0 commit comments