7
7
#include < Arduino.h>
8
8
#include " zephyrInternal.h"
9
9
10
- static const struct gpio_dt_spec arduino_pins[] = {DT_FOREACH_PROP_ELEM_SEP (
11
- DT_PATH (zephyr_user), digital_pin_gpios, GPIO_DT_SPEC_GET_BY_IDX, (, ))};
10
+ static const struct gpio_dt_spec arduino_pins[] = {
11
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
12
+ DT_FOREACH_PROP_ELEM_SEP (DT_PATH (zephyr_user), digital_pin_gpios, GPIO_DT_SPEC_GET_BY_IDX, (, )),
13
+ #endif
14
+ };
12
15
13
16
namespace {
14
17
@@ -61,12 +64,21 @@ constexpr const size_t is_first_appearance(const size_t &idx, const size_t &at,
61
64
is_first_appearance (0 , i, ((size_t )-1 ), DEVICE_DT_GET(DT_GPIO_CTLR_BY_IDX(n, p, i)), \
62
65
DT_FOREACH_PROP_ELEM_SEP_VARGS (n, p, GET_DEVICE_VARGS, (, ), 0 ))
63
66
const int port_num =
64
- sum_of_list (0 , DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios,
65
- FIRST_APPEARANCE, (, )));
67
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
68
+ sum_of_list (0 , DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios,
69
+ FIRST_APPEARANCE, (, )));
70
+ #else
71
+ 0 ;
72
+ #endif
66
73
67
74
#define GPIO_NGPIOS (n, p, i ) DT_PROP(DT_GPIO_CTLR_BY_IDX(n, p, i), ngpios)
68
- const int max_ngpios = max_in_list(
69
- 0 , DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, GPIO_NGPIOS, (, )));
75
+ const int max_ngpios =
76
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
77
+ max_in_list (0 , DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios,
78
+ GPIO_NGPIOS, (, )));
79
+ #else
80
+ 0 ;
81
+ #endif
70
82
71
83
/*
72
84
* GPIO callback implementation
@@ -82,7 +94,7 @@ struct gpio_port_callback {
82
94
struct arduino_callback handlers[max_ngpios];
83
95
gpio_port_pins_t pins;
84
96
const struct device *dev;
85
- } port_callback[port_num] = { 0 } ;
97
+ } port_callback[port_num];
86
98
87
99
struct gpio_port_callback *find_gpio_port_callback (const struct device *dev)
88
100
{
@@ -108,6 +120,7 @@ void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func)
108
120
}
109
121
}
110
122
123
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
111
124
void handleGpioCallback (const struct device *port, struct gpio_callback *cb, uint32_t pins)
112
125
{
113
126
struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
@@ -118,6 +131,7 @@ void handleGpioCallback(const struct device *port, struct gpio_callback *cb, uin
118
131
}
119
132
}
120
133
}
134
+ #endif
121
135
122
136
#ifdef CONFIG_PWM
123
137
@@ -187,6 +201,7 @@ void yield(void) {
187
201
* A high physical level will be interpreted as value 1
188
202
*/
189
203
void pinMode (pin_size_t pinNumber, PinMode pinMode) {
204
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
190
205
if (pinMode == INPUT) { // input mode
191
206
gpio_pin_configure_dt (&arduino_pins[pinNumber],
192
207
GPIO_INPUT | GPIO_ACTIVE_HIGH);
@@ -200,14 +215,21 @@ void pinMode(pin_size_t pinNumber, PinMode pinMode) {
200
215
gpio_pin_configure_dt (&arduino_pins[pinNumber],
201
216
GPIO_OUTPUT_LOW | GPIO_ACTIVE_HIGH);
202
217
}
218
+ #endif
203
219
}
204
220
205
221
void digitalWrite (pin_size_t pinNumber, PinStatus status) {
222
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
206
223
gpio_pin_set_dt (&arduino_pins[pinNumber], status);
224
+ #endif
207
225
}
208
226
209
227
PinStatus digitalRead (pin_size_t pinNumber) {
228
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
210
229
return (gpio_pin_get_dt (&arduino_pins[pinNumber]) == 1 ) ? HIGH : LOW;
230
+ #else
231
+ return LOW;
232
+ #endif
211
233
}
212
234
213
235
struct k_timer arduino_pin_timers[ARRAY_SIZE(arduino_pins)];
@@ -224,6 +246,7 @@ void tone_timeout_cb(struct k_timer *timer) {
224
246
}
225
247
226
248
void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
249
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
227
250
struct k_timer *timer = &arduino_pin_timers[pinNumber];
228
251
const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
229
252
k_timeout_t timeout;
@@ -248,11 +271,14 @@ void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration)
248
271
k_timer_user_data_set (timer, (void *)(uintptr_t )pinNumber);
249
272
k_timer_start (timer, K_MSEC (duration), K_NO_WAIT);
250
273
}
274
+ #endif
251
275
}
252
276
253
277
void noTone (pin_size_t pinNumber) {
278
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
254
279
k_timer_stop (&arduino_pin_timers[pinNumber]);
255
280
gpio_pin_set_dt (&arduino_pins[pinNumber], 0 );
281
+ #endif
256
282
}
257
283
258
284
void delay (unsigned long ms) { k_sleep (K_MSEC (ms)); }
@@ -349,6 +375,7 @@ int analogRead(pin_size_t pinNumber)
349
375
350
376
void attachInterrupt (pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinStatus)
351
377
{
378
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
352
379
struct gpio_port_callback *pcb;
353
380
gpio_flags_t intmode = 0 ;
354
381
@@ -380,6 +407,7 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
380
407
gpio_pin_interrupt_configure (arduino_pins[pinNumber].port , arduino_pins[pinNumber].pin , intmode);
381
408
gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
382
409
gpio_add_callback (arduino_pins[pinNumber].port , &pcb->callback );
410
+ #endif
383
411
}
384
412
385
413
void detachInterrupt (pin_size_t pinNumber)
@@ -409,6 +437,7 @@ long random(long max) {
409
437
#ifdef CONFIG_GPIO_GET_DIRECTION
410
438
411
439
unsigned long pulseIn (pin_size_t pinNumber, uint8_t state, unsigned long timeout) {
440
+ #if DT_NODE_EXISTS(DT_PATH(zephyr_user, digital_pin_gpios))
412
441
struct k_timer timer;
413
442
int64_t start, end, delta = 0 ;
414
443
const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
@@ -446,6 +475,9 @@ unsigned long pulseIn(pin_size_t pinNumber, uint8_t state, unsigned long timeout
446
475
cleanup:
447
476
k_timer_stop (&timer);
448
477
return (unsigned long )delta;
478
+ #else
479
+ return 0 ;
480
+ #endif
449
481
}
450
482
451
483
#endif // CONFIG_GPIO_GET_DIRECTION
0 commit comments