功耗调整指引


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 04/27/2024

    1. 概述

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

    2. 配置说明

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

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

    PureLinux:

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

    DualOs 还需要确保开启以下配置:

    Symbol: SSTAR_CLK_OS_MANAGE [=y]
    Type  : tristate
    Defined at drivers/sstar/clk/Kconfig:4
      Prompt: Sstar CLK OS Manage
      Depends on: SSTAR_DRIVERS [=y]
      Location:
        -> Device Drivers
          -> Sstar SoC platform drivers (SSTAR_DRIVERS [=y])
    

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

    1. 模块增删

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

    2. 模块调频

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

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

    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_SSTAR_MSB250X_UDC [=m]
    Type  : tristate
    Defined at drivers/sstar/usb/gadget/udc/usb20/Kconfig:1
      Prompt: Sstar 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
    

    2.1.3. sdmmc

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

    2.1.4. crypto

    该模块主要用于加解密操作。

    Symbol: SSTAR_CRYPTO [=y]
    Type  : tristate
    Defined at drivers/sstar/crypto/Kconfig:1
      Prompt: SigmaStar Crypto driver
      Depends on: MSTAR_DRIVERS [=y]
      Location:
        -> Device Drivers
          -> SStar SoC platform drivers (MSTAR_DRIVERS [=y])
     模块化对应的驱动有:mdrv_crypto.ko
    

    2.2. 模块调频

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

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

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

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

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

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

    确认时钟档位的技巧

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

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

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

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

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

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

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

    2.2.1. sensor

    档位查看:

    / # cat /proc/mi_modules/mi_sensor/debug_hal/csi_clk0
    [0] 432000000 <--
    [1] 288000000
    [2] 320000000
    [3] 172000000
    Current CLK:432000000
    
    csi_clk0 对应sensor0,csi_clk1 对应sensor1
    

    档位配置:

    / # echo 226000000 > /proc/mi_modules/mi_sensor/debug_hal/csi_clk0
    / # cat /proc/mi_modules/mi_sensor/debug_hal/csi_clk0
    [0] 432000000
    [1] 288000000
    [2] 320000000
    [3] 172000000
    Extend CLK 234000000:288000000 * 26 / 32
    
    Extend CLK:代表有使用 dfs 进行细分档位
    

    正式接口:

    {
        "E_MI_MODULE_ID_SNR" :
        {
            "csi_clk": [234000000,234000000]
        }
    }
    
    csi_clk:这里面配置的两项分别代表:csi_clk0、csi_clk1
    

    2.2.2. vif

    档位查看:

    / # cat /proc/mi_modules/mi_vif/debug_hal/vif_clk
    [0] 288000000 <--
    [1] 240000000
    [2] 192000000
    [3] 320000000
    Current CLK:288000000
    

    档位配置:

    / # echo 140000000 > /proc/mi_modules/mi_vif/debug_hal/vif_clk
    / # cat /proc/mi_modules/mi_vif/debug_hal/vif_clk
    [0] 288000000
    [1] 240000000
    [2] 192000000
    [3] 320000000
    Extend CLK 144000000:192000000 * 24 / 32
    

    正式接口:

    {
        "E_MI_MODULE_ID_VIF" :
        {
            "vif_clk": 144000000
        }
    }
    

    2.2.3. isp

    档位查看:

    / # cat /proc/mi_modules/mi_isp/debug_hal/isp_clk
    [0] 288000000
    [1] 240000000
    [2] 192000000
    [3] 320000000
    Extend CLK:144000000 = 192000000 * 24 / 32
    

    档位配置:

    / # echo 123000000 > /proc/mi_modules/mi_isp/debug_hal/isp_clk
    / # cat /proc/mi_modules/mi_isp/debug_hal/isp_clk
    [0] 288000000
    [1] 240000000
    [2] 192000000
    [3] 320000000
    Extend CLK:126000000 = 192000000 * 21 / 32
    

    正式接口:

    {
        "E_MI_MODULE_ID_ISP" :
        {
            "isp_clk": 126000000
        }
    }
    

    2.2.4. scl

    档位查看:

    / # cat /proc/mi_modules/mi_scl/debug_hal/clk
    [0] 144000000
    [1] 192000000
    [2] 216000000
    [3] 240000000
    [4] 288000000
    [5] 320000000
    ExtClock[121500000]:
    [0] [144000000 * 27 / 32] =  121500000 <-------
    

    档位配置:

    / # echo 152000000 >  /proc/mi_modules/mi_scl/debug_hal/clk
    / # cat /proc/mi_modules/mi_scl/debug_hal/clk
    [0] 144000000
    [1] 192000000
    [2] 216000000
    [3] 240000000
    [4] 288000000
    [5] 320000000
    ExtClock[152000000]:
    [1] [192000000 * 26 / 32] =  156000000 <-------
    

    正式接口:

    {
        "E_MI_MODULE_ID_SCL" :
        {
            "u32FClk1RateHz": 156000000
        }
    }
    

    2.2.5. venc

    档位查看:

    / # cat /proc/mi_modules/mi_venc/debug_hal/ven_clock
    
    -------VENC Device [0]---------
     345000000 <--
     323400000
     301800000
     288000000
     270000000
     240000000
     216000000
     192000000
     174000000
     162000000
     144000000
     120000000
    Current CLK: 345000000  (dfs=32/32, source=345000000)
    / # cat /proc/mi_modules/mi_venc/debug_hal/ven_clock_2nd
    
    -------VENC Device [0]---------
     432000000 <--
     405000000
     384000000
     360000000
     345000000
     320000000
     288000000
     261000000
     234000000
     216000000
     189000000
     162000000
    Current CLK: 432000000  (dfs=32/32, source=432000000)
    

    档位配置:

    / # echo 286000000 > /proc/mi_modules/mi_venc/debug_hal/ven_clock
    / # cat /proc/mi_modules/mi_venc/debug_hal/ven_clock
    
    -------VENC Device [0]---------
     345000000
     323400000
     301800000
     288000000 <--
     270000000
     240000000
     216000000
     192000000
     174000000
     162000000
     144000000
     120000000
    Current CLK: 288000000  (dfs=32/32, source=288000000)
    
    # ven_clock_2nd 为 ven_clock 的 1.26 倍
    / # echo 355000000 > /proc/mi_modules/mi_venc/debug_hal/ven_clock_2nd
    / # cat /proc/mi_modules/mi_venc/debug_hal/ven_clock_2nd
    
    -------VENC Device [0]---------
     432000000
     405000000
     384000000
     360000000 <--
     345000000
     320000000
     288000000
     261000000
     234000000
     216000000
     189000000
     162000000
    Current CLK: 360000000  (dfs=30/32, source=384000000)
    

    正式接口:

    {
        "E_MI_MODULE_ID_VENC" :
        {
            "ven_clock": 288000000,
            "ven_clock_2nd": 360000000
        }
    }
    

    2.2.6. jpe

    档位查看:

    / # cat /proc/mi_modules/mi_venc/debug_hal/jpe_clock
    -------Device 0---------
     288000000 <--
     261000000
     240000000
     216000000
     192000000
     168000000
     144000000
     120000000
    Current CLK: 288000000  (dfs=32/32, source=288000000)
    

    档位配置:

    / # echo 266000000 >  /proc/mi_modules/mi_venc/debug_hal/jpe_clock
    / # cat  /proc/mi_modules/mi_venc/debug_hal/jpe_clock
    -------Device 0---------
     288000000 <--
     261000000
     240000000
     216000000
     192000000
     168000000
     144000000
     120000000
    Current CLK: 288000000  (dfs=32/32, source=288000000)
    

    正式接口:

    {
        "E_MI_MODULE_ID_VENC" :
        {
            "jep_clock": 288000000
        }
    }
    

    2.2.7. ipu

    档位查看:

    / # cat  /proc/mi_modules/mi_ipu/debug_hal/freq
    current ipu clock frequency: 400MHz
    available frequency:
    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 frequency: 500MHz
    available frequency:
    600MHz
    500MHz
    400MHz
    300MHz
    

    正式接口:

    {
        "E_MI_MODULE_ID_IPU" :
        {
            "ipu_clk": 400000000
        }
    }
    

    2.2.8. ive

    档位查看:

    / # cat /proc/mi_modules/mi_ive/debug_hal/ive_clk
    
    ---------- IVE clock -----------
    288000000 <--
    216000000
    384000000
    432000000 od
    Current CLK: 288000000 dfs(0/0, source=288000000)
    

    档位配置:

    / # echo 266000000 > /proc/mi_modules/mi_ive/debug_hal/ive_clk
    / # cat /proc/mi_modules/mi_ive/debug_hal/ive_clk
    
    ---------- IVE clock -----------
    288000000 <--
    216000000
    384000000
    432000000 od
    Current CLK: 288000000 dfs(0/0, source=288000000)
    

    正式接口:

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

    2.2.9. ldc

    档位查看:

    / # cat /proc/mi_modules/mi_ldc/debug_hal/ldc_clock
    --------- device[0] ---------
    384000000 <----
    216000000
    172000000
    123400000
    432000000
    Current CLK: 384000000
    

    档位配置:

    / # echo 244000000 > /proc/mi_modules/mi_ldc/debug_hal/ldc_clock
    / # cat /proc/mi_modules/mi_ldc/debug_hal/ldc_clock
    --------- device[0] ---------
    [0] 384000000 <----
    [1] 216000000
    [2] 172000000
    [3] 123400000
    [4] 432000000
    Current CLK: 252000000 (dfs=21/32, source=384000000)
    

    正式接口:

    {
        "E_MI_MODULE_ID_LDC" :
        {
            "ldc_clk": 252000000
        }
    }
    

    2.3. cpu

    暂不支持