Skip to content

Commit 5abce4e

Browse files
committed
interrupt
1 parent bbdb8f2 commit 5abce4e

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

cores/arduino/zephyrCommon.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ const int sum_ngpios = sum_in_list(
128128
struct gpio_port_callback {
129129
struct gpio_callback callback;
130130
voidFuncPtr handlers[max_ngpios];
131-
uint64_t enabled_pins;
132131
const struct device *dev;
133132
} port_callback[ARRAY_SIZE(gpios)] = {0};
134133

@@ -158,13 +157,11 @@ void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
158157

159158
void handleGpioCallback(const struct device *port, struct gpio_callback *cb, uint32_t pins)
160159
{
161-
struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
160+
struct gpio_port_callback *pcb = CONTAINER_OF(cb, struct gpio_port_callback, callback);
162161

163162
for (uint32_t i = 0; i < max_ngpios; i++) {
164-
if (pins & BIT(i) && pcb->enabled_pins & BIT(i) {
165-
if (pcb->handlers[i]) {
166-
pcb->handlers[i]();
167-
}
163+
if (pins & BIT(i) && pcb->handlers[i]) {
164+
pcb->handlers[i]();
168165
}
169166
}
170167
}
@@ -434,13 +431,15 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
434431
pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
435432
__ASSERT(pcb != nullptr, "gpio_port_callback not found");
436433

437-
pcb->pins |= BIT(local_gpio_pin(pinNumber));
438434
setInterruptHandler(pinNumber, callback);
439-
enableInterrupt(pinNumber);
440435

441436
gpio_pin_interrupt_configure(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), intmode);
442-
gpio_init_callback(&pcb->callback, handleGpioCallback, pcb->pins);
443-
gpio_add_callback(local_gpio_port(pinNumber), &pcb->callback);
437+
if (pcb->callback.handler == NULL) {
438+
gpio_init_callback(&pcb->callback, handleGpioCallback, 0);
439+
gpio_add_callback(local_gpio_port(pinNumber), &pcb->callback);
440+
}
441+
442+
enableInterrupt(pinNumber);
444443
}
445444

446445
void detachInterrupt(pin_size_t pinNumber)
@@ -514,15 +513,15 @@ void enableInterrupt(pin_size_t pinNumber) {
514513
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
515514

516515
if (pcb) {
517-
pcb->enabled_pins |= BIT(local_gpio_pin(pinNumber));
516+
pcb->callback.pin_mask |= BIT(local_gpio_pin(pinNumber));
518517
}
519518
}
520519

521520
void disableInterrupt(pin_size_t pinNumber) {
522521
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
523522

524523
if (pcb) {
525-
pcb->enabled_pins &= ~BIT(local_gpio_pin(pinNumber));
524+
pcb->callback.pin_mask &= ~BIT(local_gpio_pin(pinNumber));
526525
}
527526
}
528527

0 commit comments

Comments
 (0)