Linux SoC低功耗入口及操作指南
目录
- [Linux SoC低功耗入口及操作指南](#Linux SoC低功耗入口及操作指南)
-
- 文档版本:V1.0
- [适用范围:嵌入式SoC Linux平台开发](#适用范围:嵌入式SoC Linux平台开发)
- 目标:构建完整内核低功耗软件栈,实现运行时动态省电、整机休眠两级功耗管控,支撑产品功耗指标达成
- 一、方案概述
-
- [1.1 整体分层架构](#1.1 整体分层架构)
- [1.2 内核基础配置总开关](#1.2 内核基础配置总开关)
- 二、核心子系统设计方案
-
- [2.1 CPUIdle 框架(CPU 空闲状态管理 C-State)](#2.1 CPUIdle 框架(CPU 空闲状态管理 C-State))
- [2.2 DVFS 动态调压调频(CPUFreq + DevFreq + OPP)](#2.2 DVFS 动态调压调频(CPUFreq + DevFreq + OPP))
- [2.3 Runtime PM 运行时设备电源管理(核心模块)](#2.3 Runtime PM 运行时设备电源管理(核心模块))
- [2.4 GenPD 通用电源域 Generic Power Domain](#2.4 GenPD 通用电源域 Generic Power Domain)
- [2.5 System Suspend 整机休眠框架](#2.5 System Suspend 整机休眠框架)
- [2.6 辅助功耗管控机制](#2.6 辅助功耗管控机制)
- 三、固件与内核交互接口方案
- 四、底层支撑依赖模块
- 五、功耗调试与验证方案
-
- [5.1 调试命令清单](#5.1 调试命令清单)
- [5.2 验证项](#5.2 验证项)
- 六、功耗业务协同流程
- 七、风险点与设计规避措施
- 八、交付物清单
文档版本:V1.0
适用范围:嵌入式SoC Linux平台开发
目标:构建完整内核低功耗软件栈,实现运行时动态省电、整机休眠两级功耗管控,支撑产品功耗指标达成
一、方案概述
本方案基于 Linux 内核标准电源管理子系统,自上而下搭建分层低功耗架构。覆盖动态调频调压、CPU 空闲休眠、外设运行时电源管理、电源域门控、整机系统休眠、唤醒管控 全链路能力。
区分两种省电场景:
-
系统正常运行状态:外设闲置自动下电、CPU 进入 Idle、动态调压调频,无需冻结整机业务;
-
长时间无业务:整机进入系统休眠(s2idle 轻休眠 / STR 深度休眠),最大化降低静态功耗。
1.1 整体分层架构




1.2 内核基础配置总开关
Plain
CONFIG_PM=y # 电源管理总开关,所有低功耗模块依赖
CONFIG_PM_SLEEP=y # 支持系统suspend/resume整机休眠
CONFIG_PM_RUNTIME=y # 支持Runtime PM外设动态省电
二、核心子系统设计方案
2.1 CPUIdle 框架(CPU 空闲状态管理 C-State)
功能目标
CPU 无任务调度时逐级进入休眠状态:WFI 等待→关闭内核时钟→关闭 PLL→集群断电;越深休眠功耗越低,唤醒延迟同步增大。
- C0:正常运行;C1:WFI 浅休眠;C2/C3 及以上:深度休眠。
组件设计
-
Governor 策略器:选用 menu 策略,根据空闲时长自动选择 Idle 深度;
-
cpuidle_driver:平台驱动注册 SoC 支持的多级 Idle 状态;
-
cpuidle_device:绑定每个逻辑 CPU 实例。
平台适配方案
采用PSCI 标准接口 ,设备树定义 idle 状态,底层由 ATF (TF-A) 负责 CPU 电源控制。
DTS 参考配置:
dts
idle-states {
entry-method = "psci";
cpu_sleep: cpu-sleep {
compatible = "arm,idle-state";
arm,psci-suspend-param = <0x01>;
entry-latency-us = <100>;
exit-latency-us = <200>;
min-residency-us = <500>; // 最小停留时长,低于阈值不进入该休眠
};
};
关键配套:开启
CONFIG_NO_HZ_IDLETickless 无滴答机制,消除周期性 tick 频繁唤醒 CPU,是深度 Idle 前提条件。
2.2 DVFS 动态调压调频(CPUFreq + DevFreq + OPP)
功能目标
根据业务负载动态调整 CPU、外设运行频率与电压,降低运行功耗。
-
OPP:频率 + 电压组合数据表,DTS 统一描述,所有 DVFS 模块共享;
-
CPUFreq:CPU 核心调频,调度器联动;
-
DevFreq:GPU、NPU、DDR、ISP、VPU 等外设调频。
内核配置
Plain
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # 嵌入式首选,与进程调度联动
CONFIG_DEVFREQ=y
2.3 Runtime PM 运行时设备电源管理(核心模块)
功能目标
系统正常运行期间,外设闲置自动下电,不需要整机休眠 ,实现细粒度功耗控制。
工作机制:基于struct device引用计数模型
-
pm_runtime_get_sync():占用外设,上电恢复工作; -
pm_runtime_put_sync():释放外设,超时自动执行 suspend。
驱动适配要求
所有外设驱动必须实现电源回调接口:
c
struct dev_pm_ops {
int (*runtime_suspend)(struct device *dev);
int (*runtime_resume)(struct device *dev);
};
与 GenPD 协同逻辑
设备节点 DTS 绑定电源域,Runtime PM 触发后,当域内所有设备全部释放,框架自动关闭整个电源域供电,驱动无需直接操作 regulator / 时钟。
重要区分
Runtime PM:局部外设动态开关;System Suspend:整机冻结任务、所有设备统一挂起。
2.4 GenPD 通用电源域 Generic Power Domain
功能目标
对 SoC 内部硬件区块进行电源门控管理,划分独立供电域:GPU 域、ISP 域、USB 域、VPU 域等。
使用方式
设备树直接绑定电源域,框架自动管理上下电时序:
dts
usb@xxx {
power-domains = <&pd_usb>; // 将外设挂载至USB电源域
};
2.5 System Suspend 整机休眠框架
支持两种休眠模式,可根据产品功耗、唤醒时延需求选型:
-
s2idle(Suspend-to-Idle)轻休眠
冻结用户任务,所有外设执行 suspend,CPU 进入最深 Idle;DDR 保持自刷新;不依赖 ATF 集群断电;唤醒速度快,适合需要快速唤醒场景。
-
mem(Suspend-to-RAM STR)深度休眠
通过 ATF/PSCI 关闭 CPU 集群与大部分外设电源域;仅 DDR、唤醒源保持供电;静态功耗更低,唤醒延迟更大。
用户空间控制接口
bash
# 设置休眠模式
echo s2idle > /sys/power/mem_sleep
# 触发整机休眠
echo mem > /sys/power/state
休眠标准执行流程
冻结用户任务 → prepare → suspend → suspend_noirq → 平台底层进入休眠;唤醒流程反向执行。
2.6 辅助功耗管控机制
-
PM QoS
驱动 / 应用设置延迟约束,阻止内核进入超出时延要求的低功耗状态;API:
dev_pm_qos_add_request()。 -
Wakeup 唤醒源管理
配置 GPIO、RTC、UART 等作为休眠唤醒源,DTS / 驱动增加
wakeup-source属性;防止休眠后无法唤醒、异常误唤醒。 -
Wakelock
业务层持有锁阻止系统自动休眠;标准 Linux 可通过 autosleep 机制模拟 Android wakelock 能力。
-
Autosleep 自动休眠
系统空闲达到预设时长,内核自动触发 System Suspend,实现无人值守低功耗。
三、固件与内核交互接口方案
Linux 内核不直接操作 CPU 电源、集群断电硬件,统一使用标准固件接口:
-
PSCI(Power State Coordination Interface)
-
核心调用:CPU_OFF / CPU_SUSPEND / SYSTEM_SUSPEND
-
载体:ATF (TF-A) EL3 安全监控固件
-
职责:CPU 休眠、集群上下电、整机 STR 休眠处理
-
-
SCMI(系统控制管理接口)
与片上 SCP 处理器通信,统一管理时钟、电压、电源域、热管理;适合瑞芯微、TI、NXP 等复杂 SoC 平台。
四、底层支撑依赖模块
上层所有功耗框架依赖以下基础子系统,开发阶段同步适配:
-
Clock Framework:外设时钟门控,低功耗基础;
-
Regulator Framework:管理 PMIC LDO/Buck,支撑 DVFS 与电源域供电;
-
Interrupt 子系统:休眠模式下保留唤醒中断;
-
DDR 控制器驱动:实现休眠状态下内存自刷新控制。
五、功耗调试与验证方案
5.1 调试命令清单
bash
# 查看CPU idle状态参数
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/latency
# 查询外设Runtime PM工作状态
cat /sys/devices/platform/xxx/power/runtime_status
# 遍历系统电源域节点
find /sys/devices -name power_domain
# 功耗综合诊断工具(开启CONFIG_PM_TRACE)
powertop
# 查询休眠唤醒原因
cat /sys/kernel/wakeup_reasons
# 休眠唤醒稳定性压力测试
rtcwake -m mem -s 10
5.2 验证项
-
业务空载:CPU 自动进入 Idle,外设闲置下电;
-
负载变化:DVFS 自动升降频调压;
-
Runtime PM:外设反复打开 / 关闭,电源域正常开关;
-
整机休眠:s2idle/STR 休眠进入正常,唤醒稳定;
-
异常测试:休眠过程插拔外设、唤醒源触发、反复休眠唤醒压力测试。
六、功耗业务协同流程
-
高负载运行阶段:CPUFreq/DevFreq+OPP 动态调压,控制运行功耗;
-
短时空闲阶段:CPU 进入 C-State Idle;外设释放后 Runtime PM 联动 GenPD 关闭电源域;
-
长时间空闲阶段:Autosleep 触发 System Suspend,进入整机低功耗模式。
七、风险点与设计规避措施
| 风险问题 | 规避方案 |
|---|---|
| 无法进入深度 CPU Idle | 开启 CONFIG_NO_HZ_IDLE;合理配置 idle-state min-residency-us |
| 外设持续耗电 | 驱动完整实现 Runtime PM suspend/resume 回调;业务正常释放设备 |
| 休眠无法唤醒 / 频繁误唤醒 | 严格配置 wakeup-source;休眠前屏蔽无关中断 |
| PSCI/SCMI 休眠失败 | 内核 DTS 参数与 ATF/SCP 固件参数对齐,联合调试固件电源流程 |
| 系统无法自动休眠 | 排查业务持续持有 wakelock,定位唤醒源 |
八、交付物清单
-
内核 defconfig 低功耗配置片段;
-
SoC 低功耗 DTS 参考模板(CPUIdle、OPP、电源域、唤醒源);
-
Platform 驱动 Runtime PM 标准代码模板;
-
休眠唤醒测试用例;
-
功耗测试报告模板。
(注:部分内容可能由 AI 生成)