Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion cores/arduino/Arduino.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,10 @@ void analogReadResolution(int bits);
#define DAC_ENUMS(n, p, i) DAC##i = i,

enum dacPins {
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), dac_channels, DAC_ENUMS) NUM_OF_DACS
#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), dac_channels, 0) > 0
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), dac_channels, DAC_ENUMS)
#endif
NUM_OF_DACS
};

#endif
Expand Down
39 changes: 32 additions & 7 deletions cores/arduino/zephyrCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,9 +201,13 @@ static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);
.buffered = true, \
},

#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), dac_channels, 0) > 0
static const struct dac_channel_cfg dac_ch_cfg[] = {
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), dac_channels, DAC_CHANNEL_DEFINE)};

static bool dac_channel_initialized[NUM_OF_DACS];
#endif

#endif

#endif // CONFIG_DAC
Expand Down Expand Up @@ -346,18 +350,39 @@ void analogWrite(pin_size_t pinNumber, int value) {

#ifdef CONFIG_DAC
void analogWrite(enum dacPins dacName, int value) {
#if DT_PROP_LEN_OR(DT_PATH(zephyr_user), dac_channels, 0) > 0
const int maxInput = BIT(_analog_write_resolution) - 1U;
int ret = 0;

if (dacName >= NUM_OF_DACS) {
return;
}

// TODO: add reverse map to find pin name from DAC* define
// In the meantime, consider A0 == DAC0
_reinit_peripheral_if_needed((pin_size_t)(dacName + A0), dac_dev);
dac_channel_setup(dac_dev, &dac_ch_cfg[dacName]);
if (!dac_channel_initialized[dacName]) {
if (!device_is_ready(dac_dev)) {
return;
}

const int max_dac_value = 1U << dac_ch_cfg[dacName].resolution;
dac_write_value(dac_dev, dac_ch_cfg[dacName].channel_id,
map(value, 0, 1 << _analog_write_resolution, 0, max_dac_value));
// TODO: add reverse map to find pin name from DAC* define
// In the meantime, consider A0 == DAC0
_reinit_peripheral_if_needed((pin_size_t)(dacName + A0), dac_dev);
ret = dac_channel_setup(dac_dev, &dac_ch_cfg[dacName]);
Comment thread
soburi marked this conversation as resolved.
if (ret != 0) {
return;
}
dac_channel_initialized[dacName] = true;
}

value = CLAMP(value, 0, maxInput);

const int max_dac_value = BIT(dac_ch_cfg[dacName].resolution) - 1;
const uint32_t output = map(value, 0, maxInput, 0, max_dac_value);

(void)dac_write_value(dac_dev, dac_ch_cfg[dacName].channel_id, output);
#else
ARG_UNUSED(dacName);
ARG_UNUSED(value);
#endif
}
#endif

Expand Down
Loading