@@ -187,6 +187,28 @@ size_t analog_pin_index(pin_size_t pinNumber) {
187187
188188#endif // CONFIG_ADC
189189
190+ #ifdef CONFIG_DAC
191+
192+ #if (DT_NODE_HAS_PROP(DT_PATH(zephyr_user), dac))
193+
194+ #define DAC_NODE DT_PHANDLE (DT_PATH(zephyr_user), dac)
195+ #define DAC_RESOLUTION DT_PROP (DT_PATH(zephyr_user), dac_resolution)
196+ static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);
197+
198+ #define DAC_CHANNEL_DEFINE (n, p, i ) \
199+ { \
200+ .channel_id = DT_PROP_BY_IDX (n, p, i), \
201+ .resolution = DAC_RESOLUTION, \
202+ .buffered = true , \
203+ },
204+
205+ static const struct dac_channel_cfg dac_ch_cfg[] =
206+ { DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user), dac_channels, DAC_CHANNEL_DEFINE) };
207+
208+ #endif
209+
210+ #endif // CONFIG_DAC
211+
190212static unsigned int irq_key;
191213static bool interrupts_disabled = false ;
192214} // namespace
@@ -297,6 +319,16 @@ unsigned long millis(void) {
297319 return k_uptime_get_32 ();
298320}
299321
322+ #if defined(CONFIG_DAC) || defined(CONFIG_PWM)
323+ static int _analog_write_resolution = 8 ;
324+ void analogWriteResolution (int bits) {
325+ _analog_write_resolution = bits;
326+ }
327+ int analogWriteResolution () {
328+ return _analog_write_resolution;
329+ }
330+ #endif
331+
300332#ifdef CONFIG_PWM
301333
302334void analogWrite (pin_size_t pinNumber, int value)
@@ -311,6 +343,8 @@ void analogWrite(pin_size_t pinNumber, int value)
311343 return ;
312344 }
313345
346+ value = map (value, 0 , 1 << _analog_write_resolution, 0 , arduino_pwm[idx].period );
347+
314348 if (((uint32_t )value) > arduino_pwm[idx].period ) {
315349 value = arduino_pwm[idx].period ;
316350 } else if (value < 0 ) {
@@ -326,6 +360,21 @@ void analogWrite(pin_size_t pinNumber, int value)
326360
327361#endif
328362
363+ #ifdef CONFIG_DAC
364+ void analogWrite (enum dacPins dacName, int value)
365+ {
366+ if (dacName >= NUM_OF_DACS) {
367+ return ;
368+ }
369+
370+ dac_channel_setup (dac_dev, &dac_ch_cfg[dacName]);
371+
372+ const int max_dac_value = 1U << dac_ch_cfg[dacName].resolution ;
373+ dac_write_value (dac_dev, dac_ch_cfg[dacName].channel_id , map (value, 0 , 1 << _analog_write_resolution, 0 , max_dac_value));
374+ }
375+ #endif
376+
377+
329378#ifdef CONFIG_ADC
330379
331380void analogReference (uint8_t mode)
0 commit comments