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+ #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 */
81213enum 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