Skip to content

Commit 06bb336

Browse files
committed
dac
1 parent 54805ff commit 06bb336

2 files changed

Lines changed: 48 additions & 9 deletions

File tree

cores/arduino/Arduino.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,6 @@ enum analogPins {
105105
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), adc_pin_gpios, AN_ENUMS)
106106
};
107107

108-
// We provide analogReadResolution APIs
109-
void analogReadResolution(int bits);
110-
111108
#endif
112109

113110
#ifdef CONFIG_DAC
@@ -119,7 +116,10 @@ void analogReadResolution(int bits);
119116
#define DAC_ENUMS(n, p, i) DAC##i = i,
120117

121118
enum dacPins {
122-
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), dac_channels, DAC_ENUMS) NUM_OF_DACS
119+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), dac_channels)
120+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), dac_channels, DAC_ENUMS)
121+
#endif
122+
NUM_OF_DACS
123123
};
124124

125125
#endif
@@ -134,8 +134,14 @@ int digitalPinToInterrupt(pin_size_t pin);
134134
#define portOutputRegister(x) (x)
135135
#define portInputRegister(x) (x)
136136

137+
#if defiend(CONFIG_ADC)
138+
// We provide analogReadResolution APIs
137139
void analogReadResolution(int bits);
140+
#endif
141+
142+
#if defined(CONFIG_ADC) || defined(CONFIG_DAC)
138143
void analogWriteResolution(int bits);
144+
#endif
139145

140146
#include <variant.h>
141147

cores/arduino/zephyrCommon.cpp

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,10 @@ static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);
189189
},
190190

191191
static const struct dac_channel_cfg dac_ch_cfg[] = {
192-
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), dac_channels, DAC_CHANNEL_DEFINE)};
192+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), dac_channels)
193+
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), dac_channels, DAC_CHANNEL_DEFINE)
194+
#endif
195+
};
193196

194197
#endif
195198

@@ -342,16 +345,46 @@ void analogWrite(pin_size_t pinNumber, int value) {
342345
#endif
343346

344347
#ifdef CONFIG_DAC
348+
static bool dac_channel_initialized[NUM_OF_DACS];
349+
345350
void analogWrite(enum dacPins dacName, int value) {
351+
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), dac_channels)
352+
int ret = 0;
353+
346354
if (dacName >= NUM_OF_DACS) {
347355
return;
348356
}
349357

350-
dac_channel_setup(dac_dev, &dac_ch_cfg[dacName]);
358+
if (!dac_channel_initialized[dacName]) {
359+
if (!device_is_ready(dac_dev)) {
360+
return;
361+
}
362+
363+
ret = dac_channel_setup(dac_dev, &dac_ch_cfg[dacName]);
364+
if (ret != 0) {
365+
return;
366+
}
367+
dac_channel_initialized[dacName] = true;
368+
}
369+
370+
const uint32_t max_dac_value = (1U << dac_ch_cfg[dacName].resolution) - 1U;
371+
const uint32_t maxInput = (1U << _analog_write_resolution) - 1U;
351372

352-
const int max_dac_value = 1U << dac_ch_cfg[dacName].resolution;
353-
dac_write_value(dac_dev, dac_ch_cfg[dacName].channel_id,
354-
map(value, 0, 1 << _analog_write_resolution, 0, max_dac_value));
373+
if (value < 0) {
374+
value = 0;
375+
} else if (static_cast<uint32_t>(value) > maxInput) {
376+
value = static_cast<int>(maxInput);
377+
}
378+
379+
ret = dac_write_value(
380+
dac_dev,
381+
dac_ch_cfg[dacName].channel_id,
382+
static_cast<uint32_t>(map(static_cast<long>(value),
383+
0L,
384+
static_cast<long>(maxInput),
385+
0L,
386+
static_cast<long>(max_dac_value))));
387+
#endif
355388
}
356389
#endif
357390

0 commit comments

Comments
 (0)