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
1313namespace {
@@ -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
102114void 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 */
191203void 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
207219void 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
211223PinStatus 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
228240void 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
243254void 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
278288void 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
285293void 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
417425void detachInterrupt (pin_size_t pinNumber)
@@ -439,29 +447,30 @@ long random(long max) {
439447#endif
440448
441449unsigned 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
477486void 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
485494void 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
507516int 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