跳转至

IDAC使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 05/08/2025
    1.1
  • 新增init-voltage字符串形式,开机时按所选OPP下发初始电压
  • 08/19/2026

    1. 概述

    DAC(数模转换器)是把数字信号转变成模拟信号的电子器件。通常我们用DAC指代电压输出型DAC(即输出的模拟信号是电压),用IDAC指代电流输出型DAC(即输出的模拟信号是电流)。

    2. 关键字说明

    • DAC

      (Digital-to-Analog Converter,数模转换器)是一种将数字信号转换为模拟信号的电子器件。

    • IDAC

      (Current Digital-to-Analog Converter,电流输出型数模转换器)是一种以电流作为输出模拟信号的数模转换器。

    3. 功能描述

    SGS有两种调压方式:DIV和IDAC。DIV调压是通过控制12根GPIO来调节电压,只有24个电压档位可供调节,不同档位之间的精度在50mV左右。而IDAC调压能更精细地调节电压(调节精度为10mV或20mV),且仅需一根专用的GPIO即可控制最多30个电压档位。

    4. 硬件连接介绍

    IDAC硬件模块集成在SoC内部。需要将开发板上对应的跳帽切换成IDAC mode来开启IDAC调压功能。

    5. Uboot用法介绍

    目前uboot下未实现IDAC驱动。

    6. Kernel用法介绍

    IDAC调压的对象包括Core Power(VDD_CORE),CPU Power(VDD_CPU),IPU Power(VDD_IPU),DSP Power(VDD_DSP)等。不同平台支持的调压对象会有所不同,下面以PCUPID平台用IDAC调节CPU Power为例进行说明。

    6.1. Kernel Config配置

    1. Enable 对应的驱动模块:

      在编译kernel时需要选择的配置如下:

      Device Drivers  --->
          [*] Sgs SoC platform drivers  --->
              [*] SGS Voltage Controller Driver
               Voltage Regulator Type (IDAC)  --->
      

    6.2. Dts配置

    IDAC控制CPU Power的相关设定在dts里的cpu_power节点中。节点中的参数如下:

    1.    cpu_power {
    2.        compatible = "sgs,voltage-idac-ctrl";
    3.        vid_gpio = <PAD_PM_GPIO5>;
    4.        base_voltage = <1000>;
    5.        status = "okay";
    6.    };
    

    cpu_power节点中的属性含义分别为:

    属性 描述 设定值 备注
    compatible 匹配驱动进行驱动注册 "sgs,voltage-idac-ctrl" 禁止修改
    vid_gpio 配置所使用的GPIO 硬件决定 禁止修改
    base_voltage 基准电压(单位mV) 硬件决定 禁止修改
    status 选择是否使能该节点 "okay" or "disabled" 可根据需要修改

    core_power节点支持通过init-voltage从OPP配置项中选择开机电压,节点中的参数如下:

    1.    core_power {
    2.        regulator-name = "core_power";
    3.        regulator-min-microvolt = <700000>;
    4.        regulator-max-microvolt = <1300000>;
    5.        regulator-ramp-delay = <10>;
    6.        regulator-always-on;
    7.        compatible = "sgs,regulator-idac";
    8.        gpio = <PAD_PM_GPIO4>;
    9.        base-voltage = <1000000>;   // uV
    10.        sample-resistor = <20000>;  // ohm
    11.        opp0 = <920000 860000 0x0>;
    12.        opp1 = <970000 900000 0x1>;
    13.        init-voltage = "opp1";
    14.        status = "okay";
    15.    };
    

    core_power节点中的属性含义分别为:

    属性 描述 设定值 备注
    compatible 匹配驱动进行驱动注册 "sgs,regulator-idac" 禁止修改
    regulator-* 标准regulator属性(名称、电压范围、ramp delay等) 硬件决定 参考kernel regulator文档
    gpio IDAC调压所使用的GPIO 硬件决定 禁止修改
    base-voltage 基准电压(单位uV) 硬件决定 禁止修改
    sample-resistor 采样电阻阻值(单位ohm) 硬件决定 禁止修改
    opp<name> 开机电压的OPP配置项 由SGS提供 禁止修改
    init-voltage 开机时下发的初始电压 OPP属性名字符串(如"opp1"),或固定的u32值(单位uV) 选择开机时下发的OPP配置项
    status 选择是否使能该节点 "okay" or "disabled" 可根据需要修改

    init-voltage为OPP属性名时,驱动开机时下发该OPP配置项的电压;为u32值时,开机时直接下发该固定电压(单位uV)。若未配置init-voltage,驱动在开机时不会下发初始电压。

    6.3. Padmux配置

    NA

    6.4. 模块使用介绍

    6.4.1. SYSFS 使用方法

    kernel下使用sysfs查询/修改cpu power,使用说明如下:

    • CPU Power

      Dump current cpu power

      cat /sys/devices/system/voltage/cpu_power/voltage_current
      
      1070
          VOLTAGE_DEMANDER_INIT           -
          VOLTAGE_DEMANDER_CPUFREQ        1070
          VOLTAGE_DEMANDER_TEMPERATURE    -
          VOLTAGE_DEMANDER_USER           -
      

      Query available cpu power

      cat /sys/devices/system/voltage/cpu_power/voltage_available
      
      Vmin(mV)    Vmax(mV)
      700         1300
      

      Set cpu power to 900mV

      echo 900 > /sys/devices/system/voltage/cpu_power/voltage_current
      

    6.4.2. ioctl使用方法

    NA

    6.5. Sample code

    NA

    6.6. UT case

    NA

    7. API参考

    该功能模块提供以下接口:

    API名称 功能
    set_core_voltage 设置电压值
    get_core_voltage 查询电压值

    7.1. set_core_voltage

    • 功能

      设置电压值

    • 语法

      int set_core_voltage(const char *name, VOLTAGE_DEMANDER_E demander, u32 mV)
      
    • 参数

      参数名称 描述
      name 调压对象的名字,例如core_power,cpu_power,ipu_power
      demander 请求者的标签
      mV 电压值(单位mV)
    • 返回值

      返回值 描述
      0 成功
      other 失败

    7.2. get_core_voltage

    • 功能

      查询电压值

    • 语法

       int get_core_voltage(const char *name, u32 *mV)
      
    • 参数

      参数名称 描述
      name 查询的调压对象的名字,例如core_power,cpu_power,ipu_power
      mV 查询到的电压值保存在该变量中
    • 返回值

      返回值 描述
      0 成功
      other 失败

    8. FAQ

    NA