总结echo mem 命令如何让 RK3576 进入低功耗:从内核入口追到 BL31
B站 嵌入式孙老师博主个人介绍博主书籍-京东购买链接Yocto项目实战教程加博主微信进技术交流群jerrydev在 RK3576 上调试低功耗时最常用的命令是echomem/sys/power/state它看起来只是向 sysfs 写入一个字符串实际会启动完整的 System Suspend 流程Linux PM Core ↓ 设备驱动挂起 ↓ Regulator 配置 PMIC ↓ genpd 关闭部分 Power Domain ↓ PSCI SYSTEM_SUSPEND ↓ SMC 进入 BL31 ↓ RK3576 PMU 执行整机低功耗我沿着当前 RK3576 Linux 6.1 内核代码把这条链路重新梳理了一遍。理解它的关键不是记住所有函数而是分清三条电源控制路径路径管理对象关键代码RegulatorRK806 的 BUCK、LDO 等真实电压drivers/regulator/Power DomainRK3576 内部 GPU、NPU、GMAC 等功能域drivers/soc/rockchip/pm_domains.cPSCI / BL31 / PMUCPU、Logic、DDR、PLL 和整机待机时序drivers/firmware/psci/psci.c这三条路径由 Linux PM 框架串联起来但控制对象并不相同。本文中的函数和代码位置基于当前 RK3576 Linux 6.1 仓库整理。一、mem是休眠入口不是固定深度/sys/power/state表示什么设备上查看cat/sys/power/state输出freeze mem表示内核支持两个系统级休眠入口状态含义freezeSuspend-to-Idle主要冻结软件和设备mem内存挂起入口具体模式由mem_sleep决定继续查看cat/sys/power/mem_sleep当前系统输出s2idle [deep]方括号表示当前选中的模式因此现在执行echomem/sys/power/state实际进入的是deep。echo deep为什么不会立即休眠下面这条命令echodeep/sys/power/mem_sleep只是在选择mem后续采用哪种模式不会立即触发系统挂起。二者分工很明确/sys/power/mem_sleep └─ 选择 s2idle 或 deep /sys/power/state └─ 真正触发休眠当前已经显示s2idle [deep]所以无需重复设置直接执行即可echomem/sys/power/statemem在内核中如何转换入口位于kernel/power/main.c核心逻辑如下staticssize_tstate_store(...){statedecode_state(buf,n);if(statePM_SUSPEND_MAX){if(statePM_SUSPEND_MEM)statemem_sleep_current;errorpm_suspend(state);}}关键代码是if(statePM_SUSPEND_MEM)statemem_sleep_current;实际处理过程为字符串 mem ↓ decode_state() ↓ PM_SUSPEND_MEM ↓ 替换成 mem_sleep_current ↓ pm_suspend()所以mem本身不是一个固定的硬件深度它是一个通用入口。在当前系统中mem_sleep_current deep因此这次会进入 RK3576 平台级 System Suspend。deep与关机的区别deep通常可理解为 Suspend-to-RAMCPU 停止运行或断电 Linux 暂停执行 普通外设 挂起或断电 DDR 进入自刷新 DDR数据 继续保留 唤醒后 从原来的运行位置继续它不是关机。关机DDR数据丢失下次重新启动Linux deepDDR数据保留唤醒后继续执行二、RK3576 低功耗中的三条控制路径Regulator控制板上的真实电压Regulator 是 Linux 通用电压管理框架。RK806 内部的每一路 BUCK、LDO都会作为一个 regulator 注册到内核例如VDD_CPU VDD_GPU VDD_NPU VDD_LOGIC DDR相关电源 VCC_3V3 VCC_1V8设备树可以配置某路电源在mem状态下保持或关闭regulator-state-mem { regulator-off-in-suspend; };表示进入 Suspend 时关闭。保持供电则配置regulator-state-mem { regulator-on-in-suspend; };Regulator 的 PM 回调位于drivers/regulator/core.c核心结构为staticconststructdev_pm_opsregulator_pm_ops{.suspendregulator_suspend,};在设备 PM 的dpm_suspend()阶段内核会调用regulator_suspend()它根据regulator-state-mem配置通过对应的 PMIC 驱动设置 RK806 寄存器。因此这条路径管理的是某一路真实电压在休眠期间保持、关闭或切换到低功耗状态。Rockchip PM 驱动还提供rockchip,regulator-on-in-mem; rockchip,regulator-off-in-mem; rockchip,regulator-on-before-mem;例如rockchip,regulator-on-before-mem vdd_npu_s0;它会在进入深睡前的suspend_late阶段临时打开指定 regulator用来满足特定电源时序。这不表示 NPU 在整个休眠期间继续工作。Power Domain控制 RK3576 内部功能域Power Domain 管理的是 RK3576 芯片内部的功能模块例如GPU NPU ISP VPU USB SDGMAC PHP 显示和视频模块Rockchip 驱动位于drivers/soc/rockchip/pm_domains.c核心关断函数是rockchip_pd_power(pd,false);典型处理过程为设备停止业务 ↓ 等待总线空闲 ↓ 关闭模块时钟 ↓ 设置隔离 ↓ 关闭内部 Power Domain这条路径操作的是 RK3576 内部 PMU 寄存器不会直接通过 I²C 控制 RK806。例如关闭 RK3576_PD_SDGMAC只表示 SoC 内部的 GMAC 控制器域被关闭不表示外部 Ethernet PHY 的 3.3V 电源一定断开。两者属于不同层次GMAC Power Domain └─ RK3576芯片内部 PHY供电 └─ PMIC、MOS或Load SwitchPower Domain 通常在系统挂起后期参与。部分设备驱动在.suspend_noirq中调用pm_runtime_force_suspend();随后由 genpd 判断域内设备是否已经全部空闲再决定是否调用rockchip_pd_power(pd,false);BL31 与 PMU完成整机级休眠Regulator 和普通 Power Domain 能关闭大量设备但还不足以让整个 RK3576 进入深度待机。系统级动作包括DDR进入自刷新 关闭CPU 关闭vdd_arm 关闭vdd_logic 关闭PLL 切换到32K 配置IO Retention 配置Sleep Pin 配置系统唤醒源这些动作由 PSCI、BL31 和 RK3576 PMU 完成。职责可以概括为层次主要职责设备驱动停止业务、保存寄存器状态Regulator配置 RK806 各路输出电压Power Domain关闭 RK3576 内部功能域BL31 / PMU完成 CPU、Logic、DDR、PLL 等系统级休眠它们不是重复控制而是从设备到整机逐层收尾。三、沿着echo mem跟踪内核调用链完整代码路径echo mem /sys/power/state ↓ state_store() ↓ pm_suspend() ↓ enter_state() ↓ suspend_prepare() ↓ dpm_suspend_start() ├─ dpm_prepare() └─ dpm_suspend() ↓ dpm_suspend_late() ↓ dpm_suspend_noirq() ↓ syscore_suspend() ↓ suspend_ops-enter() ↓ psci_system_suspend_enter() ↓ cpu_suspend() ↓ invoke_psci_fn() ↓ SMC进入BL31Linux 先冻结进程pm_suspend()进入suspend_prepare()主要完成发送 PM_SUSPEND_PREPARE 通知 ↓ 冻结用户空间进程 ↓ 冻结可冻结的内核线程这样可以防止休眠过程中应用继续访问网络、存储、摄像头、USB 等设备。设备 PM 分阶段执行设备挂起不是一次完成而是分四个阶段dpm_prepare() ↓ dpm_suspend() ↓ dpm_suspend_late() ↓ dpm_suspend_noirq()阶段主要任务prepare休眠前准备suspend停止设备业务、保存状态suspend_late处理依赖和电源时序suspend_noirq普通中断关闭后的最终处理Rockchip PM、Regulator 和 Power Domain分别在这些阶段参与。dpm_prepare()Rockchip 下发休眠策略RK3576 的平台配置驱动位于drivers/soc/rockchip/rockchip_pm_config.c它注册了staticconststructdev_pm_opsrockchip_pm_ops{.preparepm_config_prepare,.completepm_config_complete,.suspend_latepm_config_suspend_late,.resume_earlypm_config_resume_early,};在dpm_prepare()阶段调用pm_config_prepare()它读取 DTS 中的rockchip,sleep-mode-config; rockchip,wakeup-config; rockchip,sleep-io-ret-config; rockchip,sleep-pin-config;属性作用sleep-mode-config决定系统休眠深度wakeup-config配置可用唤醒源sleep-io-ret-config配置需要保持状态的 IO 域sleep-pin-config配置休眠时 Sleep Pin 状态随后通过sip_smc_set_suspend_mode(...)把这些参数提前交给 BL31。简化后的逻辑如下sip_smc_set_suspend_mode(SUSPEND_MODE_CONFIG,sleep_mode,0);sip_smc_set_suspend_mode(WKUP_SOURCE_CONFIG,wakeup_config,0);这里仅仅是在告诉 BL31真正进入休眠时应该关闭哪些资源、保留哪些唤醒源。此时 Linux 和 CPU 仍然在运行系统还没有真正睡下去。dpm_suspend()应用 PMIC 休眠配置进入dpm_suspend()Linux 会遍历所有设备并调用.suspend()。Regulator 设备在这里调用regulator_suspend()应用regulator-state-mem所以这一步可能真正修改 RK806 的休眠寄存器配置。需要区分两件事pm_config_prepare() └─ 把平台低功耗参数交给BL31 regulator_suspend() └─ 配置PMIC各路BUCK/LDO状态两者不是同一条代码路径。dpm_suspend_late()处理最后阶段电源时序随后进入dpm_suspend_late()Rockchip 的pm_config_suspend_late()会在这里执行。例如rockchip,regulator-on-before-mem vdd_npu_s0;指定的 regulator 会在这里临时打开。这类配置用于满足进入深睡前的特殊硬件时序不应理解为对应模块在待机期间仍然正常工作。dpm_suspend_noirq()处理 Power Domain接下来进入dpm_suspend_noirq()此时普通设备中断基本已经关闭。设备驱动可能通过pm_runtime_force_suspend();触发 genpd 关闭对应功能域最终进入rockchip_pd_power(pd,false);这一步控制的是 RK3576 内部 Power Domain不直接控制外部 PMIC 电压。PSCI从 Linux 进入 BL31Linux 完成设备、Regulator 和普通 Power Domain 的处理后会调用suspend_ops-enter(state);在 RK3576 ARM64 平台中对应psci_system_suspend_enter()代码位于drivers/firmware/psci/psci.c核心结构staticconststructplatform_suspend_opspsci_suspend_ops{.validsuspend_valid_only_mem,.enterpsci_system_suspend_enter,};进入函数staticintpsci_system_suspend_enter(suspend_state_tstate){returncpu_suspend(0,psci_system_suspend);}cpu_suspend()保存 CPU 上下文然后执行staticintpsci_system_suspend(unsignedlongunused){phys_addr_tpa_cpu_resume__pa_symbol(cpu_resume);returninvoke_psci_fn(PSCI_FN_NATIVE(1_0,SYSTEM_SUSPEND),pa_cpu_resume,0,0);}关键位置是invoke_psci_fn(PSCI_FN_NATIVE(1_0,SYSTEM_SUSPEND),...);它最终触发 SMCLinux KernelEL1 │ │ PSCI SYSTEM_SUSPEND ▼ BL31EL3从这里开始Linux 内核暂停运行。后面的 DDR 自刷新、PLL 关闭、CPU 和 Logic 断电、唤醒等待都由 BL31 和 RK3576 PMU 负责。Linux 内核代码跟踪到这里结束。四、DTS 决定系统最终睡多深三档核心休眠模式RK3576 的定义位于include/dt-bindings/suspend/rockchip-rk3576.h三档核心模式是#defineRKPM_SLP_ARMOFF_DDRPDBIT(2)#defineRKPM_SLP_ARMOFF_LOGOFFBIT(3)#defineRKPM_SLP_ARMOFF_PMUOFFBIT(4)模式主要关闭范围功耗唤醒能力ARMOFF_DDRPDARM及DDR控制相关部分较高较多ARMOFF_LOGOFFARM、Logic较低较少ARMOFF_PMUOFFARM、Logic、PMU1最低最少核心规律是关闭资源越多 ↓ 待机功耗越低 ↓ 保留的硬件越少 ↓ 可用唤醒源越少真正决定休眠深度的是rockchip,sleep-mode-config而不是echo mem本身。echo mem负责触发流程BL31 最终执行哪种低功耗策略由 DTS 配置决定。时钟和 PMIC 附加配置常见选项还有RKPM_SLP_PMU_PMUALIVE_32K RKPM_SLP_PMU_DIS_OSC RKPM_SLP_PMIC_LP RKPM_SLP_32K_EXT配置作用PMUALIVE_32KPMU Alive 域切换到 32KDIS_OSC关闭 24M 晶振PMIC_LP配置 PMIC 低功耗状态32K_EXT使用外部 32K 时钟关闭 24M 可以进一步降低功耗但依赖 24M 的 USB、UART、PWM 等唤醒方式可能受到影响。因此低功耗配置并不是“关闭得越多越好”而是要在功耗、唤醒能力和恢复稳定性之间做取舍。唤醒由 PMU 检测进入深度休眠后CPU 停止运行或断电 Linux 停止执行 DDR 保持自刷新 PMU Always-On 继续工作 唤醒检测逻辑 继续工作真正等待唤醒事件的不是 Linux而是 RK3576 PMU。以 GPIO0 唤醒为例外部 GPIO 事件 ↓ GPIO0 唤醒信号进入 PMU ↓ PMU 恢复电源和时钟 ↓ BL31 恢复 CPU 上下文 ↓ 跳转到 cpu_resume ↓ 返回 Linux恢复阶段按相反顺序展开syscore_resume() ↓ dpm_resume_noirq() ↓ dpm_resume_early() ↓ dpm_resume() ↓ dpm_complete() ↓ 解冻用户进程五、实战中如何确认低功耗是否生效确认当前模式cat/sys/power/statecat/sys/power/mem_sleep预期输出freeze mem s2idle [deep]执行休眠echomem/sys/power/state查看 Linux 日志唤醒后执行dmesg|grep-iEPM:|suspend|resume|wakeup重点关注PM: suspend entry (deep) Freezing user space processes Suspending console(s) PM: suspend exit查看 BL31 日志DTS 中打开rockchip,sleep-debug-en 1;串口中可能看到INFO: deep INFO: armoff_logoff INFO: pmu_pmualive_32k INFO: io_ret (...) INFO: sleep_pin: ... INFO: wake up status: ...这些日志可以确认是否进入deep实际使用哪种 ARMOFF 模式是否切换到 32KIO Retention 是否配置Sleep Pin 是否生效最终由哪个事件唤醒。软件日志不能代替电压测量日志只能说明软件流程执行到了哪里不能证明所有板级电压都按预期变化。仍需要实际测量VDD_CPU VDD_LOGIC DDR电源 24M晶振 Sleep Pin VCC_3V3_S0 VCC_3V3_S3 外部PHY和无线模块电源特别是板级 MOS、Load Switch 和_S0、_S3电源命名最终都应以原理图和实测波形为准。总结RK3576 执行echomem/sys/power/state背后的完整过程是echo mem ↓ Linux PM Core冻结进程 ↓ 设备驱动停止业务 ↓ Rockchip PM驱动下发休眠参数 ↓ Regulator配置RK806电压状态 ↓ genpd关闭RK3576内部功能域 ↓ PSCI SYSTEM_SUSPEND ↓ SMC进入BL31 ↓ RK3576 PMU完成整机深度休眠其中Regulator └─ 管理板级真实电压 Power Domain └─ 管理SoC内部功能模块 BL31 / PMU └─ 管理CPU、Logic、DDR、PLL和系统唤醒echo mem不是一条直接关闭 PMIC 的命令也不是单独触发某个 Power Domain。它的作用是启动 Linux System Suspend让软件、设备、电源和固件按照既定顺序逐层进入低功耗最终由 BL31 和 RK3576 PMU 完成整机级休眠。

相关新闻

基于SpringBoot+Vue的创新创业学分管理系统(源码+LW+调试文档+讲解)

基于SpringBoot+Vue的创新创业学分管理系统(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/7/30 3:25:19 阅读更多 →
3分钟掌握STL转STEP:解锁CAD设计新境界的终极指南

3分钟掌握STL转STEP:解锁CAD设计新境界的终极指南

3分钟掌握STL转STEP:解锁CAD设计新境界的终极指南 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 你是否曾因3D打印的STL文件无法在专业CAD软件中编辑而烦恼?stltostp正…

2026/7/30 3:25:19 阅读更多 →
HandBrake视频格式转换:从编码原理到高效压缩的完整指南

HandBrake视频格式转换:从编码原理到高效压缩的完整指南

1. 项目概述:为什么我们需要一个靠谱的视频格式转换器?如果你经常需要处理视频,无论是从网上下载的电影、自己用手机拍的Vlog,还是工作需要的演示材料,大概率都遇到过格式不兼容的麻烦。视频文件后缀名五花八门&#x…

2026/7/30 3:24:19 阅读更多 →

最新新闻

VMware安装蓝屏与注册表错误:从虚拟化原理到彻底修复指南

VMware安装蓝屏与注册表错误:从虚拟化原理到彻底修复指南

1. 项目概述:当VMware遇上注册表与蓝屏如果你正在折腾虚拟机,尤其是VMware Workstation或者Player,那么“无法打开注册表项”和“一开虚拟机电脑就蓝屏重启”这两个拦路虎,你大概率迟早会碰上。这可不是什么小众问题,而…

2026/7/30 3:35:23 阅读更多 →
Unity动态河流与泥石流模拟:基于动态网格与着色器的程序化生成方案

Unity动态河流与泥石流模拟:基于动态网格与着色器的程序化生成方案

1. 项目概述:从静态水体到动态灾害的路径模拟在游戏开发、虚拟仿真和数字孪生项目中,河流与泥石流这类动态环境元素,往往是提升场景真实感与沉浸感的关键。传统做法可能是直接使用Unity的Terrain系统绘制静态水体,或者放置预制好的…

2026/7/30 3:35:23 阅读更多 →
Unity Recorder保姆级教程:录制透明背景序列帧与游戏视频

Unity Recorder保姆级教程:录制透明背景序列帧与游戏视频

1. 项目概述:为什么你需要一个“保姆级”的Unity Recorder教程?如果你正在用Unity开发游戏,无论是独立开发者还是团队中的一员,制作宣传视频、录制玩法演示、或者为UI和特效生成序列帧动画,都是绕不开的环节。你可能试…

2026/7/30 3:35:23 阅读更多 →
Android逆向实战:从APKTool解包到Smali修改金币的完整指南

Android逆向实战:从APKTool解包到Smali修改金币的完整指南

1. 项目概述:为什么我们需要一本Android逆向操作手册?在移动应用开发和安全研究的圈子里,Android逆向工程一直是一个既神秘又充满挑战的领域。你可能是一名开发者,想了解竞品应用的某个炫酷动画是如何实现的;或者是一名…

2026/7/30 3:35:23 阅读更多 →
PLC五层电梯控制系统开发与优化实战

PLC五层电梯控制系统开发与优化实战

1. 项目背景与核心需求五层电梯控制系统是工业自动化领域的经典实训项目,也是PLC编程入门的绝佳练手案例。去年我在某商业综合体设备改造项目中,负责了一套西门子S7-200 PLC控制的客梯系统升级。这个实战案例完美覆盖了PLC硬件选型、梯形图编程、组态界面…

2026/7/30 3:35:23 阅读更多 →
上海GEO优化服务真的能提升网站流量吗?

上海GEO优化服务真的能提升网站流量吗?

上海GEO优化服务真的能提升网站流量吗?大家好,我是20260609GEO,一个专注于分享真实使用体验的好物博主。今天我要和大家分享的是我在使用上海洽特科技的GEO AI搜索产品的一些真实感受。如果你也对提升网站流量感兴趣,不妨继续往下…

2026/7/30 3:34:23 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻