Linux SoC 低功耗入口及操作指南

Linux SoC低功耗入口及操作指南

目录

文档版本:V1.0

适用范围:嵌入式SoC Linux平台开发

目标:构建完整内核低功耗软件栈,实现运行时动态省电、整机休眠两级功耗管控,支撑产品功耗指标达成

一、方案概述

本方案基于 Linux 内核标准电源管理子系统,自上而下搭建分层低功耗架构。覆盖动态调频调压、CPU 空闲休眠、外设运行时电源管理、电源域门控、整机系统休眠、唤醒管控 全链路能力。

区分两种省电场景:

  1. 系统正常运行状态:外设闲置自动下电、CPU 进入 Idle、动态调压调频,无需冻结整机业务;

  2. 长时间无业务:整机进入系统休眠(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 及以上:深度休眠。
组件设计
  1. Governor 策略器:选用 menu 策略,根据空闲时长自动选择 Idle 深度;

  2. cpuidle_driver:平台驱动注册 SoC 支持的多级 Idle 状态;

  3. 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_IDLE Tickless 无滴答机制,消除周期性 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 整机休眠框架

支持两种休眠模式,可根据产品功耗、唤醒时延需求选型:

  1. s2idle(Suspend-to-Idle)轻休眠

    冻结用户任务,所有外设执行 suspend,CPU 进入最深 Idle;DDR 保持自刷新;不依赖 ATF 集群断电;唤醒速度快,适合需要快速唤醒场景。

  2. 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 辅助功耗管控机制

  1. PM QoS

    驱动 / 应用设置延迟约束,阻止内核进入超出时延要求的低功耗状态;API:dev_pm_qos_add_request()

  2. Wakeup 唤醒源管理

    配置 GPIO、RTC、UART 等作为休眠唤醒源,DTS / 驱动增加wakeup-source属性;防止休眠后无法唤醒、异常误唤醒。

  3. Wakelock

    业务层持有锁阻止系统自动休眠;标准 Linux 可通过 autosleep 机制模拟 Android wakelock 能力。

  4. Autosleep 自动休眠

    系统空闲达到预设时长,内核自动触发 System Suspend,实现无人值守低功耗。

三、固件与内核交互接口方案

Linux 内核不直接操作 CPU 电源、集群断电硬件,统一使用标准固件接口:

  1. PSCI(Power State Coordination Interface)

    • 核心调用:CPU_OFF / CPU_SUSPEND / SYSTEM_SUSPEND

    • 载体:ATF (TF-A) EL3 安全监控固件

    • 职责:CPU 休眠、集群上下电、整机 STR 休眠处理

  2. SCMI(系统控制管理接口)

    与片上 SCP 处理器通信,统一管理时钟、电压、电源域、热管理;适合瑞芯微、TI、NXP 等复杂 SoC 平台。

四、底层支撑依赖模块

上层所有功耗框架依赖以下基础子系统,开发阶段同步适配:

  1. Clock Framework:外设时钟门控,低功耗基础;

  2. Regulator Framework:管理 PMIC LDO/Buck,支撑 DVFS 与电源域供电;

  3. Interrupt 子系统:休眠模式下保留唤醒中断;

  4. 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 验证项

  1. 业务空载:CPU 自动进入 Idle,外设闲置下电;

  2. 负载变化:DVFS 自动升降频调压;

  3. Runtime PM:外设反复打开 / 关闭,电源域正常开关;

  4. 整机休眠:s2idle/STR 休眠进入正常,唤醒稳定;

  5. 异常测试:休眠过程插拔外设、唤醒源触发、反复休眠唤醒压力测试。

六、功耗业务协同流程

  1. 高负载运行阶段:CPUFreq/DevFreq+OPP 动态调压,控制运行功耗;

  2. 短时空闲阶段:CPU 进入 C-State Idle;外设释放后 Runtime PM 联动 GenPD 关闭电源域;

  3. 长时间空闲阶段: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,定位唤醒源

八、交付物清单

  1. 内核 defconfig 低功耗配置片段;

  2. SoC 低功耗 DTS 参考模板(CPUIdle、OPP、电源域、唤醒源);

  3. Platform 驱动 Runtime PM 标准代码模板;

  4. 休眠唤醒测试用例;

  5. 功耗测试报告模板。

(注:部分内容可能由 AI 生成)