Skip to content

Commit 46287d2

Browse files
committed
cores: arduino: zephyrCommon Specify port/pin instead of gpio_dt_spec.
In preparation for improvements to allow the use of GPIOs without device tree definitions, the interface will be changed to specify port and pin instead of `gpio_dt_spec`. Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
1 parent b16b96f commit 46287d2

File tree

1 file changed

+41
-32
lines changed

1 file changed

+41
-32
lines changed

cores/arduino/zephyrCommon.cpp

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <Arduino.h>
88
#include "zephyrInternal.h"
99

10-
static const struct gpio_dt_spec arduino_pins[] = {DT_FOREACH_PROP_ELEM_SEP(
10+
static constexpr struct gpio_dt_spec arduino_pins[] = {DT_FOREACH_PROP_ELEM_SEP(
1111
DT_PATH(zephyr_user), digital_pin_gpios, GPIO_DT_SPEC_GET_BY_IDX, (, ))};
1212

1313
namespace {
@@ -56,6 +56,18 @@ constexpr const size_t is_first_appearance(const size_t &idx, const size_t &at,
5656
tail...);
5757
}
5858

59+
constexpr inline const struct device *local_gpio_port(pin_size_t gpin) {
60+
return arduino_pins[gpin].port;
61+
}
62+
63+
constexpr inline pin_size_t local_gpio_pin(pin_size_t gpin) {
64+
return arduino_pins[gpin].pin;
65+
}
66+
67+
inline int global_gpio_pin_configure(pin_size_t pinNumber, int flags) {
68+
return gpio_pin_configure_dt(&arduino_pins[pinNumber], flags);
69+
}
70+
5971
#define GET_DEVICE_VARGS(n, p, i, _) DEVICE_DT_GET(DT_GPIO_CTLR_BY_IDX(n, p, i))
6072
#define FIRST_APPEARANCE(n, p, i) \
6173
is_first_appearance(0, i, ((size_t)-1), DEVICE_DT_GET(DT_GPIO_CTLR_BY_IDX(n, p, i)), \
@@ -101,10 +113,10 @@ struct gpio_port_callback *find_gpio_port_callback(const struct device *dev)
101113

102114
void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
103115
{
104-
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
116+
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
105117

106118
if (pcb) {
107-
pcb->handlers[arduino_pins[pinNumber].pin].handler = func;
119+
pcb->handlers[local_gpio_pin(pinNumber)].handler = func;
108120
}
109121
}
110122

@@ -190,26 +202,26 @@ void yield(void) {
190202
*/
191203
void pinMode(pin_size_t pinNumber, PinMode pinMode) {
192204
if (pinMode == INPUT) { // input mode
193-
gpio_pin_configure_dt(&arduino_pins[pinNumber],
205+
global_gpio_pin_configure(pinNumber,
194206
GPIO_INPUT | GPIO_ACTIVE_HIGH);
195207
} else if (pinMode == INPUT_PULLUP) { // input with internal pull-up
196-
gpio_pin_configure_dt(&arduino_pins[pinNumber],
208+
global_gpio_pin_configure(pinNumber,
197209
GPIO_INPUT | GPIO_PULL_UP | GPIO_ACTIVE_HIGH);
198210
} else if (pinMode == INPUT_PULLDOWN) { // input with internal pull-down
199-
gpio_pin_configure_dt(&arduino_pins[pinNumber],
211+
global_gpio_pin_configure(pinNumber,
200212
GPIO_INPUT | GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH);
201213
} else if (pinMode == OUTPUT) { // output mode
202-
gpio_pin_configure_dt(&arduino_pins[pinNumber],
214+
global_gpio_pin_configure(pinNumber,
203215
GPIO_OUTPUT_LOW | GPIO_ACTIVE_HIGH);
204216
}
205217
}
206218

207219
void digitalWrite(pin_size_t pinNumber, PinStatus status) {
208-
gpio_pin_set_dt(&arduino_pins[pinNumber], status);
220+
gpio_pin_set(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), status);
209221
}
210222

211223
PinStatus digitalRead(pin_size_t pinNumber) {
212-
return (gpio_pin_get_dt(&arduino_pins[pinNumber]) == 1) ? HIGH : LOW;
224+
return (gpio_pin_get(local_gpio_port(pinNumber), local_gpio_pin(pinNumber)) == 1) ? HIGH : LOW;
213225
}
214226

215227
#ifndef MAX_TONE_PINS
@@ -227,13 +239,12 @@ static struct pin_timer {
227239

228240
void tone_expiry_cb(struct k_timer *timer) {
229241
struct pin_timer *pt = CONTAINER_OF(timer, struct pin_timer, timer);
230-
const struct gpio_dt_spec *spec = &arduino_pins[pt->pin];
231242

232243
if (pt->count == 0) {
233244
k_timer_stop(timer);
234-
gpio_pin_set_dt(spec, 0);
245+
gpio_pin_set(local_gpio_port(pt->pin), local_gpio_pin(pt->pin), 0);
235246
} else {
236-
gpio_pin_toggle_dt(spec);
247+
gpio_pin_toggle(local_gpio_port(pt->pin), local_gpio_pin(pt->pin));
237248
if (!pt->infinity) {
238249
pt->count--;
239250
}
@@ -242,7 +253,6 @@ void tone_expiry_cb(struct k_timer *timer) {
242253

243254
void tone(pin_size_t pinNumber, unsigned int frequency,
244255
unsigned long duration) {
245-
const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
246256
struct k_timer *timer;
247257
k_timeout_t timeout;
248258

@@ -256,7 +266,7 @@ void tone(pin_size_t pinNumber, unsigned int frequency,
256266
k_timer_stop(&arduino_pin_timers[pinNumber].timer);
257267

258268
if (frequency == 0) {
259-
gpio_pin_set_dt(spec, 0);
269+
gpio_pin_set(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), 0);
260270
return;
261271
}
262272

@@ -271,15 +281,13 @@ void tone(pin_size_t pinNumber, unsigned int frequency,
271281
arduino_pin_timers[pinNumber].pin = pinNumber;
272282
k_timer_init(timer, tone_expiry_cb, NULL);
273283

274-
gpio_pin_set_dt(spec, 0);
284+
gpio_pin_set(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), 0);
275285
k_timer_start(timer, timeout, timeout);
276286
}
277287

278288
void noTone(pin_size_t pinNumber) {
279-
const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
280-
281289
k_timer_stop(&arduino_pin_timers[pinNumber].timer);
282-
gpio_pin_set_dt(spec, 0);
290+
gpio_pin_set(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), 0);
283291
}
284292

285293
void delay(unsigned long ms) {
@@ -402,16 +410,16 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
402410
return;
403411
}
404412

405-
pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
413+
pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
406414
__ASSERT(pcb != nullptr, "gpio_port_callback not found");
407415

408-
pcb->pins |= BIT(arduino_pins[pinNumber].pin);
416+
pcb->pins |= BIT(local_gpio_pin(pinNumber));
409417
setInterruptHandler(pinNumber, callback);
410418
enableInterrupt(pinNumber);
411419

412-
gpio_pin_interrupt_configure(arduino_pins[pinNumber].port, arduino_pins[pinNumber].pin, intmode);
420+
gpio_pin_interrupt_configure(local_gpio_port(pinNumber), local_gpio_pin(pinNumber), intmode);
413421
gpio_init_callback(&pcb->callback, handleGpioCallback, pcb->pins);
414-
gpio_add_callback(arduino_pins[pinNumber].port, &pcb->callback);
422+
gpio_add_callback(local_gpio_port(pinNumber), &pcb->callback);
415423
}
416424

417425
void detachInterrupt(pin_size_t pinNumber)
@@ -439,29 +447,30 @@ long random(long max) {
439447
#endif
440448

441449
unsigned long pulseIn(pin_size_t pinNumber, uint8_t state, unsigned long timeout) {
450+
const struct device* port = local_gpio_port(pinNumber);
451+
const size_t pin = local_gpio_pin(pinNumber);
442452
struct k_timer timer;
443453
int64_t start, end, delta = 0;
444-
const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
445454

446-
if (!gpio_is_ready_dt(spec)) {
455+
if (!device_is_ready(port)) {
447456
return 0;
448457
}
449458

450459
k_timer_init(&timer, NULL, NULL);
451460
k_timer_start(&timer, K_MSEC(timeout), K_NO_WAIT);
452461

453-
while(gpio_pin_get_dt(spec) == state && k_timer_status_get(&timer) == 0);
462+
while(gpio_pin_get(port, pin) == state && k_timer_status_get(&timer) == 0);
454463
if (k_timer_status_get(&timer) > 0) {
455464
goto cleanup;
456465
}
457466

458-
while(gpio_pin_get_dt(spec) != state && k_timer_status_get(&timer) == 0);
467+
while(gpio_pin_get(port, pin) != state && k_timer_status_get(&timer) == 0);
459468
if (k_timer_status_get(&timer) > 0) {
460469
goto cleanup;
461470
}
462471

463472
start = k_uptime_ticks();
464-
while(gpio_pin_get_dt(spec) == state && k_timer_status_get(&timer) == 0);
473+
while(gpio_pin_get(port, pin) == state && k_timer_status_get(&timer) == 0);
465474
if (k_timer_status_get(&timer) > 0) {
466475
goto cleanup;
467476
}
@@ -475,18 +484,18 @@ unsigned long pulseIn(pin_size_t pinNumber, uint8_t state, unsigned long timeout
475484
}
476485

477486
void enableInterrupt(pin_size_t pinNumber) {
478-
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
487+
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
479488

480489
if (pcb) {
481-
pcb->handlers[arduino_pins[pinNumber].pin].enabled = true;
490+
pcb->handlers[local_gpio_pin(pinNumber)].enabled = true;
482491
}
483492
}
484493

485494
void disableInterrupt(pin_size_t pinNumber) {
486-
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
495+
struct gpio_port_callback *pcb = find_gpio_port_callback(local_gpio_port(pinNumber));
487496

488497
if (pcb) {
489-
pcb->handlers[arduino_pins[pinNumber].pin].enabled = false;
498+
pcb->handlers[local_gpio_pin(pinNumber)].enabled = false;
490499
}
491500
}
492501

@@ -506,7 +515,7 @@ void noInterrupts(void) {
506515

507516
int digitalPinToInterrupt(pin_size_t pin) {
508517
struct gpio_port_callback *pcb =
509-
find_gpio_port_callback(arduino_pins[pin].port);
518+
find_gpio_port_callback(local_gpio_port(pin));
510519

511520
return (pcb) ? pin : -1;
512521
}

0 commit comments

Comments
 (0)