Skip to content

Commit 03d9391

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 d6dd3e3 commit 03d9391

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
@@ -143,49 +143,36 @@ constexpr int max_ngpios = max_in_list(
143143
* GPIO callback implementation
144144
*/
145145

146-
struct arduino_callback {
147-
voidFuncPtr handler;
148-
bool enabled;
149-
};
150-
151146
struct gpio_port_callback {
152147
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 };
157150

158151
struct gpio_port_callback *find_gpio_port_callback(const struct device *dev)
159152
{
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]) {
166155
return &port_callback[i];
167156
}
168157
}
169158

170159
return nullptr;
171160
}
172161

173-
void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
174-
{
162+
void set_interrupt_handler(pin_size_t pinNumber, voidFuncPtr func) {
175163
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
176164

177165
if (pcb) {
178-
pcb->handlers[local_gpio_pin(pinNumber)].handler = func;
166+
pcb->handlers[local_gpio_pin(pinNumber)] = func;
179167
}
180168
}
181169

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

186173
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]();
189176
}
190177
}
191178
}
@@ -300,8 +287,7 @@ void tone_expiry_cb(struct k_timer *timer) {
300287
}
301288
}
302289

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) {
305291
struct k_timer *timer = &arduino_pin_timers[pinNumber].timer;
306292
k_timeout_t timeout;
307293
uint32_t count;
@@ -461,19 +447,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
461447
pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
462448
__ASSERT(pcb != nullptr, "gpio_port_callback not found");
463449

464-
pcb->pins |= BIT(local_gpio_pin(pinNumber));
465-
setInterruptHandler(pinNumber, callback);
466-
enableInterrupt(pinNumber);
450+
set_interrupt_handler(pinNumber, callback);
467451

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);
468458
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);
471459
}
472460

473461
void detachInterrupt(pin_size_t pinNumber)
474462
{
475-
setInterruptHandler(pinNumber, nullptr);
463+
gpio_pin_interrupt_configure(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), 0);
476464
disableInterrupt(pinNumber);
465+
set_interrupt_handler(pinNumber, nullptr);
477466
}
478467

479468
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -535,15 +524,15 @@ void enableInterrupt(pin_size_t pinNumber) {
535524
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
536525

537526
if (pcb) {
538-
pcb->handlers[local_gpio_pin(pinNumber)].enabled = true;
527+
pcb->callback.pin_mask |= BIT(local_gpio_pin(pinNumber));
539528
}
540529
}
541530

542531
void disableInterrupt(pin_size_t pinNumber) {
543532
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
544533

545534
if (pcb) {
546-
pcb->handlers[local_gpio_pin(pinNumber)].enabled = false;
535+
pcb->callback.pin_mask &= ~BIT(local_gpio_pin(pinNumber));
547536
}
548537
}
549538

0 commit comments

Comments
 (0)