Skip to content

Commit d816c64

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 d816c64

File tree

5 files changed

+1063
-36
lines changed

5 files changed

+1063
-36
lines changed

cores/arduino/Arduino.h

Lines changed: 153 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,22 +77,170 @@
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+
#if DT_NODE_HAS_COMPAT(DT_NODELABEL(arduino_header), arduino_header_r3)
84+
#define ZARD_CONNECTOR arduino_header
85+
86+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_0 A0
87+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_1 A1
88+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_2 A2
89+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_3 A3
90+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_4 A4
91+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_A_5 A5
92+
93+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_6 D0
94+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_7 D1
95+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_8 D2
96+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_9 D3
97+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_10 D4
98+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_11 D5
99+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_12 D6
100+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_13 D7
101+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_14 D8
102+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_15 D9
103+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_16 D10
104+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_17 D11
105+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_18 D12
106+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_19 D13
107+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_20 D14
108+
#define ZARD_ARDUINO_HEADER_R3_PIN_NAME_D_21 D15
109+
110+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_0 1
111+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_1 1
112+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_2 1
113+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_3 1
114+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_4 1
115+
#define ZARD_ARDUINO_HEADER_R3_IS_ANALOG_5 1
116+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_6 1
117+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_7 1
118+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_8 1
119+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_9 1
120+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_10 1
121+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_11 1
122+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_12 1
123+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_13 1
124+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_14 1
125+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_15 1
126+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_16 1
127+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_17 1
128+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_18 1
129+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_19 1
130+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_20 1
131+
#define ZARD_ARDUINO_HEADER_R3_IS_DIGITAL_21 1
132+
133+
#else
134+
#error "Only arduino-header-r3 connector is supported"
135+
#endif
136+
#endif
137+
138+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_adc))
139+
#define ZARD_ADC_CONNECTOR arduino_adc
140+
#endif
141+
142+
#if DT_NODE_EXISTS(DT_NODELABEL(arduino_pwm))
143+
#define ZARD_PWM_CONNECTOR arduino_pwm
144+
#endif
145+
146+
#define ZARD_CHECK_GPIO_CTLR(node_id) \
147+
COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), (node_id,), ())
148+
149+
#define ZARD_ALL_GPIO_CTLR DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR)
150+
151+
#define ZARD_IDX_IF_MATCH(i, n) \
152+
COND_CODE_1(DT_SAME_NODE(n, GET_ARG_N(UTIL_INC(i), ZARD_ALL_GPIO_CTLR)), (i), ())
153+
154+
#define ZARD_MATCH_IDX(n) \
155+
LISTIFY(NUM_VA_ARGS_LESS_1(ZARD_ALL_GPIO_CTLR), ZARD_IDX_IF_MATCH, (), n)
156+
157+
#define ZARD_GET_NGPIOS(i, ...) DT_PROP(GET_ARG_N(UTIL_INC(i), __VA_ARGS__), ngpios)
158+
#define ZARD_SUM_NGPIOS(...) \
159+
LISTIFY(NUM_VA_ARGS(__VA_ARGS__), ZARD_GET_NGPIOS, (+), __VA_ARGS__)
160+
161+
#define ZARD_GLOBAL_GPIO_OFFSET_(ph) \
162+
ZARD_SUM_NGPIOS(GET_ARGS_FIRST_N(ZARD_MATCH_IDX(ph), ZARD_ALL_GPIO_CTLR))
163+
164+
#define ZARD_GLOBAL_GPIO_OFFSET(ph) \
165+
COND_CODE_1(IS_EQ(NUM_VA_ARGS(ZARD_GLOBAL_GPIO_OFFSET_(ph)), 0), \
166+
(0), (ZARD_GLOBAL_GPIO_OFFSET_(ph)))
167+
168+
#define ZARD_CONNECTOR_PIN_IS_DIGITAL(node, num) \
169+
UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \
170+
DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _IS_DIGITAL_)), num)
171+
172+
#define ZARD_CONNECTOR_PIN_IS_ANALOG(node, num) \
173+
UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \
174+
DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _IS_ANALOG_)), num)
175+
176+
#define ZARD_CONNECTOR_PIN_NAME_D(node, num) \
177+
UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \
178+
DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _PIN_NAME_D_)), num)
179+
180+
#define ZARD_CONNECTOR_PIN_NAME_A(node, num) \
181+
UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \
182+
DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _PIN_NAME_A_)), num)
183+
184+
#define ZARD_CONN_DN_ENUMS(n, p, i) \
185+
COND_CODE_1(ZARD_CONNECTOR_PIN_IS_DIGITAL(DT_NODELABEL(ZARD_CONNECTOR), \
186+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)), \
187+
(ZARD_CONNECTOR_PIN_NAME_D(DT_NODELABEL(ZARD_CONNECTOR), \
188+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
189+
ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
190+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0),), ())
191+
192+
#define ZARD_CONN_AN_ENUMS(n, p, i) \
193+
COND_CODE_1(ZARD_CONNECTOR_PIN_IS_ANALOG(DT_NODELABEL(ZARD_CONNECTOR), \
194+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)), \
195+
(ZARD_CONNECTOR_PIN_NAME_A(DT_NODELABEL(ZARD_CONNECTOR), \
196+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
197+
ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
198+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0),), ())
199+
200+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), builtin_led_gpios) && \
201+
(DT_PROP_LEN(DT_PATH(zephyr_user), builtin_led_gpios) > 0)
202+
#define ZARD_LED_BUILTIN \
203+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)) + \
204+
DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin)
205+
#elif DT_NODE_EXISTS(DT_ALIAS(led0))
206+
#define ZARD_LED_BUILTIN \
207+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)) + \
208+
DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)
209+
#endif
210+
#endif
211+
77212
/*
78213
* expand as
79214
* enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS };
80215
*/
81216
enum digitalPins {
217+
#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), digital_pin_gpios, 0) > 0
82218
DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, DN_ENUMS, (, )),
83219
NUM_OF_DIGITAL_PINS
220+
#elif defined(ZARD_CONNECTOR)
221+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_DN_ENUMS)
222+
#endif
84223
};
85224

86225
#ifdef CONFIG_ADC
87226

88227
#define AN_ENUMS(n, p, i) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \
89228
DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
90229
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) };
230+
#define ZARD_AN_ENUM_GLOBAL(n, p, i) \
231+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin)
232+
enum analogPins {
233+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios)
234+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
235+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS)
236+
NUM_OF_ANALOG_PINS
237+
#else
238+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUM_GLOBAL)
239+
#endif
240+
#elif defined(ZARD_CONNECTOR)
241+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_AN_ENUMS)
242+
#endif
243+
};
93244

94245
#endif
95246

0 commit comments

Comments
 (0)