Skip to content

Commit 6f25613

Browse files
committed
cores: arduino: zephyrCommon: Generate config from connector definition
If digital-gpio-pins is not defined, the pin configuration will be generated using the connector definition. This allows ArduinoCore-Zephyr to be used on boards that have arduino-header defined, without requiring specific configuration in ArduinoCore-Zephyr. Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
1 parent b655af9 commit 6f25613

5 files changed

Lines changed: 608 additions & 19 deletions

File tree

cores/arduino/Arduino.h

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*
22
* Copyright (c) 2022 Dhruva Gole
3+
* Copyright (c) 2026 TOKITA Hiroshi
34
*
45
* SPDX-License-Identifier: Apache-2.0
56
*/
@@ -14,6 +15,8 @@
1415
#include <zephyr/drivers/adc.h>
1516
#include <zephyr/drivers/i2c.h>
1617

18+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
19+
1720
#define DIGITAL_PIN_EXISTS(n, p, i, dev, num) \
1821
(((dev == DT_REG_ADDR(DT_PHANDLE_BY_IDX(n, p, i))) && \
1922
(num == DT_PHA_BY_IDX(n, p, i, pin))) \
@@ -74,12 +77,80 @@
7477

7578
#define DN_ENUMS(n, p, i) D##i = i
7679

80+
#else
81+
82+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_header))
83+
#define ZARD_CONNECTOR arduino_header
84+
#elif DT_NODE_EXISTS(DT_NODELABEL(arduino_mkr_header))
85+
#define ZARD_CONNECTOR arduino_mkr_header
86+
#elif DT_NODE_EXISTS(DT_NODELABEL(arduino_nano_header))
87+
#define ZARD_CONNECTOR arduino_nano_header
88+
#elif DT_NODE_EXISTS(DT_NODELABEL(pico_header))
89+
#define ZARD_CONNECTOR pico_header
90+
#elif DT_NODE_EXISTS(DT_NODELABEL(boosterpack_header))
91+
#define ZARD_CONNECTOR boosterpack_header
92+
#endif
93+
94+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_adc))
95+
#define ZARD_ADC_CONNECTOR arduino_adc
96+
#endif
97+
98+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_pwm))
99+
#define ZARD_PWM_CONNECTOR arduino_pwm
100+
#endif
101+
102+
#define ZARD_CHECK_GPIO_CTLR_OKAY(node_id) \
103+
COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(node_id), \
104+
(COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), (node_id,), ())), ())
105+
106+
#define ZARD_ALL_OKAY_GPIO_CTLR \
107+
GET_ARGS_FIRST_N(NUM_VA_ARGS_LESS_1(DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR_OKAY)), \
108+
DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR_OKAY))
109+
110+
#define ZARD_IDX_IF_MATCH(i, n) \
111+
COND_CODE_1(DT_SAME_NODE(n, GET_ARG_N(UTIL_INC(i), ZARD_ALL_OKAY_GPIO_CTLR)), (i), ())
112+
113+
#define ZARD_MATCH_IDX(n) \
114+
LISTIFY(NUM_VA_ARGS_LESS_1(ZARD_ALL_OKAY_GPIO_CTLR), ZARD_IDX_IF_MATCH, (), n)
115+
116+
#define ZARD_GET_NGPIOS(i, ...) DT_PROP(GET_ARG_N(UTIL_INC(i), __VA_ARGS__), ngpios)
117+
#define ZARD_SUM_NGPIOS(...) \
118+
LISTIFY(NUM_VA_ARGS_LESS_1(__VA_ARGS__), ZARD_GET_NGPIOS, (+), __VA_ARGS__)
119+
#define ZARD_GLOBAL_GPIO_NUM_(ph) \
120+
ZARD_SUM_NGPIOS(GET_ARGS_FIRST_N(ZARD_MATCH_IDX(ph), ZARD_ALL_OKAY_GPIO_CTLR))
121+
122+
#define ZARD_GLOBAL_GPIO_NUM(ph) \
123+
COND_CODE_1(IS_EQ(NUM_VA_ARGS(ZARD_GLOBAL_GPIO_NUM_(ph)), 0), \
124+
(0), (ZARD_GLOBAL_GPIO_NUM_(ph)))
125+
126+
#define ZARD_CONN_DN_ENUMS(n, p, i) \
127+
UTIL_CAT(D, DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
128+
ZARD_GLOBAL_GPIO_NUM(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
129+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0)
130+
131+
#define ZARD_CONN_AN_ENUMS(n, p, i) \
132+
UTIL_CAT(A, DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
133+
ZARD_GLOBAL_GPIO_NUM( \
134+
DT_MAP_ENTRY_PARENT_BY_IDX(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, i)) + \
135+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, i, 0)
136+
137+
#if DT_NODE_EXISTS(DT_ALIAS(led0))
138+
#define ZARD_LED_BUILTIN \
139+
ZARD_GLOBAL_GPIO_NUM(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)) + \
140+
DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)
141+
#endif
142+
#endif
143+
77144
/*
78145
* expand as
79146
* enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS };
80147
*/
81148
enum digitalPins {
149+
#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), digital_pin_gpios, 0) > 0
82150
DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, DN_ENUMS, (, )),
151+
#elif defined(ZARD_CONNECTOR)
152+
DT_FOREACH_MAP_ENTRY_SEP(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_DN_ENUMS, (, )),
153+
#endif
83154
NUM_OF_DIGITAL_PINS
84155
};
85156

@@ -88,8 +159,21 @@ enum digitalPins {
88159
#define AN_ENUMS(n, p, i) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \
89160
DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
90161
DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)),
91-
enum analogPins { DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user),
92-
adc_pin_gpios, AN_ENUMS) };
162+
#define ZARD_AN_ENUM_GLOBAL(n, p, i) \
163+
ZARD_GLOBAL_GPIO_NUM(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin)
164+
enum analogPins {
165+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios)
166+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
167+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS)
168+
#else
169+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUM_GLOBAL)
170+
#endif
171+
#elif defined(ZARD_ADC_CONNECTOR)
172+
DT_FOREACH_MAP_ENTRY_SEP(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ZARD_CONN_AN_ENUMS,
173+
(, )),
174+
#endif
175+
NUM_OF_ANALOG_PINS
176+
};
93177

94178
#endif
95179

0 commit comments

Comments
 (0)