@@ -87,49 +87,36 @@ constexpr int max_ngpios = max_in_list(
87
87
* GPIO callback implementation
88
88
*/
89
89
90
- struct arduino_callback {
91
- voidFuncPtr handler;
92
- bool enabled;
93
- };
94
-
95
90
struct gpio_port_callback {
96
91
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];
100
93
} port_callback[ARRAY_SIZE(gpios)];
101
94
102
95
struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
103
96
{
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]) {
110
99
return &port_callback[i];
111
100
}
112
101
}
113
102
114
103
return nullptr ;
115
104
}
116
105
117
- void setInterruptHandler (pin_size_t pinNumber, voidFuncPtr func)
118
- {
106
+ void set_interrupt_handler (pin_size_t pinNumber, voidFuncPtr func) {
119
107
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
120
108
121
109
if (pcb) {
122
- pcb->handlers [local_gpio_pin (pinNumber)]. handler = func;
110
+ pcb->handlers [local_gpio_pin (pinNumber)] = func;
123
111
}
124
112
}
125
113
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);
129
116
130
117
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]();
133
120
}
134
121
}
135
122
}
@@ -247,8 +234,7 @@ void tone_expiry_cb(struct k_timer *timer) {
247
234
}
248
235
}
249
236
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) {
252
238
struct k_timer *timer;
253
239
k_timeout_t timeout;
254
240
@@ -409,19 +395,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
409
395
pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
410
396
__ASSERT (pcb != nullptr , " gpio_port_callback not found" );
411
397
412
- pcb->pins |= BIT (local_gpio_pin (pinNumber));
413
- setInterruptHandler (pinNumber, callback);
414
- enableInterrupt (pinNumber);
398
+ set_interrupt_handler (pinNumber, callback);
415
399
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);
416
406
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 );
419
407
}
420
408
421
409
void detachInterrupt (pin_size_t pinNumber)
422
410
{
423
- setInterruptHandler ( pinNumber, nullptr );
411
+ gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber), 0 );
424
412
disableInterrupt (pinNumber);
413
+ set_interrupt_handler (pinNumber, nullptr );
425
414
}
426
415
427
416
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -483,15 +472,15 @@ void enableInterrupt(pin_size_t pinNumber) {
483
472
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
484
473
485
474
if (pcb) {
486
- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
475
+ pcb->callback . pin_mask |= BIT ( local_gpio_pin (pinNumber)) ;
487
476
}
488
477
}
489
478
490
479
void disableInterrupt (pin_size_t pinNumber) {
491
480
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
492
481
493
482
if (pcb) {
494
- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
483
+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber)) ;
495
484
}
496
485
}
497
486
0 commit comments