Skip to content

Commit dc41a17

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 b0d9151 commit dc41a17

5 files changed

Lines changed: 647 additions & 14 deletions

File tree

cores/arduino/Arduino.h

Lines changed: 113 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,107 @@
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_OKAY(node_id) \
130+
COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), (node_id,), ())
131+
132+
#define ZARD_ALL_OKAY_GPIO_CTLR DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR_OKAY)
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_OKAY_GPIO_CTLR)), (i), ())
136+
137+
#define ZARD_MATCH_IDX(n) \
138+
LISTIFY(NUM_VA_ARGS_LESS_1(ZARD_ALL_OKAY_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_OKAY_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_EXISTS(DT_ALIAS(led0))
165+
#define ZARD_LED_BUILTIN \
166+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)) + \
167+
DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)
168+
#endif
169+
#endif
170+
77171
/*
78172
* expand as
79173
* enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS };
80174
*/
81175
enum digitalPins {
176+
#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), digital_pin_gpios, 0) > 0
82177
DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, DN_ENUMS, (, )),
178+
#elif defined(ZARD_CONNECTOR)
179+
DT_FOREACH_MAP_ENTRY_SEP(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_DN_ENUMS, (, )),
180+
#endif
83181
NUM_OF_DIGITAL_PINS
84182
};
85183

@@ -88,8 +186,21 @@ enum digitalPins {
88186
#define AN_ENUMS(n, p, i) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \
89187
DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
90188
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) };
189+
#define ZARD_AN_ENUM_GLOBAL(n, p, i) \
190+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin)
191+
enum analogPins {
192+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios)
193+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
194+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS)
195+
#else
196+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUM_GLOBAL)
197+
#endif
198+
#elif defined(ZARD_ADC_CONNECTOR)
199+
DT_FOREACH_MAP_ENTRY_SEP(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map,
200+
ZARD_CONN_AN_ENUMS, (, )),
201+
#endif
202+
NUM_OF_ANALOG_PINS
203+
};
93204

94205
#endif
95206

0 commit comments

Comments
 (0)