|
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 | 32 | DIGITAL_PIN_GPIOS_FIND_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \ |
19 | 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 | + ()) |
20 | 46 |
|
21 | 47 | #ifdef __cplusplus |
22 | 48 |
|
@@ -44,29 +70,62 @@ static constexpr const struct device *gpio_ports[] = {DT_FOREACH_NODE(ZARD_GET_G |
44 | 70 | static constexpr uint32_t gpio_ngpios[] = {DT_FOREACH_NODE(ZARD_GET_GPIO_NGPIOS)}; |
45 | 71 | static constexpr gpio_flags_t gpio_flags[] = {DT_FOREACH_NODE(ZARD_GET_GPIO_FLAGS)}; |
46 | 72 |
|
47 | | -BUILD_ASSERT(ARRAY_SIZE(gpio_ports) > 0, |
48 | | - "No gpio-controller nodes found: cannot derive Arduino pins from connector definition"); |
| 73 | +BUILD_ASSERT( |
| 74 | + ARRAY_SIZE(gpio_ports) > 0, |
| 75 | + "No gpio-controller nodes found: cannot derive Arduino pins from connector definition"); |
49 | 76 | #endif // digital_pin_gpios |
50 | 77 |
|
51 | 78 | #ifdef CONFIG_PWM |
52 | 79 |
|
53 | 80 | constexpr struct pwm_dt_spec arduino_pwm[] = { |
54 | | - DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwms, PWM_DT_SPEC)}; |
| 81 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), pwms) |
| 82 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwms, PWM_DT_SPEC) |
| 83 | +#elif defined(ZARD_PWM_CONNECTOR) |
| 84 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_PWM_CONNECTOR), pwm_map, PWM_CONN_CHANNEL_DT) |
| 85 | +#endif |
| 86 | +}; |
55 | 87 |
|
56 | 88 | /* pwm-pins node provides a mapping digital pin numbers to pwm channels */ |
57 | 89 | constexpr pin_size_t arduino_pwm_pins[] = { |
58 | | - DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwm_pin_gpios, PWM_PINS)}; |
| 90 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), pwm_pin_gpios) |
| 91 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios) |
| 92 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwm_pin_gpios, PWM_PINS) |
| 93 | +#else |
| 94 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), pwm_pin_gpios, PWM_PINS_GLOBAL) |
| 95 | +#endif |
| 96 | +#elif defined(ZARD_PWM_CONNECTOR) |
| 97 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_PWM_CONNECTOR), pwm_map, PWM_CONN_PINNUM) |
| 98 | +#endif |
| 99 | +}; |
| 100 | + |
| 101 | +BUILD_ASSERT(ARRAY_SIZE(arduino_pwm) == ARRAY_SIZE(arduino_pwm_pins)); |
59 | 102 |
|
60 | 103 | #endif |
61 | 104 |
|
62 | 105 | #ifdef CONFIG_ADC |
63 | 106 |
|
64 | 107 | constexpr struct adc_dt_spec arduino_adc[] = { |
65 | | - DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_DT_SPEC)}; |
| 108 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels) |
| 109 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_DT_SPEC) |
| 110 | +#elif defined(ZARD_ADC_CONNECTOR) |
| 111 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ADC_CONN_CHANNEL_DT) |
| 112 | +#endif |
| 113 | +}; |
66 | 114 |
|
67 | | -/* io-channel-pins node provides a mapping digital pin numbers to adc channels */ |
| 115 | +/* adc-pin-gpios provides a mapping digital pin numbers to adc channels */ |
68 | 116 | constexpr pin_size_t arduino_analog_pins[] = { |
69 | | - DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS)}; |
| 117 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios) |
| 118 | +#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios) |
| 119 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS) |
| 120 | +#else |
| 121 | + DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS_GLOBAL) |
| 122 | +#endif |
| 123 | +#elif defined(ZARD_ADC_CONNECTOR) |
| 124 | + DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ADC_CONN_PINNUM) |
| 125 | +#endif |
| 126 | +}; |
| 127 | + |
| 128 | +BUILD_ASSERT(ARRAY_SIZE(arduino_adc) == ARRAY_SIZE(arduino_analog_pins)); |
70 | 129 |
|
71 | 130 | #endif |
72 | 131 |
|
@@ -187,7 +246,7 @@ inline int global_gpio_pin_configure(pin_size_t pinNumber, int flags) { |
187 | 246 |
|
188 | 247 | if (port) { |
189 | 248 | return gpio_pin_configure(port, local_gpio_pin(pinNumber), |
190 | | - flags | local_gpio_flags(pinNumber)); |
| 249 | + flags | local_gpio_flags(pinNumber)); |
191 | 250 | } else { |
192 | 251 | return -1; |
193 | 252 | } |
|
0 commit comments