@@ -137,49 +137,36 @@ const int sum_ngpios = sum_of_list(
137
137
* GPIO callback implementation
138
138
*/
139
139
140
- struct arduino_callback {
141
- voidFuncPtr handler;
142
- bool enabled;
143
- };
144
-
145
140
struct gpio_port_callback {
146
141
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 };
151
144
152
145
struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
153
146
{
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]) {
160
149
return &port_callback[i];
161
150
}
162
151
}
163
152
164
153
return nullptr ;
165
154
}
166
155
167
- void setInterruptHandler (pin_size_t pinNumber, voidFuncPtr func)
168
- {
156
+ void set_interrupt_handler (pin_size_t pinNumber, voidFuncPtr func) {
169
157
struct gpio_port_callback *pcb = find_gpio_port_callback (arduino_pins[pinNumber].port );
170
158
171
159
if (pcb) {
172
- pcb->handlers [arduino_pins[pinNumber].pin ]. handler = func;
160
+ pcb->handlers [arduino_pins[pinNumber].pin ] = func;
173
161
}
174
162
}
175
163
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);
179
166
180
167
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]();
183
170
}
184
171
}
185
172
}
@@ -466,19 +453,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
466
453
pcb = find_gpio_port_callback (arduino_pins[pinNumber].port );
467
454
__ASSERT (pcb != nullptr , " gpio_port_callback not found" );
468
455
469
- pcb->pins |= BIT (arduino_pins[pinNumber].pin );
470
- setInterruptHandler (pinNumber, callback);
471
- enableInterrupt (pinNumber);
456
+ set_interrupt_handler (pinNumber, callback);
472
457
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);
473
464
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 );
476
465
}
477
466
478
467
void detachInterrupt (pin_size_t pinNumber)
479
468
{
480
- setInterruptHandler ( pinNumber, nullptr );
469
+ gpio_pin_interrupt_configure (arduino_pins[ pinNumber]. port , arduino_pins[pinNumber]. pin , 0 );
481
470
disableInterrupt (pinNumber);
471
+ set_interrupt_handler (pinNumber, nullptr );
482
472
}
483
473
484
474
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -539,15 +529,15 @@ void enableInterrupt(pin_size_t pinNumber) {
539
529
struct gpio_port_callback *pcb = find_gpio_port_callback (arduino_pins[pinNumber].port );
540
530
541
531
if (pcb) {
542
- pcb->handlers [ arduino_pins[pinNumber].pin ]. enabled = true ;
532
+ pcb->callback . pin_mask |= BIT ( arduino_pins[pinNumber].pin ) ;
543
533
}
544
534
}
545
535
546
536
void disableInterrupt (pin_size_t pinNumber) {
547
537
struct gpio_port_callback *pcb = find_gpio_port_callback (arduino_pins[pinNumber].port );
548
538
549
539
if (pcb) {
550
- pcb->handlers [ arduino_pins[pinNumber].pin ]. enabled = false ;
540
+ pcb->callback . pin_mask &= ~BIT ( arduino_pins[pinNumber].pin) ;
551
541
}
552
542
}
553
543
0 commit comments