Skip to content

Commit 28b1df9

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 484a5ea commit 28b1df9

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
@@ -100,49 +100,36 @@ constexpr int sum_ngpios = sum_of_list(
100100
* GPIO callback implementation
101101
*/
102102

103-
struct arduino_callback {
104-
voidFuncPtr handler;
105-
bool enabled;
106-
};
107-
108103
struct gpio_port_callback {
109104
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 };
114107

115108
struct gpio_port_callback *find_gpio_port_callback(const struct device *dev)
116109
{
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]) {
123112
return &port_callback[i];
124113
}
125114
}
126115

127116
return nullptr;
128117
}
129118

130-
void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
131-
{
119+
void set_interrupt_handler(pin_size_t pinNumber, voidFuncPtr func) {
132120
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
133121

134122
if (pcb) {
135-
pcb->handlers[local_gpio_pin(pinNumber)].handler = func;
123+
pcb->handlers[local_gpio_pin(pinNumber)] = func;
136124
}
137125
}
138126

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

143130
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]();
146133
}
147134
}
148135
}
@@ -257,8 +244,7 @@ void tone_expiry_cb(struct k_timer *timer) {
257244
}
258245
}
259246

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) {
262248
struct k_timer *timer = &arduino_pin_timers[pinNumber].timer;
263249
k_timeout_t timeout;
264250
uint32_t count;
@@ -418,19 +404,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
418404
pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
419405
__ASSERT(pcb != nullptr, "gpio_port_callback not found");
420406

421-
pcb->pins |= BIT(local_gpio_pin(pinNumber));
422-
setInterruptHandler(pinNumber, callback);
423-
enableInterrupt(pinNumber);
407+
set_interrupt_handler(pinNumber, callback);
424408

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);
425415
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);
428416
}
429417

430418
void detachInterrupt(pin_size_t pinNumber)
431419
{
432-
setInterruptHandler(pinNumber, nullptr);
420+
gpio_pin_interrupt_configure(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), 0);
433421
disableInterrupt(pinNumber);
422+
set_interrupt_handler(pinNumber, nullptr);
434423
}
435424

436425
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -492,15 +481,15 @@ void enableInterrupt(pin_size_t pinNumber) {
492481
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
493482

494483
if (pcb) {
495-
pcb->handlers[local_gpio_pin(pinNumber)].enabled = true;
484+
pcb->callback.pin_mask |= BIT(local_gpio_pin(pinNumber));
496485
}
497486
}
498487

499488
void disableInterrupt(pin_size_t pinNumber) {
500489
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
501490

502491
if (pcb) {
503-
pcb->handlers[local_gpio_pin(pinNumber)].enabled = false;
492+
pcb->callback.pin_mask &= ~BIT(local_gpio_pin(pinNumber));
504493
}
505494
}
506495

0 commit comments

Comments
 (0)