@@ -143,49 +143,36 @@ constexpr int max_ngpios = max_in_list(
143143 * GPIO callback implementation
144144 */
145145
146- struct arduino_callback {
147- voidFuncPtr handler;
148- bool enabled;
149- };
150-
151146struct gpio_port_callback {
152147 struct gpio_callback callback;
153- struct arduino_callback handlers[max_ngpios];
154- gpio_port_pins_t pins;
155- const struct device *dev;
156- } port_callback[ARRAY_SIZE(gpios)] = {0 };
148+ voidFuncPtr handlers[max_ngpios];
149+ } port_callback[ARRAY_SIZE(gpios)] = { 0 };
157150
158151struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
159152{
160- for (size_t i = 0 ; i < ARRAY_SIZE (port_callback); i++) {
161- if (port_callback[i].dev == dev) {
162- return &port_callback[i];
163- }
164- if (port_callback[i].dev == nullptr ) {
165- port_callback[i].dev = dev;
153+ for (size_t i = 0 ; i < ARRAY_SIZE (gpios); i++) {
154+ if (dev == gpios[i]) {
166155 return &port_callback[i];
167156 }
168157 }
169158
170159 return nullptr ;
171160}
172161
173- void setInterruptHandler (pin_size_t pinNumber, voidFuncPtr func)
174- {
162+ void set_interrupt_handler (pin_size_t pinNumber, voidFuncPtr func) {
175163 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
176164
177165 if (pcb) {
178- pcb->handlers [local_gpio_pin (pinNumber)]. handler = func;
166+ pcb->handlers [local_gpio_pin (pinNumber)] = func;
179167 }
180168}
181169
182- void handleGpioCallback (const struct device *port, struct gpio_callback *cb, uint32_t pins)
183- {
184- struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
170+ void handle_gpio_callback (const struct device *port, struct gpio_callback *cb, uint32_t pins) {
171+ struct gpio_port_callback *pcb = CONTAINER_OF (cb, struct gpio_port_callback , callback);
185172
186173 for (uint32_t i = 0 ; i < max_ngpios; i++) {
187- if (pins & BIT (i) && pcb->handlers [i]. enabled ) {
188- pcb->handlers [i]. handler ();
174+ if (pins & BIT (i) && pcb->handlers [i]) {
175+ pcb->handlers [i]();
189176 }
190177 }
191178}
@@ -300,8 +287,7 @@ void tone_expiry_cb(struct k_timer *timer) {
300287 }
301288}
302289
303- void tone (pin_size_t pinNumber, unsigned int frequency,
304- unsigned long duration) {
290+ void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
305291 struct k_timer *timer = &arduino_pin_timers[pinNumber].timer ;
306292 k_timeout_t timeout;
307293 uint32_t count;
@@ -461,19 +447,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
461447 pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
462448 __ASSERT (pcb != nullptr , " gpio_port_callback not found" );
463449
464- pcb->pins |= BIT (local_gpio_pin (pinNumber));
465- setInterruptHandler (pinNumber, callback);
466- enableInterrupt (pinNumber);
450+ set_interrupt_handler (pinNumber, callback);
467451
452+ if (pcb->callback .handler == NULL ) {
453+ gpio_init_callback (&pcb->callback , handle_gpio_callback, 0 );
454+ gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
455+ }
456+
457+ enableInterrupt (pinNumber);
468458 gpio_pin_interrupt_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), intmode);
469- gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
470- gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
471459}
472460
473461void detachInterrupt (pin_size_t pinNumber)
474462{
475- setInterruptHandler ( pinNumber, nullptr );
463+ gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber), 0 );
476464 disableInterrupt (pinNumber);
465+ set_interrupt_handler (pinNumber, nullptr );
477466}
478467
479468#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -535,15 +524,15 @@ void enableInterrupt(pin_size_t pinNumber) {
535524 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
536525
537526 if (pcb) {
538- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
527+ pcb->callback . pin_mask |= BIT ( local_gpio_pin (pinNumber)) ;
539528 }
540529}
541530
542531void disableInterrupt (pin_size_t pinNumber) {
543532 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
544533
545534 if (pcb) {
546- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
535+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber)) ;
547536 }
548537}
549538
0 commit comments