Last edited 4 years ago

DAC Linux driver

1. Article purpose[edit source]

This article introduces the Linux® driver for the DAC[1] internal peripheral:

  • Which DAC features are supported by the driver
  • How to configure, use and debug the driver
  • What is the driver structure, and where the source code can be found.

2. Short Description[edit source]

The DAC Linux® driver (kernel space) is based on the IIO framework.

It implements the IIO direct mode, to perform single conversions independently on each channel.

3. Configuration[edit source]

3.1. Kernel configuration[edit source]

Activate the DAC[1] Linux® driver in the kernel configuration using the Linux Menuconfig tool: Menuconfig or how to configure kernel (enable CONFIG_STM32_DAC).

Device Drivers  --->
   <*> Industrial I/O support  --->
      Digital to analog converters  --->
         <*> STMicroelectronics STM32 DAC

3.2. Device tree[edit source]

Refer to the DAC device tree configuration article when configuring the DAC Linux kernel driver.

4. How to use[edit source]

In "IIO direct mode", conversions can be done directly via sysfs. See How to do a simple DAC conversion using the sysfs interface.

5. How to trace and debug[edit source]

Refer to How to trace with dynamic debug for how to enable debug logs in the driver and in the Framework.

Refer to How to debug with debugfs for how to access the DAC registers.

The DAC has system wide dependencies towards other key resources:

  • runtime power management can be disabled, for example it may be forced on via power/control sysfs entry:
 cd /sys/devices/platform/soc/40017000.dac/40017000.dac\:dac@1/
 cat power/autosuspend_delay_ms
2000
 cat power/control
auto                                     # kernel is allowed to automatically suspend the ADC device after autosuspend_delay_ms
 echo on > power/control         # force the kernel to resume the DAC device (e.g. keep clocks and regulators enabled)
Info white.png Information
It might be useful to disable runtime power management, in order to dump registers by any means or to check clock and regulator usage (see example below).
  • clock[2] usage can be verified by reading clk_summary:
 cat /sys/kernel/debug/clk/clk_summary | grep dac
       dac12_k                        0        0        0       32000          0 0
                      dac12           1        2        0    98303955          0 0
  • regulator[3] tree and usage usage can be verified (e.g. use count, open count and regulator reference voltage) as follows:
 cat /sys/kernel/debug/regulator/regulator_summary
 regulator                      use open bypass voltage current     min     max
-------------------------------------------------------------------------------
    v3v3                          4    5      0  3300mV     0mA  3300mV  3300mV
       vdda                       1    2      0  2900mV     0mA  2900mV  2900mV
          40017000.dac                                              0mV     0mV
          48003000.adc                                              0mV     0mV
  • pinctrl[4] usage can be verified by reading pinmux-pins:
 cd /sys/kernel/debug/pinctrl/soc\:pin-controller@50002000/
 cat pinmux-pins | grep dac
pin 4 (PA4): device 40017000.dac function analog group PA4
pin 5 (PA5): device 40017000.dac function analog group PA5   # check pins are assigned to DAC and configured as "analog"

6. Source code location[edit source]

The DAC source code is composed of:

7. References[edit source]