Skip to content

Commit b5c0676

Browse files
committed
cores: Generate ADC/PWM config from connector definition
Like digital pins, ADCs and PWMs are also defined from connectors. Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
1 parent 0abcb2e commit b5c0676

2 files changed

Lines changed: 79 additions & 10 deletions

File tree

cores/arduino/wiring_analog.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@
1111
using namespace zephyr::arduino;
1212

1313
#define ADC_CH_CFG(n, p, i) arduino_adc[i].channel_cfg,
14-
14+
#define ADC_CONN_CHANNEL_CFG(n, p, i) \
15+
COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \
16+
(ADC_CHANNEL_CFG_DT(ADC_CHANNEL_DT_NODE(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i), \
17+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0))),), \
18+
())
1519
#define DAC_NODE DT_PHANDLE(DT_PATH(zephyr_user), dac)
1620
#define DAC_RESOLUTION DT_PROP(DT_PATH(zephyr_user), dac_resolution)
1721
#define DAC_CHANNEL_DEFINE(n, p, i) \
@@ -40,7 +44,12 @@ size_t pwm_pin_index(pin_size_t pinNumber) {
4044
#ifdef CONFIG_ADC
4145

4246
struct adc_channel_cfg channel_cfg[] = {
43-
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_CH_CFG)};
47+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels)
48+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_CH_CFG)
49+
#elif defined(ZARD_ADC_CONNECTOR)
50+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ADC_CONN_CHANNEL_CFG)
51+
#endif
52+
};
4453

4554
size_t analog_pin_index(pin_size_t pinNumber) {
4655
for (size_t i = 0; i < ARRAY_SIZE(arduino_analog_pins); i++) {
@@ -77,7 +86,8 @@ int _analog_write_resolution = 8;
7786
// Note: We can not update the arduino_adc structure as it is read only...
7887
static int read_resolution = 10;
7988

80-
uint32_t map64(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) {
89+
__maybe_unused uint32_t map64(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min,
90+
uint32_t out_max) {
8191
return ((uint64_t)(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min);
8292
}
8393

cores/arduino/wiring_private.h

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,37 @@
1313
DIGITAL_PIN_GPIOS_FIND_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
1414
DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)),
1515

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+
1630
#define ADC_DT_SPEC(n, p, i) ADC_DT_SPEC_GET_BY_IDX(n, i),
1731
#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+
2047

2148
#ifdef __cplusplus
2249

@@ -47,22 +74,54 @@ static constexpr uint32_t gpio_ngpios[] = {DT_FOREACH_NODE(ZARD_GET_GPIO_NGPIOS)
4774
#ifdef CONFIG_PWM
4875

4976
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+
};
5183

5284
/* pwm-pins node provides a mapping digital pin numbers to pwm channels */
5385
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));
5598

5699
#endif
57100

58101
#ifdef CONFIG_ADC
59102

60103
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+
};
62110

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 */
64112
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));
66125

67126
#endif
68127

0 commit comments

Comments
 (0)