|  | 
| 1 | 1 | /* | 
| 2 | 2 |  * Copyright (c) 2022 Dhruva Gole | 
|  | 3 | + * Copyright (c) 2025 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 | 
 | 
| 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 | 
|  | 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) | 
| 35 | 26 | 
 | 
| 36 | 27 | #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 */ | 
|  | 28 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), builtin_led_gpios)                                      \ | 
|  | 29 | +  && (DT_PROP_LEN(DT_PATH(zephyr_user), builtin_led_gpios) > 0) | 
|  | 30 | +#define LED_BUILTIN ZARD_GLOBAL_GPIO_NUM(DT_PATH(zephyr_user), builtin_led_gpios, 0) | 
| 63 | 31 | #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)) | 
|  | 32 | +#define LED_BUILTIN ZARD_GLOBAL_GPIO_NUM(DT_ALIAS(led0), gpios, 0) | 
| 73 | 33 | #endif | 
| 74 |  | - | 
| 75 |  | -#endif // builtin_led_gpios | 
| 76 |  | - | 
| 77 | 34 | #endif // LED_BUILTIN | 
| 78 | 35 | 
 | 
| 79 |  | -#define DN_ENUMS(n, p, i) D##i = i | 
| 80 |  | - | 
| 81 | 36 | /* | 
| 82 | 37 |  * expand as | 
| 83 |  | - * enum digitalPins { D0, D1, ... LED... NUM_OF_DIGITAL_PINS }; | 
|  | 38 | + * enum digitalPins { D0, D1, ... }; | 
| 84 | 39 |  */ | 
|  | 40 | +#define ZARD_DN_ENUMS(n, p, i) D##i = ZARD_GLOBAL_GPIO_NUM(n, p, i) | 
| 85 | 41 | enum digitalPins { | 
| 86 |  | -	DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, DN_ENUMS, (, )), | 
| 87 |  | -	NUM_OF_DIGITAL_PINS | 
|  | 42 | +  DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, ZARD_DN_ENUMS, (, )), | 
|  | 43 | +  NUM_OF_DIGITAL_PINS | 
| 88 | 44 | }; | 
| 89 | 45 | 
 | 
| 90 | 46 | #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 |  | - | 
|  | 47 | +#define ZARD_AN_ENUMS(n, p, i) A##i = ZARD_GLOBAL_GPIO_NUM(n, p, i) | 
|  | 48 | +enum analogPins { | 
|  | 49 | +  DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), adc_pin_gpios, ZARD_AN_ENUMS, (, )), | 
|  | 50 | +  NUM_OF_ANALOG_PINS | 
|  | 51 | +}; | 
| 98 | 52 | #endif | 
| 99 | 53 | 
 | 
| 100 | 54 | void interrupts(void); | 
|  | 
0 commit comments