Skip to content

Commit 1878fb4

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 abef788 commit 1878fb4

5 files changed

Lines changed: 1026 additions & 36 deletions

File tree

cores/arduino/Arduino.h

Lines changed: 118 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,112 @@
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+
85+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_0 D16
86+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_1 D17
87+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_2 D18
88+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_3 D19
89+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_4 D20
90+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_5 D21
91+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_6 D0
92+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_7 D1
93+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_8 D2
94+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_9 D3
95+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_10 D4
96+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_11 D5
97+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_12 D6
98+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_13 D7
99+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_14 D8
100+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_15 D9
101+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_16 D10
102+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_17 D11
103+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_18 D12
104+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_19 D13
105+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_20 D14
106+
#define ZARD_ARDUINO_HEADER_R3_DIGITAL_MAP_21 D15
107+
108+
#elif DT_NODE_EXISTS(DT_NODELABEL(arduino_mkr_header))
109+
#define ZARD_CONNECTOR arduino_mkr_header
110+
#elif DT_NODE_EXISTS(DT_NODELABEL(arduino_nano_header))
111+
#define ZARD_CONNECTOR arduino_nano_header
112+
#elif DT_NODE_EXISTS(DT_NODELABEL(pico_header))
113+
#define ZARD_CONNECTOR pico_header
114+
#elif DT_NODE_EXISTS(DT_NODELABEL(boosterpack_header))
115+
#define ZARD_CONNECTOR boosterpack_header
116+
#endif
117+
118+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_adc))
119+
#define ZARD_ADC_CONNECTOR arduino_adc
120+
#endif
121+
122+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_pwm))
123+
#define ZARD_PWM_CONNECTOR arduino_pwm
124+
#endif
125+
126+
#define ZARD_CONNECTOR_PIN_NAME(node, num) \
127+
UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT(DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _DIGITAL_MAP_)), num)
128+
129+
#define ZARD_CHECK_GPIO_CTLR(node_id) \
130+
COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), (node_id,), ())
131+
132+
#define ZARD_ALL_GPIO_CTLR DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR)
133+
134+
#define ZARD_IDX_IF_MATCH(i, n) \
135+
COND_CODE_1(DT_SAME_NODE(n, GET_ARG_N(UTIL_INC(i), ZARD_ALL_GPIO_CTLR)), (i), ())
136+
137+
#define ZARD_MATCH_IDX(n) \
138+
LISTIFY(NUM_VA_ARGS_LESS_1(ZARD_ALL_GPIO_CTLR), ZARD_IDX_IF_MATCH, (), n)
139+
140+
#define ZARD_GET_NGPIOS(i, ...) DT_PROP(GET_ARG_N(UTIL_INC(i), __VA_ARGS__), ngpios)
141+
#define ZARD_SUM_NGPIOS(...) \
142+
LISTIFY(NUM_VA_ARGS(__VA_ARGS__), ZARD_GET_NGPIOS, (+), __VA_ARGS__)
143+
144+
#define ZARD_GLOBAL_GPIO_OFFSET_(ph) \
145+
ZARD_SUM_NGPIOS(GET_ARGS_FIRST_N(ZARD_MATCH_IDX(ph), ZARD_ALL_GPIO_CTLR))
146+
147+
#define ZARD_GLOBAL_GPIO_OFFSET(ph) \
148+
COND_CODE_1(IS_EQ(NUM_VA_ARGS(ZARD_GLOBAL_GPIO_OFFSET_(ph)), 0), \
149+
(0), (ZARD_GLOBAL_GPIO_OFFSET_(ph)))
150+
151+
152+
#define ZARD_CONN_DN_ENUMS(n, p, i) \
153+
ZARD_CONNECTOR_PIN_NAME(DT_NODELABEL(ZARD_CONNECTOR), \
154+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
155+
ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
156+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0)
157+
158+
#define ZARD_CONN_AN_ENUMS(n, p, i) \
159+
UTIL_CAT(A, DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
160+
ZARD_GLOBAL_GPIO_OFFSET( \
161+
DT_MAP_ENTRY_PARENT_BY_IDX(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, i)) + \
162+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, i, 0)
163+
164+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), builtin_led_gpios) && \
165+
(DT_PROP_LEN(DT_PATH(zephyr_user), builtin_led_gpios) > 0)
166+
#define ZARD_LED_BUILTIN \
167+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)) + \
168+
DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin)
169+
#elif DT_NODE_EXISTS(DT_ALIAS(led0))
170+
#define ZARD_LED_BUILTIN \
171+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)) + \
172+
DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)
173+
#endif
174+
#endif
175+
77176
/*
78177
* expand as
79178
* enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS };
80179
*/
81180
enum digitalPins {
181+
#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), digital_pin_gpios, 0) > 0
82182
DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, DN_ENUMS, (, )),
183+
#elif defined(ZARD_CONNECTOR)
184+
DT_FOREACH_MAP_ENTRY_SEP(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_DN_ENUMS, (, )),
185+
#endif
83186
NUM_OF_DIGITAL_PINS
84187
};
85188

@@ -88,8 +191,21 @@ enum digitalPins {
88191
#define AN_ENUMS(n, p, i) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \
89192
DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
90193
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) };
194+
#define ZARD_AN_ENUM_GLOBAL(n, p, i) \
195+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin)
196+
enum analogPins {
197+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios)
198+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
199+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS)
200+
#else
201+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUM_GLOBAL)
202+
#endif
203+
#elif defined(ZARD_ADC_CONNECTOR)
204+
DT_FOREACH_MAP_ENTRY_SEP(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map,
205+
ZARD_CONN_AN_ENUMS, (, )),
206+
#endif
207+
NUM_OF_ANALOG_PINS
208+
};
93209

94210
#endif
95211

0 commit comments

Comments
 (0)