Skip to content

Commit b398bfa

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 934a931 commit b398bfa

File tree

1 file changed

+21
-32
lines changed

1 file changed

+21
-32
lines changed

cores/arduino/zephyrCommon.cpp

Lines changed: 21 additions & 32 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;
92+
voidFuncPtr handlers[max_ngpios];
10093
} port_callback[ARRAY_SIZE(gpios)];
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
}
@@ -247,8 +234,7 @@ void tone_expiry_cb(struct k_timer *timer) {
247234
}
248235
}
249236

250-
void tone(pin_size_t pinNumber, unsigned int frequency,
251-
unsigned long duration) {
237+
void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
252238
struct k_timer *timer;
253239
k_timeout_t timeout;
254240

@@ -409,19 +395,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
409395
pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
410396
__ASSERT(pcb != nullptr, "gpio_port_callback not found");
411397

412-
pcb->pins |= BIT(local_gpio_pin(pinNumber));
413-
setInterruptHandler(pinNumber, callback);
414-
enableInterrupt(pinNumber);
398+
set_interrupt_handler(pinNumber, callback);
415399

400+
if (pcb->callback.handler == NULL) {
401+
gpio_init_callback(&pcb->callback, handle_gpio_callback, 0);
402+
gpio_add_callback(local_gpio_port(pinNumber), &pcb->callback);
403+
}
404+
405+
enableInterrupt(pinNumber);
416406
gpio_pin_interrupt_configure(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), intmode);
417-
gpio_init_callback(&pcb->callback, handleGpioCallback, pcb->pins);
418-
gpio_add_callback(local_gpio_port(pinNumber), &pcb->callback);
419407
}
420408

421409
void detachInterrupt(pin_size_t pinNumber)
422410
{
423-
setInterruptHandler(pinNumber, nullptr);
411+
gpio_pin_interrupt_configure(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), 0);
424412
disableInterrupt(pinNumber);
413+
set_interrupt_handler(pinNumber, nullptr);
425414
}
426415

427416
#ifndef CONFIG_MINIMAL_LIBC_RAND
@@ -483,15 +472,15 @@ void enableInterrupt(pin_size_t pinNumber) {
483472
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
484473

485474
if (pcb) {
486-
pcb->handlers[local_gpio_pin(pinNumber)].enabled = true;
475+
pcb->callback.pin_mask |= BIT(local_gpio_pin(pinNumber));
487476
}
488477
}
489478

490479
void disableInterrupt(pin_size_t pinNumber) {
491480
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
492481

493482
if (pcb) {
494-
pcb->handlers[local_gpio_pin(pinNumber)].enabled = false;
483+
pcb->callback.pin_mask &= ~BIT(local_gpio_pin(pinNumber));
495484
}
496485
}
497486

0 commit comments

Comments
 (0)