@@ -100,49 +100,36 @@ constexpr int sum_ngpios = sum_of_list(
100100 * GPIO callback implementation
101101 */
102102
103- struct arduino_callback {
104- voidFuncPtr handler;
105- bool enabled;
106- };
107-
108103struct gpio_port_callback {
109104 struct gpio_callback callback;
110- struct arduino_callback handlers[max_ngpios];
111- gpio_port_pins_t pins;
112- const struct device *dev;
113- } port_callback[ARRAY_SIZE(gpios)] = {0 };
105+ voidFuncPtr handlers[max_ngpios];
106+ } port_callback[ARRAY_SIZE(gpios)] = { 0 };
114107
115108struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
116109{
117- for (size_t i = 0 ; i < ARRAY_SIZE (port_callback); i++) {
118- if (port_callback[i].dev == dev) {
119- return &port_callback[i];
120- }
121- if (port_callback[i].dev == nullptr ) {
122- port_callback[i].dev = dev;
110+ for (size_t i = 0 ; i < ARRAY_SIZE (gpios); i++) {
111+ if (dev == gpios[i]) {
123112 return &port_callback[i];
124113 }
125114 }
126115
127116 return nullptr ;
128117}
129118
130- void setInterruptHandler (pin_size_t pinNumber, voidFuncPtr func)
131- {
119+ void set_interrupt_handler (pin_size_t pinNumber, voidFuncPtr func) {
132120 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
133121
134122 if (pcb) {
135- pcb->handlers [local_gpio_pin (pinNumber)]. handler = func;
123+ pcb->handlers [local_gpio_pin (pinNumber)] = func;
136124 }
137125}
138126
139- void handleGpioCallback (const struct device *port, struct gpio_callback *cb, uint32_t pins)
140- {
141- struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
127+ void handle_gpio_callback (const struct device *port, struct gpio_callback *cb, uint32_t pins) {
128+ struct gpio_port_callback *pcb = CONTAINER_OF (cb, struct gpio_port_callback , callback);
142129
143130 for (uint32_t i = 0 ; i < max_ngpios; i++) {
144- if (pins & BIT (i) && pcb->handlers [i]. enabled ) {
145- pcb->handlers [i]. handler ();
131+ if (pins & BIT (i) && pcb->handlers [i]) {
132+ pcb->handlers [i]();
146133 }
147134 }
148135}
@@ -257,8 +244,7 @@ void tone_expiry_cb(struct k_timer *timer) {
257244 }
258245}
259246
260- void tone (pin_size_t pinNumber, unsigned int frequency,
261- unsigned long duration) {
247+ void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
262248 struct k_timer *timer = &arduino_pin_timers[pinNumber].timer ;
263249 k_timeout_t timeout;
264250 uint32_t count;
@@ -418,19 +404,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
418404 pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
419405 __ASSERT (pcb != nullptr , " gpio_port_callback not found" );
420406
421- pcb->pins |= BIT (local_gpio_pin (pinNumber));
422- setInterruptHandler (pinNumber, callback);
423- enableInterrupt (pinNumber);
407+ set_interrupt_handler (pinNumber, callback);
424408
409+ if (pcb->callback .handler == NULL ) {
410+ gpio_init_callback (&pcb->callback , handle_gpio_callback, 0 );
411+ gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
412+ }
413+
414+ enableInterrupt (pinNumber);
425415 gpio_pin_interrupt_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), intmode);
426- gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
427- gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
428416}
429417
430418void detachInterrupt (pin_size_t pinNumber)
431419{
432- setInterruptHandler ( pinNumber, nullptr );
420+ gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber), 0 );
433421 disableInterrupt (pinNumber);
422+ set_interrupt_handler (pinNumber, nullptr );
434423}
435424
436425#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -492,15 +481,15 @@ void enableInterrupt(pin_size_t pinNumber) {
492481 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
493482
494483 if (pcb) {
495- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
484+ pcb->callback . pin_mask |= BIT ( local_gpio_pin (pinNumber)) ;
496485 }
497486}
498487
499488void disableInterrupt (pin_size_t pinNumber) {
500489 struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
501490
502491 if (pcb) {
503- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
492+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber)) ;
504493 }
505494}
506495
0 commit comments