Skip to content

Commit 53da07d

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 8df999e commit 53da07d

2 files changed

Lines changed: 80 additions & 11 deletions

File tree

cores/arduino/wiring_analog.cpp

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

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

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

4655
size_t analog_pin_index(pin_size_t pinNumber) {
4756
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: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,36 @@
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) \
1832
DIGITAL_PIN_GPIOS_FIND_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
1933
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+
())
2046

2147
#ifdef __cplusplus
2248

@@ -44,29 +70,62 @@ static constexpr const struct device *gpio_ports[] = {DT_FOREACH_NODE(ZARD_GET_G
4470
static constexpr uint32_t gpio_ngpios[] = {DT_FOREACH_NODE(ZARD_GET_GPIO_NGPIOS)};
4571
static constexpr gpio_flags_t gpio_flags[] = {DT_FOREACH_NODE(ZARD_GET_GPIO_FLAGS)};
4672

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");
4976
#endif // digital_pin_gpios
5077

5178
#ifdef CONFIG_PWM
5279

5380
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+
};
5587

5688
/* pwm-pins node provides a mapping digital pin numbers to pwm channels */
5789
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));
59102

60103
#endif
61104

62105
#ifdef CONFIG_ADC
63106

64107
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+
};
66114

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 */
68116
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));
70129

71130
#endif
72131

@@ -187,7 +246,7 @@ inline int global_gpio_pin_configure(pin_size_t pinNumber, int flags) {
187246

188247
if (port) {
189248
return gpio_pin_configure(port, local_gpio_pin(pinNumber),
190-
flags | local_gpio_flags(pinNumber));
249+
flags | local_gpio_flags(pinNumber));
191250
} else {
192251
return -1;
193252
}

0 commit comments

Comments
 (0)