Skip to content

Commit 47f46c7

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 47f46c7

5 files changed

Lines changed: 1060 additions & 36 deletions

File tree

cores/arduino/Arduino.h

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

@@ -88,8 +224,20 @@ enum digitalPins {
88224
#define AN_ENUMS(n, p, i) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \
89225
DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
90226
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) };
227+
#define ZARD_AN_ENUM_GLOBAL(n, p, i) \
228+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin)
229+
enum analogPins {
230+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios)
231+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
232+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS)
233+
#else
234+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUM_GLOBAL)
235+
#endif
236+
#elif defined(ZARD_ADC_CONNECTOR)
237+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_AN_ENUMS)
238+
#endif
239+
NUM_OF_ANALOG_PINS
240+
};
93241

94242
#endif
95243

0 commit comments

Comments
 (0)