Skip to content

Commit 2beaeeb

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. Signed-off-by: TOKITA Hiroshi <[email protected]>
1 parent 7ca4da5 commit 2beaeeb

File tree

1 file changed

+22
-33
lines changed

1 file changed

+22
-33
lines changed

cores/arduino/zephyrCommon.cpp

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -87,49 +87,36 @@ constexpr int max_ngpios = max_in_list(
8787
* GPIO callback implementation
8888
*/
8989

90-
struct arduino_callback {
91-
voidFuncPtr handler;
92-
bool enabled;
93-
};
94-
9590
struct gpio_port_callback {
9691
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 };
10194

10295
struct gpio_port_callback *find_gpio_port_callback(const struct device *dev)
10396
{
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]) {
11099
return &port_callback[i];
111100
}
112101
}
113102

114103
return nullptr;
115104
}
116105

117-
void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
118-
{
106+
void set_interrupt_handler(pin_size_t pinNumber, voidFuncPtr func) {
119107
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
120108

121109
if (pcb) {
122-
pcb->handlers[local_gpio_pin(pinNumber)].handler = func;
110+
pcb->handlers[local_gpio_pin(pinNumber)] = func;
123111
}
124112
}
125113

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);
129116

130117
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]();
133120
}
134121
}
135122
}
@@ -244,8 +231,7 @@ void tone_expiry_cb(struct k_timer *timer) {
244231
}
245232
}
246233

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) {
249235
struct k_timer *timer = &arduino_pin_timers[pinNumber].timer;
250236
k_timeout_t timeout;
251237
uint32_t count;
@@ -405,19 +391,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
405391
pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
406392
__ASSERT(pcb != nullptr, "gpio_port_callback not found");
407393

408-
pcb->pins |= BIT(local_gpio_pin(pinNumber));
409-
setInterruptHandler(pinNumber, callback);
410-
enableInterrupt(pinNumber);
394+
set_interrupt_handler(pinNumber, callback);
411395

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);
412402
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);
415403
}
416404

417405
void detachInterrupt(pin_size_t pinNumber)
418406
{
419-
setInterruptHandler(pinNumber, nullptr);
407+
gpio_pin_interrupt_configure(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), 0);
420408
disableInterrupt(pinNumber);
409+
set_interrupt_handler(pinNumber, nullptr);
421410
}
422411

423412
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -479,15 +468,15 @@ void enableInterrupt(pin_size_t pinNumber) {
479468
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
480469

481470
if (pcb) {
482-
pcb->handlers[local_gpio_pin(pinNumber)].enabled = true;
471+
pcb->callback.pin_mask |= BIT(local_gpio_pin(pinNumber));
483472
}
484473
}
485474

486475
void disableInterrupt(pin_size_t pinNumber) {
487476
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
488477

489478
if (pcb) {
490-
pcb->handlers[local_gpio_pin(pinNumber)].enabled = false;
479+
pcb->callback.pin_mask &= ~BIT(local_gpio_pin(pinNumber));
491480
}
492481
}
493482

0 commit comments

Comments
 (0)