@@ -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;
100
- } port_callback[ARRAY_SIZE(gpios)] = {0 };
92
+ voidFuncPtr handlers[max_ngpios];
93
+ } port_callback[ARRAY_SIZE(gpios)] = { 0 };
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
}
@@ -244,8 +231,7 @@ void tone_expiry_cb(struct k_timer *timer) {
244
231
}
245
232
}
246
233
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) {
249
235
struct k_timer *timer = &arduino_pin_timers[pinNumber].timer ;
250
236
k_timeout_t timeout;
251
237
uint32_t count;
@@ -405,19 +391,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
405
391
pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
406
392
__ASSERT (pcb != nullptr , " gpio_port_callback not found" );
407
393
408
- pcb->pins |= BIT (local_gpio_pin (pinNumber));
409
- setInterruptHandler (pinNumber, callback);
410
- enableInterrupt (pinNumber);
394
+ set_interrupt_handler (pinNumber, callback);
411
395
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);
412
402
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 );
415
403
}
416
404
417
405
void detachInterrupt (pin_size_t pinNumber)
418
406
{
419
- setInterruptHandler ( pinNumber, nullptr );
407
+ gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber), 0 );
420
408
disableInterrupt (pinNumber);
409
+ set_interrupt_handler (pinNumber, nullptr );
421
410
}
422
411
423
412
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -479,15 +468,15 @@ void enableInterrupt(pin_size_t pinNumber) {
479
468
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
480
469
481
470
if (pcb) {
482
- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
471
+ pcb->callback . pin_mask |= BIT ( local_gpio_pin (pinNumber)) ;
483
472
}
484
473
}
485
474
486
475
void disableInterrupt (pin_size_t pinNumber) {
487
476
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
488
477
489
478
if (pcb) {
490
- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
479
+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber)) ;
491
480
}
492
481
}
493
482
0 commit comments