AD5676

AD5676 nanoDAC+ IIO DAC Linux Driver.

Supported Devices

This driver supports the

Reference Circuits

Evaluation Boards

Description

This is a Linux industrial I/O (Linux Industrial I/O Subsystem) subsystem driver, targeting multi-channel serial interface DACs. The industrial I/O subsystem provides a unified framework for drivers for many different types of converters and sensors using a number of different physical interfaces (i2c, spi, etc). See Linux Industrial I/O Subsystem for more information.

Source Code

Status

Source

Mainlined?

git

Yes

Files

Devicetree

Required devicetree properties for spi devices:

  • compatible: Needs to be the name of the device. E.g. ad5676

  • reg: The chipselect number used for the device

  • spi-max-frequency: Maximum SPI clock frequency.

  • spi-cpol: Needs to be set for the correct SPI mode

  • vcc-supply: Phandle to the fixed regulator

  • interrupts: the interrupt used for buffer sampling

  • pwms: pwm pin used as the interrupt source

adc_vref: fixedregulator@0 {
    compatible = "regulator-fixed";
    regulator-name = "fixed-supply";
    regulator-min-microvolt = <2500000>;
    regulator-max-microvolt = <2500000>;
    regulator-boot-on;
};

#address-cells = <1>;
#size-cells = <0>;
status = "okay";

ad5676@0 {
    compatible = "ad5676";
    reg = <0>;
    spi-max-frequency = <1000000>;
    spi-cpha;
    vcc-supply = <&adc_vref>;

    interrupts = <25 IRQ_TYPE_EDGE_RISING>;
    interrupt-parent = <&gpio>;

    pwms = <&pwm 0 100>;
    pwm-names = "pwm-trigger";
};

Required devicetree properties for i2c devices:

  • compatible: Needs to be the name of the device. E.g. AD5696

  • reg: The chipselect number used for the device

  • vcc-supply: Phandle to the fixed regulator

  • interrupts: the interrupt used for buffer sampling

  • pwms: pwm pin used as the interrupt source

adc_vref: fixedregulator@0 {
    compatible = "regulator-fixed";
    regulator-name = "fixed-supply";
    regulator-min-microvolt = <2500000>;
    regulator-max-microvolt = <2500000>;
    regulator-boot-on;
};

#address-cells = <1>;
#size-cells = <0>;
status = "okay";

ad5696@e {
    compatible = "ad5696";
    reg = <0xe>;
    vcc-supply = <&adc_vref>;

    interrupts = <25 IRQ_TYPE_EDGE_RISING>;
    interrupt-parent = <&gpio>;

    pwms = <&pwm 0 100>;
    pwm-names = "pwm-trigger";
};

Driver testing

root:/> cd /sys/bus/iio/devices/
root:/sys/bus/iio/devices> ls
iio:device0

root:/sys/bus/iio/devices> cd iio\:device0

root:/sys/bus/iio/devices/iio:device0> ls -l
drwxr-xr-x 2 root root    0 Jul 31 15:17 buffer
-r--r--r-- 1 root root 4096 Jul 31 15:17 dev
-r--r--r-- 1 root root 4096 Jul 31 15:17 name
lrwxrwxrwx 1 root root    0 Jul 31 15:17 of_node -> ../../../../../../../../firmware/devicetree/base/soc/spi@7e204000/ad5679r@0
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage0_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage0_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage0_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage10_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage10_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage10_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage11_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage11_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage11_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage12_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage12_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage12_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage13_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage13_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage13_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage14_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage14_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage14_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage15_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage15_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage15_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage1_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage1_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage1_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage2_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage2_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage2_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage3_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage3_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage3_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage4_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage4_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage4_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage5_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage5_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage5_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage6_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage6_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage6_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage7_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage7_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage7_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage8_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage8_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage8_raw
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage9_powerdown
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage9_powerdown_mode
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage9_raw
-r--r--r-- 1 root root 4096 Jul 31 15:17 out_voltage_powerdown_mode_available
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage_sampling_frequency
-rw-r--r-- 1 root root 4096 Jul 31 15:17 out_voltage_scale
drwxr-xr-x 2 root root    0 Jul 31 15:17 power
drwxr-xr-x 2 root root    0 Jul 31 15:17 scan_elements
lrwxrwxrwx 1 root root    0 Jul 31 15:17 subsystem -> ../../../../../../../../bus/iio
drwxr-xr-x 2 root root    0 Jul 31 15:17 trigger
-rw-r--r-- 1 root root 4096 Jul 31 15:17 uevent

Show device name

root:/sys/bus/iio/devices/iio:device0> cat name
ad5696

Show scale

Description: scale to be applied to in_voltage0_raw in order to obtain the measured voltage in millivolts.

root:/sys/bus/iio/devices/iio:device0> cat out_voltage_scale
0.038146972
Set channel Y output voltage

Description: /sys/bus/iio/devices/deviceX/out_voltageY_raw

Raw (unscaled, no bias etc.) output voltage for channel Y.

root:/sys/bus/iio/devices/iio:device0> echo 10000 > out_voltage0_raw

U = out_voltage0_raw * out_voltage_scale = 10000 * 0.038140 = 381.40 mV

List available power down modes

/sys/bus/iio/devices/deviceX/out_powerdown_mode_available

Description: Lists all available output power down modes.

root:/sys/bus/iio/devices/iio:device0> cat out_voltage_powerdown_mode_available
1kohm_to_gnd 100kohm_to_gnd three_state
Set channel Y power down mode

/sys/bus/iio/devices/deviceX/out_voltageY_powerdown_mode

Description: Specifies the output power down mode. DAC output stage is disconnected from the amplifier and

1kohm_to_gnd

connected to ground via an 1kOhm resistor

100kohm_to_gnd

connected to ground via an 100kOhm resistor

three_state

left floating

For a list of available output power down options read out_voltageX_powerdown_mode_available.

root:/sys/bus/iio/devices/iio:device0> echo three_state > out_voltage0_powerdown_mode
root:/sys/bus/iio/devices/iio:device0> cat out_voltage0_powerdown_mode
three_state
Enable power down mode on output Y

/sys/bus/iio/devices/deviceX/out_voltageY_powerdown

Description: Writing 1 causes output Y to enter the power down mode specified by the corresponding out_voltageY_powerdown_mode. Clearing returns to normal operation. Y may be suppressed if all outputs are controlled together.

root:/sys/bus/iio/devices/iio:device0> echo 1 > out_voltage0_powerdown
root:/sys/bus/iio/devices/iio:device0>  cat out_voltage0_powerdown
1
root:/sys/bus/iio/devices/iio:device0> echo 0 > out_voltage0_powerdown
root:/sys/bus/iio/devices/iio:device0>  cat out_voltage0_powerdown
0

Buffer Support

Description: The nanoDAC family of devices has buffer support for changing the output of the DAC channels. To achieve this a PWM signal is used as the device trigger to output data. Using a sampling frequency attribute the period of the PWM signal can be changed. The sampling frequency is in Hz.

Important

In order to use this functionality the interrupt pin must be tied to the PWM generation pin

root@analog:/sys/bus/iio/devices/iio:device0 $ cat out_voltage_sampling_frequency
1000
root@analog:/sys/bus/iio/devices/iio:device0# echo 2000 > out_voltage_sampling_frequency
root@analog:/sys/bus/iio/devices/iio:device0# cat out_voltage_sampling_frequency
2000

Enable buffered channels

Description: The user has to enable on what channels to output the buffer samples. The samples are interleaved in the following in the order of the enabled channels.

Example:

Tip

sample_ch0|sample_ch1|sample_ch2

If only channel 1 is enabled the buffer samples will have the following configuration:

Tip

sample_ch1|sample_ch1|sample_ch1

root@analog:/sys/bus/iio/devices/iio:device0# cd scan_elements/
root@analog:/sys/bus/iio/devices/iio:device0/scan_elements# ls
out_voltage0_en      out_voltage10_type   out_voltage12_index  out_voltage14_en     out_voltage15_type  out_voltage2_index  out_voltage4_en out_voltage5_type   out_voltage7_index  out_voltage9_en
out_voltage0_index   out_voltage11_en     out_voltage12_type   out_voltage14_index  out_voltage1_en out_voltage2_type   out_voltage4_index  out_voltage6_en     out_voltage7_type   out_voltage9_index
out_voltage0_type    out_voltage11_index  out_voltage13_en     out_voltage14_type   out_voltage1_index  out_voltage3_en     out_voltage4_type   out_voltage6_index  out_voltage8_en out_voltage9_type
out_voltage10_en     out_voltage11_type   out_voltage13_index  out_voltage15_en     out_voltage1_type   out_voltage3_index  out_voltage5_en out_voltage6_type   out_voltage8_index
out_voltage10_index  out_voltage12_en     out_voltage13_type   out_voltage15_index  out_voltage2_en out_voltage3_type   out_voltage5_index  out_voltage7_en     out_voltage8_type
root@analog:/sys/bus/iio/devices/iio:device0/scan_elements# echo 1 > out_voltage0_en

root@analog:/sys/bus/iio/devices/iio:device0/scan_elements# cd ../buffer/
root@analog:/sys/bus/iio/devices/iio:device0/buffer# ls
data_available  enable  length  watermark
root@analog:/sys/bus/iio/devices/iio:device0/buffer# echo 1 > enable

Sending a buffer sample example:

root@analog:/sys/bus/iio/devices/iio:device0/buffer# echo -n -e '\x22\x33' >
/dev/iio\:device0

More Information