@@ -190,9 +190,13 @@ static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);
190190 .buffered = true , \
191191 },
192192
193+ #if DT_PROP_LEN_OR(DT_PATH(zephyr_user), dac_channels, 0) > 0
193194static const struct dac_channel_cfg dac_ch_cfg[] = {
194195 DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user), dac_channels, DAC_CHANNEL_DEFINE)};
195196
197+ static bool dac_channel_initialized[NUM_OF_DACS];
198+ #endif
199+
196200#endif
197201
198202#endif // CONFIG_DAC
@@ -417,15 +421,36 @@ void analogWrite(pin_size_t pinNumber, int value) {
417421
418422#ifdef CONFIG_DAC
419423void analogWrite (enum dacPins dacName, int value) {
424+ #if DT_PROP_LEN_OR(DT_PATH(zephyr_user), dac_channels, 0) > 0
425+ const int maxInput = BIT (_analog_write_resolution) - 1U ;
426+ int ret = 0 ;
427+
420428 if (dacName >= NUM_OF_DACS) {
421429 return ;
422430 }
423431
424- dac_channel_setup (dac_dev, &dac_ch_cfg[dacName]);
432+ if (!dac_channel_initialized[dacName]) {
433+ if (!device_is_ready (dac_dev)) {
434+ return ;
435+ }
425436
426- const int max_dac_value = 1U << dac_ch_cfg[dacName].resolution ;
427- dac_write_value (dac_dev, dac_ch_cfg[dacName].channel_id ,
428- map (value, 0 , 1 << _analog_write_resolution, 0 , max_dac_value));
437+ ret = dac_channel_setup (dac_dev, &dac_ch_cfg[dacName]);
438+ if (ret != 0 ) {
439+ return ;
440+ }
441+ dac_channel_initialized[dacName] = true ;
442+ }
443+
444+ value = CLAMP (value, 0 , maxInput);
445+
446+ const int max_dac_value = BIT (dac_ch_cfg[dacName].resolution ) - 1 ;
447+ const uint32_t output = map (value, 0 , maxInput, 0 , max_dac_value);
448+
449+ (void )dac_write_value (dac_dev, dac_ch_cfg[dacName].channel_id , output);
450+ #else
451+ ARG_UNUSED (dacName);
452+ ARG_UNUSED (value);
453+ #endif
429454}
430455#endif
431456
0 commit comments