@@ -189,7 +189,10 @@ static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);
189189 },
190190
191191static 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+
345350void 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