@@ -143,49 +143,36 @@ constexpr int max_ngpios = max_in_list(
143
143
* GPIO callback implementation
144
144
*/
145
145
146
- struct arduino_callback {
147
- voidFuncPtr handler;
148
- bool enabled;
149
- };
150
-
151
146
struct gpio_port_callback {
152
147
struct gpio_callback callback;
153
- struct arduino_callback handlers[max_ngpios];
154
- gpio_port_pins_t pins;
155
- const struct device *dev;
156
- } port_callback[ARRAY_SIZE(gpios)] = {0 };
148
+ voidFuncPtr handlers[max_ngpios];
149
+ } port_callback[ARRAY_SIZE(gpios)] = { 0 };
157
150
158
151
struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
159
152
{
160
- for (size_t i = 0 ; i < ARRAY_SIZE (port_callback); i++) {
161
- if (port_callback[i].dev == dev) {
162
- return &port_callback[i];
163
- }
164
- if (port_callback[i].dev == nullptr ) {
165
- port_callback[i].dev = dev;
153
+ for (size_t i = 0 ; i < ARRAY_SIZE (gpios); i++) {
154
+ if (dev == gpios[i]) {
166
155
return &port_callback[i];
167
156
}
168
157
}
169
158
170
159
return nullptr ;
171
160
}
172
161
173
- void setInterruptHandler (pin_size_t pinNumber, voidFuncPtr func)
174
- {
162
+ void set_interrupt_handler (pin_size_t pinNumber, voidFuncPtr func) {
175
163
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
176
164
177
165
if (pcb) {
178
- pcb->handlers [local_gpio_pin (pinNumber)]. handler = func;
166
+ pcb->handlers [local_gpio_pin (pinNumber)] = func;
179
167
}
180
168
}
181
169
182
- void handleGpioCallback (const struct device *port, struct gpio_callback *cb, uint32_t pins)
183
- {
184
- struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
170
+ void handle_gpio_callback (const struct device *port, struct gpio_callback *cb, uint32_t pins) {
171
+ struct gpio_port_callback *pcb = CONTAINER_OF (cb, struct gpio_port_callback , callback);
185
172
186
173
for (uint32_t i = 0 ; i < max_ngpios; i++) {
187
- if (pins & BIT (i) && pcb->handlers [i]. enabled ) {
188
- pcb->handlers [i]. handler ();
174
+ if (pins & BIT (i) && pcb->handlers [i]) {
175
+ pcb->handlers [i]();
189
176
}
190
177
}
191
178
}
@@ -300,8 +287,7 @@ void tone_expiry_cb(struct k_timer *timer) {
300
287
}
301
288
}
302
289
303
- void tone (pin_size_t pinNumber, unsigned int frequency,
304
- unsigned long duration) {
290
+ void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
305
291
struct k_timer *timer = &arduino_pin_timers[pinNumber].timer ;
306
292
k_timeout_t timeout;
307
293
uint32_t count;
@@ -461,19 +447,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
461
447
pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
462
448
__ASSERT (pcb != nullptr , " gpio_port_callback not found" );
463
449
464
- pcb->pins |= BIT (local_gpio_pin (pinNumber));
465
- setInterruptHandler (pinNumber, callback);
466
- enableInterrupt (pinNumber);
450
+ set_interrupt_handler (pinNumber, callback);
467
451
452
+ if (pcb->callback .handler == NULL ) {
453
+ gpio_init_callback (&pcb->callback , handle_gpio_callback, 0 );
454
+ gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
455
+ }
456
+
457
+ enableInterrupt (pinNumber);
468
458
gpio_pin_interrupt_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), intmode);
469
- gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
470
- gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
471
459
}
472
460
473
461
void detachInterrupt (pin_size_t pinNumber)
474
462
{
475
- setInterruptHandler ( pinNumber, nullptr );
463
+ gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber), 0 );
476
464
disableInterrupt (pinNumber);
465
+ set_interrupt_handler (pinNumber, nullptr );
477
466
}
478
467
479
468
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -535,15 +524,15 @@ void enableInterrupt(pin_size_t pinNumber) {
535
524
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
536
525
537
526
if (pcb) {
538
- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = true ;
527
+ pcb->callback . pin_mask |= BIT ( local_gpio_pin (pinNumber)) ;
539
528
}
540
529
}
541
530
542
531
void disableInterrupt (pin_size_t pinNumber) {
543
532
struct gpio_port_callback *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
544
533
545
534
if (pcb) {
546
- pcb->handlers [ local_gpio_pin (pinNumber)]. enabled = false ;
535
+ pcb->callback . pin_mask &= ~BIT (local_gpio_pin(pinNumber)) ;
547
536
}
548
537
}
549
538
0 commit comments