|
1 | 1 | /* |
2 | 2 | * Copyright (c) 2022 Dhruva Gole |
| 3 | + * Copyright (c) 2026 TOKITA Hiroshi |
3 | 4 | * |
4 | 5 | * SPDX-License-Identifier: Apache-2.0 |
5 | 6 | */ |
|
14 | 15 | #include <zephyr/drivers/adc.h> |
15 | 16 | #include <zephyr/drivers/i2c.h> |
16 | 17 |
|
| 18 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios) |
| 19 | + |
17 | 20 | #define DIGITAL_PIN_EXISTS(n, p, i, dev, num) \ |
18 | 21 | (((dev == DT_REG_ADDR(DT_PHANDLE_BY_IDX(n, p, i))) && \ |
19 | 22 | (num == DT_PHA_BY_IDX(n, p, i, pin))) \ |
|
74 | 77 |
|
75 | 78 | #define DN_ENUMS(n, p, i) D##i = i |
76 | 79 |
|
| 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_CHECK_GPIO_CTLR(node_id) \ |
| 147 | + COND_CODE_1(DT_NODE_HAS_PROP(node_id, gpio_controller), (node_id,), ()) |
| 148 | + |
| 149 | +#define ZARD_ALL_GPIO_CTLR DT_FOREACH_NODE(ZARD_CHECK_GPIO_CTLR) |
| 150 | + |
| 151 | +#define ZARD_IDX_IF_MATCH(i, n) \ |
| 152 | + COND_CODE_1(DT_SAME_NODE(n, GET_ARG_N(UTIL_INC(i), ZARD_ALL_GPIO_CTLR)), (i), ()) |
| 153 | + |
| 154 | +#define ZARD_MATCH_IDX(n) \ |
| 155 | + LISTIFY(NUM_VA_ARGS_LESS_1(ZARD_ALL_GPIO_CTLR), ZARD_IDX_IF_MATCH, (), n) |
| 156 | + |
| 157 | +#define ZARD_GET_NGPIOS(i, ...) DT_PROP(GET_ARG_N(UTIL_INC(i), __VA_ARGS__), ngpios) |
| 158 | +#define ZARD_SUM_NGPIOS(...) \ |
| 159 | + LISTIFY(NUM_VA_ARGS(__VA_ARGS__), ZARD_GET_NGPIOS, (+), __VA_ARGS__) |
| 160 | + |
| 161 | +#define ZARD_GLOBAL_GPIO_OFFSET_(ph) \ |
| 162 | + ZARD_SUM_NGPIOS(GET_ARGS_FIRST_N(ZARD_MATCH_IDX(ph), ZARD_ALL_GPIO_CTLR)) |
| 163 | + |
| 164 | +#define ZARD_GLOBAL_GPIO_OFFSET(ph) \ |
| 165 | + COND_CODE_1(IS_EQ(NUM_VA_ARGS(ZARD_GLOBAL_GPIO_OFFSET_(ph)), 0), \ |
| 166 | + (0), (ZARD_GLOBAL_GPIO_OFFSET_(ph))) |
| 167 | + |
| 168 | +#define ZARD_CONNECTOR_PIN_IS_DIGITAL(node, num) \ |
| 169 | + UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \ |
| 170 | + DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _IS_DIGITAL_)), num) |
| 171 | + |
| 172 | +#define ZARD_CONNECTOR_PIN_IS_ANALOG(node, num) \ |
| 173 | + UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \ |
| 174 | + DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _IS_ANALOG_)), num) |
| 175 | + |
| 176 | +#define ZARD_CONNECTOR_PIN_NAME_D(node, num) \ |
| 177 | + UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \ |
| 178 | + DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _PIN_NAME_D_)), num) |
| 179 | + |
| 180 | +#define ZARD_CONNECTOR_PIN_NAME_A(node, num) \ |
| 181 | + UTIL_CAT(UTIL_CAT(ZARD_, UTIL_CAT( \ |
| 182 | + DT_STRING_UPPER_TOKEN_BY_IDX(node, compatible, 0), _PIN_NAME_A_)), num) |
| 183 | + |
| 184 | +#define ZARD_CONN_DN_ENUMS(n, p, i) \ |
| 185 | + COND_CODE_1(ZARD_CONNECTOR_PIN_IS_DIGITAL(DT_NODELABEL(ZARD_CONNECTOR), \ |
| 186 | + DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)), \ |
| 187 | + (ZARD_CONNECTOR_PIN_NAME_D(DT_NODELABEL(ZARD_CONNECTOR), \ |
| 188 | + DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \ |
| 189 | + ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \ |
| 190 | + DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0),), ()) |
| 191 | + |
| 192 | +#define ZARD_CONN_AN_ENUMS(n, p, i) \ |
| 193 | + COND_CODE_1(ZARD_CONNECTOR_PIN_IS_ANALOG(DT_NODELABEL(ZARD_CONNECTOR), \ |
| 194 | + DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)), \ |
| 195 | + (ZARD_CONNECTOR_PIN_NAME_A(DT_NODELABEL(ZARD_CONNECTOR), \ |
| 196 | + DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)) = \ |
| 197 | + ZARD_GLOBAL_GPIO_OFFSET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)) + \ |
| 198 | + DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0),), ()) |
| 199 | + |
| 200 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), builtin_led_gpios) && \ |
| 201 | + (DT_PROP_LEN(DT_PATH(zephyr_user), builtin_led_gpios) > 0) |
| 202 | +#define ZARD_LED_BUILTIN \ |
| 203 | + ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0)) + \ |
| 204 | + DT_PHA_BY_IDX(DT_PATH(zephyr_user), builtin_led_gpios, 0, pin) |
| 205 | +#elif DT_NODE_EXISTS(DT_ALIAS(led0)) |
| 206 | +#define ZARD_LED_BUILTIN \ |
| 207 | + ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(DT_ALIAS(led0), gpios, 0)) + \ |
| 208 | + DT_PHA_BY_IDX(DT_ALIAS(led0), gpios, 0, pin) |
| 209 | +#endif |
| 210 | +#endif |
| 211 | + |
77 | 212 | /* |
78 | 213 | * expand as |
79 | 214 | * enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS }; |
80 | 215 | */ |
81 | 216 | enum digitalPins { |
| 217 | +#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), digital_pin_gpios, 0) > 0 |
82 | 218 | DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, DN_ENUMS, (, )), |
83 | 219 | NUM_OF_DIGITAL_PINS |
| 220 | +#elif defined(ZARD_CONNECTOR) |
| 221 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_DN_ENUMS) |
| 222 | +#endif |
84 | 223 | }; |
85 | 224 |
|
86 | 225 | #ifdef CONFIG_ADC |
87 | 226 |
|
88 | 227 | #define AN_ENUMS(n, p, i) A ## i = DIGITAL_PIN_GPIOS_FIND_PIN( \ |
89 | 228 | DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \ |
90 | 229 | 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) }; |
| 230 | +#define ZARD_AN_ENUM_GLOBAL(n, p, i) \ |
| 231 | + ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin) |
| 232 | +enum analogPins { |
| 233 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios) |
| 234 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios) |
| 235 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS) |
| 236 | + NUM_OF_ANALOG_PINS |
| 237 | +#else |
| 238 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUM_GLOBAL) |
| 239 | +#endif |
| 240 | +#elif defined(ZARD_CONNECTOR) |
| 241 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_CONNECTOR), gpio_map, ZARD_CONN_AN_ENUMS) |
| 242 | +#endif |
| 243 | +}; |
93 | 244 |
|
94 | 245 | #endif |
95 | 246 |
|
|
0 commit comments