@@ -163,7 +163,7 @@ size_t pwm_pin_index(pin_size_t pinNumber) {
163163 DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)),
164164#define ADC_CH_CFG (n,p,i ) arduino_adc[i].channel_cfg,
165165
166- const struct adc_dt_spec arduino_adc[] =
166+ static const struct adc_dt_spec arduino_adc[] =
167167 { DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user), io_channels, ADC_DT_SPEC) };
168168
169169/* io-channel-pins node provides a mapping digital pin numbers to adc channels */
@@ -184,6 +184,28 @@ size_t analog_pin_index(pin_size_t pinNumber) {
184184
185185#endif // CONFIG_ADC
186186
187+ #ifdef CONFIG_DAC
188+
189+ #if (DT_NODE_HAS_PROP(DT_PATH(zephyr_user), dac))
190+
191+ #define DAC_NODE DT_PHANDLE (DT_PATH(zephyr_user), dac)
192+ #define DAC_RESOLUTION DT_PROP (DT_PATH(zephyr_user), dac_resolution)
193+ static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);
194+
195+ #define DAC_CHANNEL_DEFINE (n, p, i ) \
196+ { \
197+ .channel_id = DT_PROP_BY_IDX (n, p, i), \
198+ .resolution = DAC_RESOLUTION, \
199+ .buffered = true , \
200+ },
201+
202+ static const struct dac_channel_cfg dac_ch_cfg[] =
203+ { DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user), dac_channels, DAC_CHANNEL_DEFINE) };
204+
205+ #endif
206+
207+ #endif // CONFIG_DAC
208+
187209static unsigned int irq_key;
188210static bool interrupts_disabled = false ;
189211}
@@ -276,6 +298,16 @@ unsigned long micros(void) {
276298
277299unsigned long millis (void ) { return k_uptime_get_32 (); }
278300
301+ #if defined(CONFIG_DAC) || defined(CONFIG_PWM)
302+ static int _analog_write_resolution = 8 ;
303+ void analogWriteResolution (int bits) {
304+ _analog_write_resolution = bits;
305+ }
306+ int analogWriteResolution () {
307+ return _analog_write_resolution;
308+ }
309+ #endif
310+
279311#ifdef CONFIG_PWM
280312
281313void analogWrite (pin_size_t pinNumber, int value)
@@ -290,6 +322,8 @@ void analogWrite(pin_size_t pinNumber, int value)
290322 return ;
291323 }
292324
325+ value = map (value, 0 , 1 << _analog_write_resolution, 0 , arduino_pwm[idx].period );
326+
293327 if (((uint32_t )value) > arduino_pwm[idx].period ) {
294328 value = arduino_pwm[idx].period ;
295329 } else if (value < 0 ) {
@@ -305,6 +339,21 @@ void analogWrite(pin_size_t pinNumber, int value)
305339
306340#endif
307341
342+ #ifdef CONFIG_DAC
343+ void analogWrite (enum dacPins dacName, int value)
344+ {
345+ if (dacName >= NUM_OF_DACS) {
346+ return ;
347+ }
348+
349+ dac_channel_setup (dac_dev, &dac_ch_cfg[dacName]);
350+
351+ const int max_dac_value = 1U << dac_ch_cfg[dacName].resolution ;
352+ dac_write_value (dac_dev, dac_ch_cfg[dacName].channel_id , map (value, 0 , 1 << _analog_write_resolution, 0 , max_dac_value));
353+ }
354+ #endif
355+
356+
308357#ifdef CONFIG_ADC
309358
310359void analogReference (uint8_t mode)
0 commit comments