一、 基本概念
1.1、“一级休眠”(浅度休眠):
“一级休眠”与 earlysuspend 不同,需要实现一级休眠的设备,接收到 fb 的 FB_EARLY_EVENT_BLANK 这个 notify 后,再运行相应应的低功耗操作。 哪些设备需要实现一级休眠:lcd、tp,背光,Sensor 等设备; 一级休眠主要应用场景有:听音乐,蓝牙数据传输,wifi 后台下载等。 USB 连接电脑是不能进二级休眠,也就只能停留在一级休眠这个阶段。
1.2、 二级休眠(深度休眠):
Linux 内核提供了三种 Suspend: Freeze、Standby 和 STR(Suspend to RAM), 在用户空间向”/sys/power/state”文件分别写入”freeze”、”standby”和”mem”, 即可触发它们。 当前平台只支持 freeze,mem 两种: Freeze: 无需平台代码参与即可支持,而 freeze 暂时没有场景用到这个。 mem: 需要平台实现 platform_suspend_ops 的相关函数。 standby:我们平台不支持,但实现的流程与 mem 类似,需要实现 platform_suspend_ops 的相关函数;
1.3、 SOC 低功耗处理:
在 trust.img 中,有针对
芯片级的低功耗处理。请参照《RK 平台 SOC 休眠唤 醒原理》
二、 Suspend/resume 有关的代码分布
2.1、 PM Core
kernel/power/main.c----提供用户空间接口(/sys/power/state)
kernel/power/suspend.c----Suspend 功能的主逻辑
kernel/power/suspend_test.c----Suspend 功能的测试逻辑
kernel/power/console.c----Suspend 过程中对控制台的处理逻 辑
kernel/power/process.c----Suspend 过程中对进程的处理逻辑
2.2、 Device PM
drivers/base/power/main.c---设备功耗相关函数调用接口
2.3、 Platform dependent PM
针对 3.10
arch/arm/mach-rockchip/pm_rk3xxx.c 实现相关的 API 供
rockchip_pm.c 中相关 SOC 操作的流程调用;
arch/xxx/plat-xxx/rockchip_pm.c----平台相关的电源管理操作
针对 4.4
通过 psci 的调用陷入 ATF 或者 OPTE(即我们烧写的 trust.img)
三、 suspend&resume 过程概述
四、 休眠代码流程分析
4.1、代码调用流程
enter_state
---->suspend_prepare(state);
---->suspend_test(TEST_FREEZER)
----> suspend_devices_and_enter(state);
--->platform_suspend_begin(state)(; suspend_ops->begin 如果是freeze模式, 则是调用 freeze_ops)
---->suspend_console(); ----> dpm_suspend_start(PMSG_SUSPEND);
(#define PMSG_SUSPEND ((struct pm_
message){ .event = PM_EVENT_SUSPEND, }))
---->dpm_prepare(state);
--->device_prepare(dev, state); (pm->prepare)(prepare 阶段没有类似 pm_prepare_op 这样的 接口直接调用)
---->dpm_suspend(state);
--->device_suspend(dev) (ops->suspend) (pm_op)
--->suspend_test(TEST_DEVICES)
---->suspend_enter(state, &wakeup);
---->platform_suspend_prepare(state);(suspend_ops->prepare)
---->dpm_suspend_late(PMSG_SUSPEND); (ops->suspend_late)(pm_late_early_op)
---->platform_suspend_prepare_late(state);(freeze_ops->prepare()) 与 suspend_ops 无关,这个是 freeze_ops 的调用。
---->suspend_test(TEST_PLATFORM)
---->dpm_suspend_noirq(PMSG_SUSPEND); (ops->suspend_noirq)(pm_noirq_op)
---->platform_suspend_prepare_noirq(state)(suspend_ops->prepare _late)
......
更多详细内容请下载附件查看