@@ -188,9 +188,13 @@ static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);
188188 .buffered = true , \
189189 },
190190
191+ #if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), dac_channels)
191192static const struct dac_channel_cfg dac_ch_cfg[] = {
192193 DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user), dac_channels, DAC_CHANNEL_DEFINE)};
193194
195+ static bool dac_channel_initialized[NUM_OF_DACS];
196+ #endif
197+
194198#endif
195199
196200#endif // CONFIG_DAC
@@ -342,15 +346,36 @@ void analogWrite(pin_size_t pinNumber, int value) {
342346
343347#ifdef CONFIG_DAC
344348void analogWrite (enum dacPins dacName, int value) {
349+ #if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), dac_channels)
350+ const int maxInput = BIT (_analog_write_resolution) - 1U ;
351+ int ret = 0 ;
352+
345353 if (dacName >= NUM_OF_DACS) {
346354 return ;
347355 }
348356
349- dac_channel_setup (dac_dev, &dac_ch_cfg[dacName]);
357+ if (!dac_channel_initialized[dacName]) {
358+ if (!device_is_ready (dac_dev)) {
359+ return ;
360+ }
350361
351- const int max_dac_value = 1U << dac_ch_cfg[dacName].resolution ;
352- dac_write_value (dac_dev, dac_ch_cfg[dacName].channel_id ,
353- map (value, 0 , 1 << _analog_write_resolution, 0 , max_dac_value));
362+ ret = dac_channel_setup (dac_dev, &dac_ch_cfg[dacName]);
363+ if (ret != 0 ) {
364+ return ;
365+ }
366+ dac_channel_initialized[dacName] = true ;
367+ }
368+
369+ value = CLAMP (value, 0 , maxInput);
370+
371+ const int max_dac_value = BIT (dac_ch_cfg[dacName].resolution ) - 1 ;
372+ const uint32_t output = map (value, 0 , maxInput, 0 , max_dac_value);
373+
374+ (void )dac_write_value (dac_dev, dac_ch_cfg[dacName].channel_id , output);
375+ #else
376+ ARG_UNUSED (dacName);
377+ ARG_UNUSED (value);
378+ #endif
354379}
355380#endif
356381
0 commit comments