Skip to content

Commit 7c21aa8

Browse files
committed
zephyrCommon: Improved interrupt handling
- The structure has been revised and unnecessary fields have been removed. - Interrupt masks are now directly modified by changing the pin_mask parameter in `struct gpio_callback`. - Renamed non-Arduino-derived `setInterruptHandler` and `handleGpioCallback` functions to Zephyr-like names.
1 parent 7e7bc2c commit 7c21aa8

File tree

1 file changed

+21
-31
lines changed

1 file changed

+21
-31
lines changed

cores/arduino/zephyrCommon.cpp

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -137,49 +137,36 @@ const int sum_ngpios = sum_of_list(
137137
* GPIO callback implementation
138138
*/
139139

140-
struct arduino_callback {
141-
voidFuncPtr handler;
142-
bool enabled;
143-
};
144-
145140
struct gpio_port_callback {
146141
struct gpio_callback callback;
147-
struct arduino_callback handlers[max_ngpios];
148-
gpio_port_pins_t pins;
149-
const struct device *dev;
150-
} port_callback[port_num] = {0};
142+
voidFuncPtr handlers[max_ngpios];
143+
} port_callback[ARRAY_SIZE(gpios)] = { 0 };
151144

152145
struct gpio_port_callback *find_gpio_port_callback(const struct device *dev)
153146
{
154-
for (size_t i = 0; i < ARRAY_SIZE(port_callback); i++) {
155-
if (port_callback[i].dev == dev) {
156-
return &port_callback[i];
157-
}
158-
if (port_callback[i].dev == nullptr) {
159-
port_callback[i].dev = dev;
147+
for (size_t i = 0; i < ARRAY_SIZE(gpios); i++) {
148+
if (dev == gpios[i]) {
160149
return &port_callback[i];
161150
}
162151
}
163152

164153
return nullptr;
165154
}
166155

167-
void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
168-
{
156+
void set_interrupt_handler(pin_size_t pinNumber, voidFuncPtr func) {
169157
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
170158

171159
if (pcb) {
172-
pcb->handlers[arduino_pins[pinNumber].pin].handler = func;
160+
pcb->handlers[arduino_pins[pinNumber].pin] = func;
173161
}
174162
}
175163

176-
void handleGpioCallback(const struct device *port, struct gpio_callback *cb, uint32_t pins)
177-
{
178-
struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
164+
void handle_gpio_callback(const struct device *port, struct gpio_callback *cb, uint32_t pins) {
165+
struct gpio_port_callback *pcb = CONTAINER_OF(cb, struct gpio_port_callback, callback);
179166

180167
for (uint32_t i = 0; i < max_ngpios; i++) {
181-
if (pins & BIT(i) && pcb->handlers[i].enabled) {
182-
pcb->handlers[i].handler();
168+
if (pins & BIT(i) && pcb->handlers[i]) {
169+
pcb->handlers[i]();
183170
}
184171
}
185172
}
@@ -466,19 +453,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
466453
pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
467454
__ASSERT(pcb != nullptr, "gpio_port_callback not found");
468455

469-
pcb->pins |= BIT(arduino_pins[pinNumber].pin);
470-
setInterruptHandler(pinNumber, callback);
471-
enableInterrupt(pinNumber);
456+
set_interrupt_handler(pinNumber, callback);
472457

458+
if (pcb->callback.handler == NULL) {
459+
gpio_init_callback(&pcb->callback, handle_gpio_callback, 0);
460+
gpio_add_callback(arduino_pins[pinNumber].port, &pcb->callback);
461+
}
462+
463+
enableInterrupt(pinNumber);
473464
gpio_pin_interrupt_configure(arduino_pins[pinNumber].port, arduino_pins[pinNumber].pin, intmode);
474-
gpio_init_callback(&pcb->callback, handleGpioCallback, pcb->pins);
475-
gpio_add_callback(arduino_pins[pinNumber].port, &pcb->callback);
476465
}
477466

478467
void detachInterrupt(pin_size_t pinNumber)
479468
{
480-
setInterruptHandler(pinNumber, nullptr);
469+
gpio_pin_interrupt_configure(arduino_pins[pinNumber].port, arduino_pins[pinNumber].pin, 0);
481470
disableInterrupt(pinNumber);
471+
set_interrupt_handler(pinNumber, nullptr);
482472
}
483473

484474
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -539,15 +529,15 @@ void enableInterrupt(pin_size_t pinNumber) {
539529
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
540530

541531
if (pcb) {
542-
pcb->handlers[arduino_pins[pinNumber].pin].enabled = true;
532+
pcb->callback.pin_mask |= BIT(arduino_pins[pinNumber].pin);
543533
}
544534
}
545535

546536
void disableInterrupt(pin_size_t pinNumber) {
547537
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
548538

549539
if (pcb) {
550-
pcb->handlers[arduino_pins[pinNumber].pin].enabled = false;
540+
pcb->callback.pin_mask &= ~BIT(arduino_pins[pinNumber].pin);
551541
}
552542
}
553543

0 commit comments

Comments
 (0)