跳转至

功耗调整指引


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 04/08/2025
    1.1
  • Add idac voltage adjustment section
  • 08/18/2026

    1. 概述

    本文档用于指导 SGS PureLinux 平台的功耗优化,主要介绍各模块的clock 开关或者调频方式。

    2. 配置说明

    目前 PureLinux 平台已接入 CCF (Common Clock Framework),默认未使用的模块均会在linux 系统启动阶段进行关闭。

    但需要确保开启如下配置:

    PureLinux:

    Symbol: COMMON_CLK [=y]
    Type  : bool
    Defined at drivers/clk/Kconfig:21
      Prompt: Common Clock Framework
      Depends on: !HAVE_LEGACY_CLK [=n]
    

    开启上述配置之后,时钟使能/失能以及时钟之前的依赖会由CCF 接管,各模块仅需使用 CCF 提供的接口对接即可,而对于用户,需要关注的点主要会分为:

    1. 模块增删

      大部分 BSP 模块在使用的时候才会将时钟开启,但部分模块会在加载阶段(probe)就将时钟开启,这些模块在没有使用的时候需要确保是没有被装载的,例如 USB 模块。

    2. 模块调频

      这部分主要针对功耗较高的串流模块,用户可以调到适合场景的合适频率,以降低功耗。

    此外,还会对一些比较特殊的模块作专门的介绍,例如:cpu、idac。

    2.1. 模块增删

    该章节介绍的是模块的增加与移除的配置操作。

    2.1.1. usb

    usb 这边会分为host 端控制器以及 device 端控制器,这里边会分别介绍。

    usb 2.0 主机端控制器:

    Symbol: USB_EHCI_HCD [=m]
    Type  : tristate
    Defined at drivers/usb/host/Kconfig:129
      Prompt: EHCI HCD (USB 2.0) support
      Depends on: USB_SUPPORT [=y] && USB [=y] && HAS_DMA [=y] && HAS_IOMEM [=y]
      Location:
        -> Device Drivers
          -> USB support (USB_SUPPORT [=y])
      模块化对应驱动:ehci-hcd.ko
    

    usb 2.0 设备端控制器:

    Symbol: USB_SGS_MSB250X_UDC [=m]
    Type  : tristate
    Defined at drivers/sgs_common/usb/gadget/udc/usb20/Kconfig:1
      Prompt: Sgs MSB250X USB 2.0 Device Controller
      Depends on: USB_SUPPORT [=y] && USB_GADGET [=m]
      Location:
        -> Device Drivers
          -> USB support (USB_SUPPORT [=y])
            -> USB Gadget Support (USB_GADGET [=m])
              -> USB Peripheral Controller
      模块化对应的驱动有:udc-msb250x.ko
    

    usb 3.0 主机端控制器:

    Symbol: USB_XHCI_HCD [=m]
    Type  : tristate
    Defined at drivers/usb/host/Kconfig:20
      Prompt: xHCI HCD (USB 3.0) support
      Depends on: USB_SUPPORT [=y] && USB [=y] && HAS_DMA [=y] && HAS_IOMEM [=y]
      Location:
        -> Device Drivers
          -> USB support (USB_SUPPORT [=y])
    
      模块化对应的驱动有:xhci-hcd.ko、xhci-plat-hcd.ko
    

    usb 3.0 设备端控制器

    Symbol: USB_DWC3 [=m]
    Type  : tristate
    Defined at drivers/usb/dwc3/Kconfig:3
      Prompt: DesignWare USB3 DRD Core Support
      Depends on: USB_SUPPORT [=y] && (USB [=y] || USB_GADGET [=n]) && HAS_DMA [=y] && (EXTCON [=y] || EXTCON [=y]=n [=n])
      Location:
        -> Device Drivers
         -> USB support (USB_SUPPORT [=y])
      模块化对应的驱动:dwc3.ko
    

    2.1.2. sdmmc

    Symbol: SGS_SDMMC [=m]                                                                                                        Type  : tristate
    Defined at drivers/sgs_common/sdmmc/Kconfig:1
      Prompt: Sgs SD/MMC Card Interface Support
      Depends on: SGS_DRIVERS [=y] && MMC [=m]
      Location:
        -> Device Drivers
          -> Sgs SoC platform drivers (SGS_DRIVERS [=y])
      模块化对应的驱动有:kdrv_sdmmc.ko
    

    2.1.3. gamc

     Symbol: SGS_GMAC [=y]
     Type  : tristate
     Defined at drivers/sgs_common/gmac/Kconfig:2
       Prompt: SGS GMAC
       Depends on: SGS_DRIVERS [=y] && SGS_OS_NAME [=lnx]=lnx
       Location:
         -> Device Drivers
           -> Sgs SoC platform drivers (SGS_DRIVERS [=y])
             -> SGS GMAC
     模块化对应的驱动有:sgs_gmac.ko
    

    2.2. 模块调频

    该章节所列举模块均支持频率的调节,主要是跟串流相关的模块会分为 调试接口 以及 正式接口

    调试接口 支持 档位查看 以及 档位配置

    该接口仅为用于调节合适时钟频率使用。展示的时钟分为两部分,时钟源档位,当前时钟频率,因模块时钟可能支持 divider,实际时钟可能为时钟源细分档位。

    该类接口需要确保 mi_debug 功能是开启的,例如需要开启VENC 的功能,需要确保 CONFIG_ENABLE_VENC_DEBUG 是开启的。

    正式接口 通过 modparam.json 来进行设定:

    在通过调试接口确认好时钟之后通过该接口配置,该接口支持 purelinux 的设定,modparam.json 为统一初始化接口,详细使用方法请查看 mi_common 使用介绍。

    确认时钟档位的技巧

    时钟档位:模块时钟档位查看仅提供时钟源的档位,部分模块支持 divider,所以会有更多的时钟档位(基于时钟源分频),实际配置时,可先确认大的时钟源档位下是否满足需求,再细分配置更小的时钟档位

    模块处理任务需要的时钟频率会跟硬件处理的帧率、图像分辨率有关,所以没办法给出一个比较统一的公式化档位来预估时钟频率,所以目前的获取时钟频率的方式是不断的尝试进行档位配置,确认模块是否工作正常,逐步接近最终档位,大致可以分为下面几个步骤进行:

    1、在串好的完整场景下,以场景正常工作的情况为准,获取此时的基础时钟频率

    2、从最前端模块开始调节时钟频率,需要基于基础时钟频率,由高档位往低档位进行,直到获取合适时钟

    如果模块出现帧率降低,或者出现fifo full 等问题,说明时钟频率已经到底了,此时需要将相关的时钟档位往高一档调;如果场景是硬件直连模式,可以将直连模式切换为 frame 模式,以避免前后级相互的影响

    3、将所获得的时钟频率增加余量

    因为该时钟频率为不断调试出来的频率,会趋于硬件在该场景处理的极限频率值,如果遇到带宽减少或者场景微调的情况,可能会出现模块处理的帧率不足,所以此时需要给第二步调出来的频率适当增加余量。

    2.2.1. vdec

    档位查看:

    / # cat /proc/mi_modules/mi_vdec/debug_hal/vdec_clock
    -------VDEC Device [0]---------
     600000000 vpll od
     540000000 vpll od
     504000000 vpll <--
     432000000 vpll
     348000000 vpll
     300000000 vpll
     576000000 od
     480000000
     384000000
    
    -------VDEC Device [1]---------
     600000000 vpll od
     540000000 vpll od
     504000000 vpll <--
     432000000 vpll
     348000000 vpll
     300000000 vpll
     576000000 od
     480000000
     384000000
    

    档位配置:

    dev0、dev1 共享 PLL 时钟,因此调整时会同步修改所有使用该时钟的设备。

    / # echo 432000000 > /proc/mi_modules/mi_vdec/debug_hal/vdec_clock
    / # cat /proc/mi_modules/mi_vdec/debug_hal/vdec_clock
    -------VDEC Device [0]---------
     600000000 vpll od
     540000000 vpll od
     504000000 vpll
     432000000 vpll <--
     348000000 vpll
     300000000 vpll
     576000000 od
     480000000
     384000000
    
    -------VDEC Device [1]---------
     600000000 vpll od
     540000000 vpll od
     504000000 vpll
     432000000 vpll <--
     348000000 vpll
     300000000 vpll
     576000000 od
     480000000
     384000000
    

    正式接口:

    {
        "E_MI_MODULE_ID_VDEC" :
        {
            "vdec_clock": 432000000
        }
    }
    

    2.2.2. scl

    档位查看:

    / # cat /proc/mi_modules/mi_scl/debug_hal/clk 
    [0] 240000000
    [1] 288000000
    [2] 320000000
    [3] 345000000
    [4] 384000000
    [5] 432000000
    [6] 480000000
    [7] 576000000 <-------
    

    档位配置:

    / # echo 384000000 > /proc/mi_modules/mi_scl/debug_hal/clk
    / # cat /proc/mi_modules/mi_scl/debug_hal/clk
    [0] 240000000
    [1] 288000000
    [2] 320000000
    [3] 345000000
    [4] 384000000 <-------
    [5] 432000000
    [6] 480000000
    [7] 576000000
    

    正式接口:

    {
        "E_MI_MODULE_ID_SCL" :
        {
            "scl_clk": 384000000
        }
    }
    

    2.2.3. venc

    档位查看:

    / # cat /proc/mi_modules/mi_venc/debug_hal/ven_clock
     480000000 <--
     432000000
     384000000
     288000000
    Current CLK: 480000000  (dfs=0/0, source=480000000)
    

    档位配置:

    / # echo 432000000 > /proc/mi_modules/mi_venc/debug_hal/ven_clock 
    / # cat /proc/mi_modules/mi_venc/debug_hal/ven_clock 
     480000000
     432000000 <--
     384000000
     288000000
    Current CLK: 432000000  (dfs=0/0, source=432000000)
    

    正式接口:

    {
        "E_MI_MODULE_ID_VENC" :
        {
            "ven_clock": 432000000,
        }
    }
    

    2.2.4. jpe

    档位查看:

    / # cat /proc/mi_modules/mi_venc/debug_hal/jpe_clock
    -------Device 0---------
     384000000 <--
     345000000
     320000000
     288000000
     216000000
     172000000
    Current CLK: 384000000  (dfs=0/0, source=384000000)
    

    档位配置:

    / # echo 345000000 > /proc/mi_modules/mi_venc/debug_hal/jpe_clock 
    / # cat /proc/mi_modules/mi_venc/debug_hal/jpe_clock 
    -------Device 0---------
     384000000
     345000000 <--
     320000000
     288000000
     216000000
     172000000
    Current CLK: 345000000  (dfs=0/0, source=345000000)
    

    正式接口:

    {
        "E_MI_MODULE_ID_VENC" :
        {
            "jpe_clock": 345000000
        }
    }
    

    2.2.5. ipu

    档位查看:

    / # cat /proc/mi_modules/mi_ipu/debug_hal/freq 
    current ipu clock frequency: 800MHz
    available frequency:
    800MHz
    700MHz
    680MHz
    600MHz
    500MHz
    400MHz
    300MHz
    

    档位配置:

    / # echo 500 > /proc/mi_modules/mi_ipu/debug_hal/freq
    / # cat /proc/mi_modules/mi_ipu/debug_hal/freq
    current ipu clock gear: 500MHz
    available frequency:
    800MHz
    700MHz
    680MHz
    600MHz
    500MHz
    400MHz
    300MHz
    

    正式接口:

    {
        "E_MI_MODULE_ID_IPU" :
        {
            "ipu_clk": 500000000
        }
    }
    

    2.2.6. ive

    档位查看:

    / # cat /proc/mi_modules/mi_ive/debug_hal/ive_clk 
    
    ---------- IVE clock -----------
    432000000 <--
    288000000
    480000000
    Current CLK: 432000000 dfs(0/0, src=432000000)
    

    档位配置:

    / # echo 288000000 > /proc/mi_modules/mi_ive/debug_hal/ive_clk
    / # cat /proc/mi_modules/mi_ive/debug_hal/ive_clk
    ---------- IVE clock -----------
    432000000
    288000000 <--
    480000000
    Current CLK: 288000000 dfs(0/0, src=288000000)
    

    正式接口:

    {
        "E_MI_MODULE_ID_IVE" :
        {
            "ive_clk": 288000000
        }
    }
    

    2.3. cpu

    cpu 调频目前是通过linux 的cpufreq 子系统进行的,所以这边主要会对 cpufreq 开出来的接口做介绍。

    需要确保有开启配置 CONFIG_MS_CPU_FREQ

    2.3.1. 节点介绍

    节点路径:/sys/devices/system/cpu/cpufreq/policy0

    节点名 作用
    cpuinfo_cur_freq CPU当前正在运行的工作频率,一般与scaling_cur_freq相等
    cpuinfo_max_freq CPU能够支持的最高工作频率
    cpuinfo_min_freq CPU能够支持的最低工作频率
    scaling_available_frequencies 调节器支持的频率档位:
    600000 700000 800000 900000 1000000 1100000 1200000 1300000 1400000 1500000 1600000
    scaling_cur_freq 调节器决定的当前CPU工作频率
    scaling_available_governors 支持的调节策略:
    1. performance:性能优先模式,不考虑耗电,只用最高频率
    2. powersave:节能模式,通常以最低频率运行
    3. userspace:用户自定义模式, 支持在用户空间手动调节频率
    4. ondemand:按需模式,定期检查负载,根据负载来调节频率
    scaling_governor 查看当前调节策略以及设定调节策略,默认为 userspace
    scaling_max_freq 调节器支持的最高CPU工作频率
    scaling_min_freq 调节器支持的最低CPU工作频率
    scaling_setspeed 如果选择的调节策略为 userspace,那么可以设置CPU的工作主频为某个值

    2.3.2. 配置约束

    1. scaling_min_freq必须小于等于scaling_max_freq
    2. scaling_min_freq必须大于等于cpuinfo_min_freq
    3. scaling_max_freq必须小于等于cpuinfo_max_freq
    4. scaling_setspeed必须在scaling_min_freq和scaling_max_freq范围内

    2.3.3. 设置频率

    # 配置当前的 governor 为 userspace
    /sys/devices/system/cpu/cpufreq/policy0/ # echo userspace > scaling_governor
    
    # 确认需要配置的频率是否在范围内:
    /sys/devices/system/cpu/cpufreq/policy0 # cat scaling_min_freq
    600000
    /sys/devices/system/cpu/cpufreq/policy0 # cat scaling_max_freq
    1600000
    
    # 配置当前的频率
    /sys/devices/system/cpu/cpufreq/policy0 # echo  1000000 > scaling_setspeed
    /sys/devices/system/cpu/cpufreq/policy0 # cat scaling_cur_freq
    1000000
    

    2.4. idac 调压

    SGS 平台支持通过 IDAC 对 Core Power(VDD_CORE)、CPU Power(VDD_CPU)、IPU Power(VDD_IPU)等供电电压进行精细调节(调节精度为 10mV 或 20mV)。在满足各模块工作需求的前提下适当降低工作电压,可以进一步降低整体功耗。不同平台支持的调压对象会有所不同,IDAC 的硬件连接、驱动配置以及电压调节方法请参考 IDAC 使用参考