功耗调整指引¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 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 提供的接口对接即可,而对于用户,需要关注的点主要会分为:
-
模块增删
大部分 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¶
cpu 调频目前是通过linux 的cpufreq 子系统进行的,所以这边主要会对 cpufreq 开出来的接口做介绍。
需要确保有开启配置 CONFIG_MS_CPU_FREQ。
需要确保IDAC功能有开启CONFIG_SSTAR_VOLTAGE_IDAC_CTRL
CPU频率支持的调节策略需要增加userspace模式CONFIG_CPU_FREQ_GOV_USERSPACE
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 800000 1000000 |
| scaling_cur_freq | 调节器决定的当前CPU工作频率 |
| scaling_available_governors | 支持的调节策略: 1. performance:性能优先模式,不考虑耗电,只用最高频率 2. powersave:节能模式,通常以最低频率运行 3. userspace:用户自定义模式, 支持在用户空间手动调节频率 4. ondemand:按需模式,定期检查负载,根据负载来调节频率 5. schedutil:根据CPU的实时负载动态调整频率,以平衡性能和能效 |
| scaling_governor | 查看当前调节策略以及设定调节策略,默认为 ondemand |
| scaling_max_freq | 调节器支持的最高CPU工作频率 |
| scaling_min_freq | 调节器支持的最低CPU工作频率 |
| scaling_setspeed | 如果选择的调节策略为 userspace,那么可以设置CPU的工作主频为某个值 |
2.3.2. 配置约束¶
- scaling_min_freq必须小于等于scaling_max_freq
- scaling_min_freq必须大于等于cpuinfo_min_freq
- scaling_max_freq必须小于等于cpuinfo_max_freq
- 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
800000
/sys/devices/system/cpu/cpufreq/policy0 # cat scaling_max_freq
1200000
# 配置当前的频率
/sys/devices/system/cpu/cpufreq/policy0 # echo 1000000 > scaling_setspeed
/sys/devices/system/cpu/cpufreq/policy0 # cat scaling_cur_freq
1000000