@@ -100,49 +100,36 @@ constexpr int sum_ngpios = sum_of_list(
100
100
* GPIO callback implementation
101
101
*/
102
102
103
- struct arduino_callback {
104
- voidFuncPtr handler;
105
- bool enabled;
106
- };
107
-
108
103
struct gpio_port_callback {
109
104
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 };
114
107
115
108
struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
116
109
{
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]) {
123
112
return &port_callback[i];
124
113
}
125
114
}
126
115
127
116
return nullptr ;
128
117
}
129
118
130
- void setInterruptHandler (pin_size_t pinNumber, voidFuncPtr func)
131
- {
119
+ void set_interrupt_handler (pin_size_t pinNumber, voidFuncPtr func) {
132
120
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
133
121
134
122
if (pcb) {
135
- pcb->handlers [local_gpio_pin (pinNumber)]. handler = func;
123
+ pcb->handlers [local_gpio_pin (pinNumber)] = func;
136
124
}
137
125
}
138
126
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);
142
129
143
130
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]();
146
133
}
147
134
}
148
135
}
@@ -257,8 +244,7 @@ void tone_expiry_cb(struct k_timer *timer) {
257
244
}
258
245
}
259
246
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) {
262
248
struct k_timer *timer = &arduino_pin_timers[pinNumber].timer ;
263
249
k_timeout_t timeout;
264
250
uint32_t count;
@@ -418,19 +404,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
418
404
pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
419
405
__ASSERT (pcb != nullptr , " gpio_port_callback not found" );
420
406
421
- pcb->pins |= BIT (local_gpio_pin (pinNumber));
422
- setInterruptHandler (pinNumber, callback);
423
- enableInterrupt (pinNumber);
407
+ set_interrupt_handler (pinNumber, callback);
424
408
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);
425
415
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 );
428
416
}
429
417
430
418
void detachInterrupt (pin_size_t pinNumber)
431
419
{
432
- setInterruptHandler ( pinNumber, nullptr );
420
+ gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber), 0 );
433
421
disableInterrupt (pinNumber);
422
+ set_interrupt_handler (pinNumber, nullptr );
434
423
}
435
424
436
425
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -492,15 +481,15 @@ void enableInterrupt(pin_size_t pinNumber) {
492
481
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
493
482
494
483
if (pcb) {
495
- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
484
+ pcb->callback . pin_mask |= BIT ( local_gpio_pin (pinNumber)) ;
496
485
}
497
486
}
498
487
499
488
void disableInterrupt (pin_size_t pinNumber) {
500
489
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
501
490
502
491
if (pcb) {
503
- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
492
+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber)) ;
504
493
}
505
494
}
506
495
0 commit comments