|
13 | 13 | DIGITAL_PIN_GPIOS_FIND_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \ |
14 | 14 | DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)), |
15 | 15 |
|
| 16 | +#define PWM_PINS_GLOBAL(n, p, i) \ |
| 17 | + ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin), |
| 18 | +#define PWM_CONN_CHANNEL_DT(n, p, i) \ |
| 19 | + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \ |
| 20 | + ({ .dev = DEVICE_DT_GET(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \ |
| 21 | + .channel = DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0), \ |
| 22 | + .period = 255, },), \ |
| 23 | + ()) |
| 24 | +#define PWM_CONN_PINNUM(n, p, i) \ |
| 25 | + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \ |
| 26 | + (ZARD_CONNECTOR_PIN_NAME_D(DT_NODELABEL(ZARD_CONNECTOR), \ |
| 27 | + DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)),), \ |
| 28 | + ()) |
| 29 | + |
16 | 30 | #define ADC_DT_SPEC(n, p, i) ADC_DT_SPEC_GET_BY_IDX(n, i), |
17 | 31 | #define ADC_PINS(n, p, i) \ |
18 | | - DIGITAL_PIN_GPIOS_FIND_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \ |
19 | | - DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)), |
| 32 | + DIGITAL_PIN_GPIOS_FIND_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \ |
| 33 | + DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)), |
| 34 | +#define ADC_PINS_GLOBAL(n, p, i) \ |
| 35 | + ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin), |
| 36 | +#define ADC_CONN_CHANNEL_DT(n, p, i) \ |
| 37 | + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \ |
| 38 | + (ADC_DT_SPEC_STRUCT(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i), \ |
| 39 | + DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0)),), \ |
| 40 | + ()) |
| 41 | +#define ADC_CONN_PINNUM(n, p, i) \ |
| 42 | + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \ |
| 43 | + (ZARD_CONNECTOR_PIN_NAME_A(DT_NODELABEL(ZARD_CONNECTOR), \ |
| 44 | + DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)),), \ |
| 45 | + ()) |
| 46 | + |
20 | 47 |
|
21 | 48 | #ifdef __cplusplus |
22 | 49 |
|
@@ -47,22 +74,54 @@ static constexpr uint32_t gpio_ngpios[] = {DT_FOREACH_NODE(ZARD_GET_GPIO_NGPIOS) |
47 | 74 | #ifdef CONFIG_PWM |
48 | 75 |
|
49 | 76 | constexpr struct pwm_dt_spec arduino_pwm[] = { |
50 | | - DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwms, PWM_DT_SPEC)}; |
| 77 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), pwms) |
| 78 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwms, PWM_DT_SPEC) |
| 79 | +#elif defined(ZARD_PWM_CONNECTOR) |
| 80 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_PWM_CONNECTOR), pwm_map, PWM_CONN_CHANNEL_DT) |
| 81 | +#endif |
| 82 | +}; |
51 | 83 |
|
52 | 84 | /* pwm-pins node provides a mapping digital pin numbers to pwm channels */ |
53 | 85 | constexpr pin_size_t arduino_pwm_pins[] = { |
54 | | - DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwm_pin_gpios, PWM_PINS)}; |
| 86 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), pwm_pin_gpios) |
| 87 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios) |
| 88 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwm_pin_gpios, PWM_PINS) |
| 89 | +#else |
| 90 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwm_pin_gpios, PWM_PINS_GLOBAL) |
| 91 | +#endif |
| 92 | +#elif defined(ZARD_PWM_CONNECTOR) |
| 93 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_PWM_CONNECTOR), pwm_map, PWM_CONN_PINNUM) |
| 94 | +#endif |
| 95 | +}; |
| 96 | + |
| 97 | +BUILD_ASSERT(ARRAY_SIZE(arduino_pwm) == ARRAY_SIZE(arduino_pwm_pins)); |
55 | 98 |
|
56 | 99 | #endif |
57 | 100 |
|
58 | 101 | #ifdef CONFIG_ADC |
59 | 102 |
|
60 | 103 | constexpr struct adc_dt_spec arduino_adc[] = { |
61 | | - DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_DT_SPEC)}; |
| 104 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels) |
| 105 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_DT_SPEC) |
| 106 | +#elif defined(ZARD_ADC_CONNECTOR) |
| 107 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ADC_CONN_CHANNEL_DT) |
| 108 | +#endif |
| 109 | +}; |
62 | 110 |
|
63 | | -/* io-channel-pins node provides a mapping digital pin numbers to adc channels */ |
| 111 | +/* adc-pin-gpios provides a mapping digital pin numbers to adc channels */ |
64 | 112 | constexpr pin_size_t arduino_analog_pins[] = { |
65 | | - DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS)}; |
| 113 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios) |
| 114 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios) |
| 115 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS) |
| 116 | +#else |
| 117 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS_GLOBAL) |
| 118 | +#endif |
| 119 | +#elif defined(ZARD_ADC_CONNECTOR) |
| 120 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ADC_CONN_PINNUM) |
| 121 | +#endif |
| 122 | +}; |
| 123 | + |
| 124 | +BUILD_ASSERT(ARRAY_SIZE(arduino_adc) == ARRAY_SIZE(arduino_analog_pins)); |
66 | 125 |
|
67 | 126 | #endif |
68 | 127 |
|
|
0 commit comments