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_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 */
81175enum 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