@@ -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;
92+ voidFuncPtr handlers[max_ngpios];
10093} port_callback[ARRAY_SIZE(gpios)];
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}
@@ -247,8 +234,7 @@ void tone_expiry_cb(struct k_timer *timer) {
247234 }
248235}
249236
250- void tone (pin_size_t pinNumber, unsigned int frequency,
251- unsigned long duration) {
237+ void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
252238 struct k_timer *timer;
253239 k_timeout_t timeout;
254240
@@ -409,19 +395,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
409395 pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
410396 __ASSERT (pcb != nullptr , " gpio_port_callback not found" );
411397
412- pcb->pins |= BIT (local_gpio_pin (pinNumber));
413- setInterruptHandler (pinNumber, callback);
414- enableInterrupt (pinNumber);
398+ set_interrupt_handler (pinNumber, callback);
415399
400+ if (pcb->callback .handler == NULL ) {
401+ gpio_init_callback (&pcb->callback , handle_gpio_callback, 0 );
402+ gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
403+ }
404+
405+ enableInterrupt (pinNumber);
416406 gpio_pin_interrupt_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), intmode);
417- gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
418- gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
419407}
420408
421409void detachInterrupt (pin_size_t pinNumber)
422410{
423- setInterruptHandler ( pinNumber, nullptr );
411+ gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber), 0 );
424412 disableInterrupt (pinNumber);
413+ set_interrupt_handler (pinNumber, nullptr );
425414}
426415
427416#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -483,15 +472,15 @@ void enableInterrupt(pin_size_t pinNumber) {
483472 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
484473
485474 if (pcb) {
486- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
475+ pcb->callback . pin_mask |= BIT ( local_gpio_pin (pinNumber)) ;
487476 }
488477}
489478
490479void disableInterrupt (pin_size_t pinNumber) {
491480 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
492481
493482 if (pcb) {
494- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
483+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber)) ;
495484 }
496485}
497486
0 commit comments