Skip to content

Commit 44c880d

Browse files
committed
cores: arduino: zephyrCommon: Generate ADC config from connector definition
Like digital pins, ADCs are also defined from connectors. Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
1 parent 860a00f commit 44c880d

1 file changed

Lines changed: 42 additions & 4 deletions

File tree

cores/arduino/zephyrCommon.cpp

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,17 +321,55 @@ size_t pwm_pin_index(pin_size_t pinNumber) {
321321
#define ADC_PINS(n, p, i) \
322322
DIGITAL_PIN_GPIOS_FIND_PIN(DT_REG_ADDR(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), p, i)), \
323323
DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)),
324+
#define ADC_PINS_GLOBAL(n, p, i) \
325+
ZARD_GLOBAL_GPIO_OFFSET(DT_PHANDLE_BY_IDX(n, p, i)) + DT_PHA_BY_IDX(n, p, i, pin),
324326
#define ADC_CH_CFG(n, p, i) arduino_adc[i].channel_cfg,
327+
#define ADC_CONN_CHANNEL_CFG(n, p, i) \
328+
COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \
329+
(ADC_CHANNEL_CFG_DT(ADC_CHANNEL_DT_NODE(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i), \
330+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0))),), \
331+
())
332+
#define ADC_CONN_CHANNEL_DT(n, p, i) \
333+
COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \
334+
(ADC_DT_SPEC_STRUCT(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i), \
335+
DT_MAP_ENTRY_PARENT_SPECIFIER_BY_IDX(n, p, i, 0)),), \
336+
())
337+
#define ADC_CONN_PINNUM(n, p, i) \
338+
COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MAP_ENTRY_PARENT_BY_IDX(n, p, i)), \
339+
(ZARD_CONNECTOR_PIN_NAME_A(DT_NODELABEL(ZARD_CONNECTOR), \
340+
DT_MAP_ENTRY_CHILD_SPECIFIER_BY_IDX(n, p, i, 0)),), \
341+
())
325342

326343
static const struct adc_dt_spec arduino_adc[] = {
327-
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_DT_SPEC)};
344+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels)
345+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_DT_SPEC)
346+
#elif defined(ZARD_ADC_CONNECTOR)
347+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ADC_CONN_CHANNEL_DT)
348+
#endif
349+
};
328350

329-
/* io-channel-pins node provides a mapping digital pin numbers to adc channels */
351+
/* adc-pin-gpios provides a mapping digital pin numbers to adc channels */
330352
const pin_size_t arduino_analog_pins[] = {
331-
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS)};
353+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), adc_pin_gpios)
354+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), digital_pin_gpios)
355+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS)
356+
#else
357+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, ADC_PINS_GLOBAL)
358+
#endif
359+
#elif defined(ZARD_ADC_CONNECTOR)
360+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ADC_CONN_PINNUM)
361+
#endif
362+
};
332363

333364
struct adc_channel_cfg channel_cfg[] = {
334-
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_CH_CFG)};
365+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels)
366+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels, ADC_CH_CFG)
367+
#elif defined(ZARD_ADC_CONNECTOR)
368+
DT_FOREACH_MAP_ENTRY(DT_NODELABEL(ZARD_ADC_CONNECTOR), io_channel_map, ADC_CONN_CHANNEL_CFG)
369+
#endif
370+
};
371+
372+
BUILD_ASSERT(ARRAY_SIZE(arduino_adc) == ARRAY_SIZE(arduino_analog_pins));
335373

336374
size_t analog_pin_index(pin_size_t pinNumber) {
337375
for (size_t i = 0; i < ARRAY_SIZE(arduino_analog_pins); i++) {

0 commit comments

Comments
 (0)