@@ -87,49 +87,36 @@ constexpr int max_ngpios = max_in_list(
8787 * GPIO callback implementation
8888 */
8989
90- struct arduino_callback {
91- voidFuncPtr handler;
92- bool enabled;
93- };
94-
9590struct gpio_port_callback {
9691 struct gpio_callback callback;
97- struct arduino_callback handlers[max_ngpios];
98- gpio_port_pins_t pins;
99- const struct device *dev;
100- } port_callback[ARRAY_SIZE(gpios)] = {0 };
92+ voidFuncPtr handlers[max_ngpios];
93+ } port_callback[ARRAY_SIZE(gpios)] = { 0 };
10194
10295struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
10396{
104- for (size_t i = 0 ; i < ARRAY_SIZE (port_callback); i++) {
105- if (port_callback[i].dev == dev) {
106- return &port_callback[i];
107- }
108- if (port_callback[i].dev == nullptr ) {
109- port_callback[i].dev = dev;
97+ for (size_t i = 0 ; i < ARRAY_SIZE (gpios); i++) {
98+ if (dev == gpios[i]) {
11099 return &port_callback[i];
111100 }
112101 }
113102
114103 return nullptr ;
115104}
116105
117- void setInterruptHandler (pin_size_t pinNumber, voidFuncPtr func)
118- {
106+ void set_interrupt_handler (pin_size_t pinNumber, voidFuncPtr func) {
119107 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
120108
121109 if (pcb) {
122- pcb->handlers [local_gpio_pin (pinNumber)]. handler = func;
110+ pcb->handlers [local_gpio_pin (pinNumber)] = func;
123111 }
124112}
125113
126- void handleGpioCallback (const struct device *port, struct gpio_callback *cb, uint32_t pins)
127- {
128- struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
114+ void handle_gpio_callback (const struct device *port, struct gpio_callback *cb, uint32_t pins) {
115+ struct gpio_port_callback *pcb = CONTAINER_OF (cb, struct gpio_port_callback , callback);
129116
130117 for (uint32_t i = 0 ; i < max_ngpios; i++) {
131- if (pins & BIT (i) && pcb->handlers [i]. enabled ) {
132- pcb->handlers [i]. handler ();
118+ if (pins & BIT (i) && pcb->handlers [i]) {
119+ pcb->handlers [i]();
133120 }
134121 }
135122}
@@ -244,8 +231,7 @@ void tone_expiry_cb(struct k_timer *timer) {
244231 }
245232}
246233
247- void tone (pin_size_t pinNumber, unsigned int frequency,
248- unsigned long duration) {
234+ void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
249235 struct k_timer *timer = &arduino_pin_timers[pinNumber].timer ;
250236 k_timeout_t timeout;
251237 uint32_t count;
@@ -405,19 +391,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
405391 pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
406392 __ASSERT (pcb != nullptr , " gpio_port_callback not found" );
407393
408- pcb->pins |= BIT (local_gpio_pin (pinNumber));
409- setInterruptHandler (pinNumber, callback);
410- enableInterrupt (pinNumber);
394+ set_interrupt_handler (pinNumber, callback);
411395
396+ if (pcb->callback .handler == NULL ) {
397+ gpio_init_callback (&pcb->callback , handle_gpio_callback, 0 );
398+ gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
399+ }
400+
401+ enableInterrupt (pinNumber);
412402 gpio_pin_interrupt_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), intmode);
413- gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
414- gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
415403}
416404
417405void detachInterrupt (pin_size_t pinNumber)
418406{
419- setInterruptHandler ( pinNumber, nullptr );
407+ gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber), 0 );
420408 disableInterrupt (pinNumber);
409+ set_interrupt_handler (pinNumber, nullptr );
421410}
422411
423412#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -479,15 +468,15 @@ void enableInterrupt(pin_size_t pinNumber) {
479468 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
480469
481470 if (pcb) {
482- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
471+ pcb->callback . pin_mask |= BIT ( local_gpio_pin (pinNumber)) ;
483472 }
484473}
485474
486475void disableInterrupt (pin_size_t pinNumber) {
487476 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
488477
489478 if (pcb) {
490- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
479+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber)) ;
491480 }
492481}
493482
0 commit comments