功耗调整指引
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 05/21/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 提供的接口对接即可,而对于用户,需要关注的点主要会分为:
-
模块增删
大部分 BSP 模块在使用的时候才会将时钟开启,但部分模块会在加载阶段(probe)就将时钟开启,这些模块在没有使用的时候需要确保是没有被装载的,例如 USB 模块。
-
模块调频
这部分主要针对功耗较高的串流模块,用户可以调到适合场景的合适频率,以降低功耗。
此外,还会对一些比较特殊的模块作专门的介绍,例如: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¶
暂不支持