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+ #elif DT_NODE_EXISTS (DT_NODELABEL (arduino_mkr_header ))
85+ #define ZARD_CONNECTOR arduino_mkr_header
86+ #elif DT_NODE_EXISTS (DT_NODELABEL (arduino_nano_header ))
87+ #define ZARD_CONNECTOR arduino_nano_header
88+ #elif DT_NODE_EXISTS (DT_NODELABEL (pico_header ))
89+ #define ZARD_CONNECTOR pico_header
90+ #elif DT_NODE_EXISTS (DT_NODELABEL (boosterpack_header ))
91+ #define ZARD_CONNECTOR boosterpack_header
92+ #endif
93+
94+ #if DT_NODE_EXISTS (DT_NODELABEL (arduino_adc ))
95+ #define ZARD_ADC_CONNECTOR arduino_adc
96+ #endif
97+
98+ #if DT_NODE_EXISTS (DT_NODELABEL (arduino_pwm ))
99+ #define ZARD_PWM_CONNECTOR arduino_pwm
100+ #endif
101+
102+ #define ZARD_CHECK_GPIO_CTLR_OKAY (node_id ) \
103+ COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(node_id), \
104+ (COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), (node_id,), ())), ())
105+
106+ #define ZARD_ALL_OKAY_GPIO_CTLR \
107+ GET_ARGS_FIRST_N(NUM_VA_ARGS_LESS_1(DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR_OKAY)), \
108+ DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR_OKAY))
109+
110+ #define ZARD_IDX_IF_MATCH (i , n ) \
111+ COND_CODE_1(DT_SAME_NODE(n, GET_ARG_N(UTIL_INC(i), ZARD_ALL_OKAY_GPIO_CTLR)), (i), ())
112+
113+ #define ZARD_MATCH_IDX (n ) \
114+ LISTIFY(NUM_VA_ARGS_LESS_1(ZARD_ALL_OKAY_GPIO_CTLR), ZARD_IDX_IF_MATCH, (), n)
115+
116+ #define ZARD_GET_NGPIOS (i , ...) DT_PROP(GET_ARG_N(UTIL_INC(i), __VA_ARGS__), ngpios)
117+ #define ZARD_SUM_NGPIOS (...) \
118+ LISTIFY(NUM_VA_ARGS_LESS_1(__VA_ARGS__), ZARD_GET_NGPIOS, (+), __VA_ARGS__)
119+ #define ZARD_GLOBAL_GPIO_NUM_ (ph ) \
120+ ZARD_SUM_NGPIOS(GET_ARGS_FIRST_N(ZARD_MATCH_IDX(ph), ZARD_ALL_OKAY_GPIO_CTLR))
121+
122+ #define ZARD_GLOBAL_GPIO_NUM (ph ) \
123+ COND_CODE_1(IS_EQ(NUM_VA_ARGS(ZARD_GLOBAL_GPIO_NUM_(ph)), 0), \
124+ (0), (ZARD_GLOBAL_GPIO_NUM_(ph)))
125+
126+ #define ZARD_CONN_DN_ENUMS (n , p , i ) \
127+ UTIL_CAT(D, DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
128+ ZARD_GLOBAL_GPIO_NUM(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \
129+ DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0)
130+
131+ #define ZARD_CONN_AN_ENUMS (n , p , i ) \
132+ UTIL_CAT(A, DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \
133+ ZARD_GLOBAL_GPIO_NUM( \
134+ DT_MAP_ENTRY_PARENT_BY_IDX(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, i)) + \
135+ DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, i, 0)
136+
137+ #if DT_NODE_EXISTS (DT_ALIAS (led0 ))
138+ #define ZARD_LED_BUILTIN \
139+ ZARD_GLOBAL_GPIO_NUM(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)) + \
140+ DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)
141+ #endif
142+ #endif
143+
77144/*
78145 * expand as
79146 * enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS };
80147 */
81148enum digitalPins {
149+ #if DT_PROP_LEN_OR (DT_PATH (zephyr_user ), digital_pin_gpios , 0 ) > 0
82150 DT_FOREACH_PROP_ELEM_SEP (DT_PATH (zephyr_user ), digital_pin_gpios , DN_ENUMS , (, )),
151+ #elif defined(ZARD_CONNECTOR )
152+ DT_FOREACH_MAP_ENTRY_SEP (DT_NODELABEL (ZARD_CONNECTOR ), gpio_map , ZARD_CONN_DN_ENUMS , (, )),
153+ #endif
83154 NUM_OF_DIGITAL_PINS
84155 };
85156
@@ -88,8 +159,21 @@ enum digitalPins {
88159#define AN_ENUMS (n , p , i ) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \
89160 DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
90161 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 ) };
162+ #define ZARD_AN_ENUM_GLOBAL (n , p , i ) \
163+ ZARD_GLOBAL_GPIO_NUM(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin)
164+ enum analogPins {
165+ #if DT_NODE_HAS_PROP (DT_PATH (zephyr_user ), adc_pin_gpios )
166+ #if DT_NODE_HAS_PROP (DT_PATH (zephyr_user ), digital_pin_gpios )
167+ DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user ), adc_pin_gpios , AN_ENUMS )
168+ #else
169+ DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user ), adc_pin_gpios , ZARD_AN_ENUM_GLOBAL )
170+ #endif
171+ #elif defined(ZARD_ADC_CONNECTOR)
172+ DT_FOREACH_MAP_ENTRY_SEP (DT_NODELABEL (ZARD_ADC_CONNECTOR ), io_channel_map , ZARD_CONN_AN_ENUMS ,
173+ (, )),
174+ #endif
175+ NUM_OF_ANALOG_PINS
176+ };
93177
94178#endif
95179
0 commit comments