11/*
22 * Copyright (c) 2022 Dhruva Gole
3+ * Copyright (c) 2025 TOKITA Hiroshi
34 *
45 * SPDX-License-Identifier: Apache-2.0
56 */
1415#include <zephyr/drivers/adc.h>
1516#include <zephyr/drivers/i2c.h>
1617
17- #define DIGITAL_PIN_EXISTS(n, p, i, dev, num) \
18- (((dev == DT_REG_ADDR(DT_PHANDLE_BY_IDX(n, p, i))) && \
19- (num == DT_PHA_BY_IDX(n, p, i, pin))) \
20- ? 1 \
21- : 0)
22-
23- /* Check all pins are defined only once */
24- #define DIGITAL_PIN_CHECK_UNIQUE(i, _) \
25- ((DT_FOREACH_PROP_ELEM_SEP_VARGS( \
26- DT_PATH(zephyr_user), digital_pin_gpios, DIGITAL_PIN_EXISTS, (+), \
27- DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), digital_pin_gpios, i)), \
28- DT_PHA_BY_IDX(DT_PATH(zephyr_user), digital_pin_gpios, i, pin))) == 1)
29-
30- #if !LISTIFY(DT_PROP_LEN(DT_PATH(zephyr_user), digital_pin_gpios), DIGITAL_PIN_CHECK_UNIQUE, (&&))
31- #error "digital_pin_gpios has duplicate definition"
32- #endif
33-
34- #undef DIGITAL_PIN_CHECK_UNIQUE
35-
36- #ifndef LED_BUILTIN
37-
38- /* Return the index of it if matched, oterwise return 0 */
39- #define LED_BUILTIN_INDEX_BY_REG_AND_PINNUM(n, p, i, dev, num) \
40- (DIGITAL_PIN_EXISTS(n, p, i, dev, num) ? i : 0)
41-
42- /* Only matched pin returns non-zero value, so the sum is matched pin's index */
43- #define DIGITAL_PIN_GPIOS_FIND_PIN(dev, pin) \
44- DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_PATH(zephyr_user), digital_pin_gpios, \
45- LED_BUILTIN_INDEX_BY_REG_AND_PINNUM, (+), dev, pin)
46-
47- #if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), builtin_led_gpios) && \
48- (DT_PROP_LEN(DT_PATH(zephyr_user), builtin_led_gpios) > 0)
49-
50- #if !(DT_FOREACH_PROP_ELEM_SEP_VARGS( \
51- DT_PATH(zephyr_user), digital_pin_gpios, DIGITAL_PIN_EXISTS, (+), \
52- DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)), \
53- DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin)) > 0)
54- #warning "pin not found in digital_pin_gpios"
55- #else
56- #define LED_BUILTIN \
57- DIGITAL_PIN_GPIOS_FIND_PIN( \
58- DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)), \
59- DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin))
60- #endif
61-
62- /* If digital-pin-gpios is not defined, tries to use the led0 alias */
63- #elif DT_NODE_EXISTS(DT_ALIAS(led0))
64-
65- #if !(DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_PATH(zephyr_user), digital_pin_gpios, DIGITAL_PIN_EXISTS, \
66- (+), DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)), \
67- DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin)) > 0)
68- #warning "pin not found in digital_pin_gpios"
69- #else
70- #define LED_BUILTIN \
71- DIGITAL_PIN_GPIOS_FIND_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)), \
72- DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin))
73- #endif
74-
75- #endif // builtin_led_gpios
76-
77- #endif // LED_BUILTIN
78-
79- #define DN_ENUMS(n, p, i) D##i = i
18+ #define ZARD_ADD_NGPIOS(i, n, p) DT_PROP(DT_PROP_BY_IDX(n, p, i), ngpios) +
19+ #define ZARD_ACCUM_NGPIOS(n, p, i, nd) \
20+ COND_CODE_1(DT_SAME_NODE(DT_PROP_BY_IDX(n, p, i), nd), \
21+ (LISTIFY(i, ZARD_ADD_NGPIOS, (), n, p)), ())
22+ #define ZARD_GLOBAL_GPIO_NUM(n, p, i) \
23+ DT_FOREACH_PROP_ELEM_VARGS(DT_PATH(zephyr_user), gpio_ports, ZARD_ACCUM_NGPIOS, \
24+ DT_PHANDLE_BY_IDX(n, p, i)) \
25+ DT_PHA_BY_IDX(n, p, i, pin)
8026
8127/*
8228 * expand as
83- * enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS };
29+ * enum digitalPins { D0, D1, ... };
8430 */
31+ #define ZARD_DN_ENUMS(n, p, i) D##i = ZARD_GLOBAL_GPIO_NUM(n, p, i)
8532enum digitalPins {
86- DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, DN_ENUMS , (, )),
87- NUM_OF_DIGITAL_PINS
33+ DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, ZARD_DN_ENUMS , (, )),
34+ NUM_OF_DIGITAL_PINS
8835};
8936
9037#ifdef CONFIG_ADC
91-
92- #define AN_ENUMS(n, p, i) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \
93- DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
94- DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)),
95- enum analogPins { DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user),
96- adc_pin_gpios, AN_ENUMS) };
97-
38+ #define ZARD_AN_ENUMS(n, p, i) A##i = ZARD_GLOBAL_GPIO_NUM(n, p, i)
39+ enum analogPins {
40+ DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUMS, (, )),
41+ NUM_OF_ANALOG_PINS
42+ };
9843#endif
9944
10045void interrupts(void);
@@ -103,6 +48,16 @@ void noInterrupts(void);
10348int digitalPinToInterrupt(pin_size_t pin);
10449
10550#include <variant.h>
51+
52+ #ifndef LED_BUILTIN
53+ #if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), builtin_led_gpios) \
54+ && (DT_PROP_LEN(DT_PATH(zephyr_user), builtin_led_gpios) > 0)
55+ #define LED_BUILTIN ZARD_GLOBAL_GPIO_NUM(DT_PATH(zephyr_user), builtin_led_gpios, 0)
56+ #elif DT_NODE_EXISTS(DT_ALIAS(led0))
57+ #define LED_BUILTIN ZARD_GLOBAL_GPIO_NUM(DT_ALIAS(led0), gpios, 0)
58+ #endif
59+ #endif // LED_BUILTIN
60+
10661#ifdef __cplusplus
10762#include <zephyrPrint.h>
10863#include <zephyrSerial.h>
0 commit comments