11/*
22 * Copyright (c) 2022 Dhruva Gole
3+ * Copyright (c) 2026 TOKITA Hiroshi
34 *
45 * SPDX-License-Identifier: Apache-2.0
56 */
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))) \
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_CONNECTOR_PIN_IS_DIGITAL (node , num ) \
147+ UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \
148+ DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _IS_DIGITAL_)), num)
149+
150+ #define ZARD_CONNECTOR_PIN_IS_ANALOG (node , num ) \
151+ UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \
152+ DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _IS_ANALOG_)), num)
153+
154+ #define ZARD_CONNECTOR_PIN_NAME_D (node , num ) \
155+ UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \
156+ DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _PIN_NAME_D_)), num)
157+
158+ #define ZARD_CONNECTOR_PIN_NAME_A (node , num ) \
159+ UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \
160+ DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _PIN_NAME_A_)), num)
161+
162+ #define ZARD_CHECK_GPIO_CTLR (node_id ) \
163+ COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), (node_id,), ())
164+
165+ #define ZARD_ALL_GPIO_CTLR DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR)
166+
167+ #define ZARD_IDX_IF_MATCH (i , n ) \
168+ COND_CODE_1(DT_SAME_NODE(n, GET_ARG_N(UTIL_INC(i), ZARD_ALL_GPIO_CTLR)), (i), ())
169+
170+ #define ZARD_MATCH_IDX (n ) \
171+ LISTIFY(NUM_VA_ARGS_LESS_1(ZARD_ALL_GPIO_CTLR), ZARD_IDX_IF_MATCH, (), n)
172+
173+ #define ZARD_GET_NGPIOS (i , ...) DT_PROP(GET_ARG_N(UTIL_INC(i), __VA_ARGS__), ngpios)
174+ #define ZARD_SUM_NGPIOS (...) \
175+ LISTIFY(NUM_VA_ARGS(__VA_ARGS__), ZARD_GET_NGPIOS, (+), __VA_ARGS__)
176+
177+ #define ZARD_GLOBAL_GPIO_OFFSET_ (ph ) \
178+ ZARD_SUM_NGPIOS(GET_ARGS_FIRST_N(ZARD_MATCH_IDX(ph), ZARD_ALL_GPIO_CTLR))
179+
180+ #define ZARD_GLOBAL_GPIO_OFFSET (ph ) \
181+ COND_CODE_1(IS_EQ(NUM_VA_ARGS(ZARD_GLOBAL_GPIO_OFFSET_(ph)), 0), \
182+ (0), (ZARD_GLOBAL_GPIO_OFFSET_(ph)))
183+
184+
185+ #define ZARD_CONN_DN_ENUMS (n , p , i ) \
186+ COND_CODE_1(ZARD_CONNECTOR_PIN_IS_DIGITAL(DT_NODELABEL(ZARD_CONNECTOR), \
187+ DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)), \
188+ (ZARD_CONNECTOR_PIN_NAME_D(DT_NODELABEL(ZARD_CONNECTOR), \
189+ DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
190+ ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
191+ DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0),), ())
192+
193+ #define ZARD_CONN_AN_ENUMS (n , p , i ) \
194+ COND_CODE_1(ZARD_CONNECTOR_PIN_IS_ANALOG(DT_NODELABEL(ZARD_CONNECTOR), \
195+ DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)), \
196+ (ZARD_CONNECTOR_PIN_NAME_A(DT_NODELABEL(ZARD_CONNECTOR), \
197+ DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
198+ ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
199+ DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0),), ())
200+
201+ #if DT_NODE_HAS_PROP (DT_PATH (zephyr_user ), builtin_led_gpios ) && \
202+ (DT_PROP_LEN (DT_PATH (zephyr_user ), builtin_led_gpios ) > 0 )
203+ #define ZARD_LED_BUILTIN \
204+ ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)) + \
205+ DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin)
206+ #elif DT_NODE_EXISTS (DT_ALIAS (led0 ))
207+ #define ZARD_LED_BUILTIN \
208+ ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)) + \
209+ DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)
210+ #endif
211+ #endif
212+
77213/*
78214 * expand as
79215 * enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS };
80216 */
81217enum digitalPins {
218+ #if DT_PROP_LEN_OR (DT_PATH (zephyr_user ), digital_pin_gpios , 0 ) > 0
82219 DT_FOREACH_PROP_ELEM_SEP (DT_PATH (zephyr_user ), digital_pin_gpios , DN_ENUMS , (, )),
220+ #elif defined(ZARD_CONNECTOR )
221+ DT_FOREACH_MAP_ENTRY (DT_NODELABEL (ZARD_CONNECTOR ), gpio_map , ZARD_CONN_DN_ENUMS )
222+ #endif
83223 NUM_OF_DIGITAL_PINS
84224};
85225
@@ -88,8 +228,20 @@ enum digitalPins {
88228#define AN_ENUMS (n , p , i ) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \
89229 DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
90230 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 ) };
231+ #define ZARD_AN_ENUM_GLOBAL (n , p , i ) \
232+ ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin)
233+ enum analogPins {
234+ #if DT_NODE_HAS_PROP (DT_PATH (zephyr_user ), adc_pin_gpios )
235+ #if DT_NODE_HAS_PROP (DT_PATH (zephyr_user ), digital_pin_gpios )
236+ DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user ), adc_pin_gpios , AN_ENUMS )
237+ #else
238+ DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user ), adc_pin_gpios , ZARD_AN_ENUM_GLOBAL )
239+ #endif
240+ #elif defined(ZARD_ADC_CONNECTOR)
241+ DT_FOREACH_MAP_ENTRY (DT_NODELABEL (ZARD_CONNECTOR ), gpio_map , ZARD_CONN_AN_ENUMS )
242+ #endif
243+ NUM_OF_ANALOG_PINS
244+ };
93245
94246#endif
95247
0 commit comments