目录
1.基本概念和框架
1.1 基本概念
1.2 休眠唤醒技术框架
2. 核心代码分析
3. 详细分析
3.1 suspend sys节点入口
3.2 state_store&pm_suspend
3.3 enter_state
3.3.1 valid_state
3.3.2 suspend_prepare
3.3.3 suspend_devices_and_enter
3.3.4 dpm_suspend_start
3.3.5 suspend_enter
3.3.6 suspend_finish
3.4 唤醒源设置
3.5 struct platform_suspend_ops
3.6 ATF中处理
当我们不用设备的时候,一般需要关机,用的时候再开机,这样有一个问题,开机非常的慢,那么有什么方法即省电又可以快速开机呢?
答案就是休眠唤醒suspend、resume。甚至很多消费者设备例如手机汽车都是假关机,其实还是休眠,这样用户体验好啊,随时用几秒就可以唤醒使用,用户体验才是王道。
休眠唤醒很重要,一般指的是STR(stroe to RAM),其技术涉及范围很广,需求也很多。有电池的设备可以省电,另外就是电源供电的也可以延长设备使用寿命。
注意:电源管理比较小众,这里一次就多发几篇,不占用大家时间。公众号所以文章有需要转载的可以留意或者私信我。欢迎大家点赞,再看,划线,评论等交流!
1.基本概念和框架
1.1 基本概念
STR
一般的嵌入式产品仅仅只实现了挂起到RAM(也简称为s2ram,或常简称为STR),即将系统的状态保存于内存中,并将SDRAM置于自刷新状态,待用户按键等操作后再重新恢复系统。
STD
少数嵌入式Linux系统会实现挂起到硬盘(简称STD),它与挂起到RAM的不同是s2ram并不关机,STD则把系统的状态保持于磁盘,然后关闭整个系统。
这些休眠方式,可以通过操作设备节点/sys/power/state设置freeze、standyby、STR(suspend to RAM)和STD(suspend to disk)去实现。通过写入”freeze”、”standby”和”mem”,即可触发它们。
休眠后,可以通过唤醒源(按键、RTC、屏幕、USB拔插等)对系统进行唤醒,唤醒源是不休眠的,需要保留下来监听唤醒操作。
1.2 休眠唤醒技术框架
-
上层service通过wakelock的使用,在系统不需要工作的时候经由power manager利用PM core提供的文件节点发起休眠。
-
PM core实现power manage的核心逻辑,为上层services提供操作休眠唤醒的相关接口,通过利用底层相关的技术实现休眠唤醒过程中的cpu hotplug、wakup source enable/disable、设备的suspend&resume等。
-
休眠的过程中PM driver会配置、取消唤醒源,调用设备的suspend&resume函数,进行syscore的suspend&resume操作。
Services
Services部分由两类service组成,power manager service及普通的app service。其中,power manager service提供了wakelock锁的create/request/release管理功能,当没有services持有wakelock的话,power manager service会通过往文件节点/sys/power/state写mem发起内核的休眠。
PM core
PM core部分提供了wakelock(决定是否发起休眠)的实现,wakeup_count(用于各services释放wakelock后,到发起内核休眠的期间是否有唤醒源,从而是否进行resume的管理)的实现,suspend的实现。这三个功能分别向上层提供了相应的文件节点,供上层操作。休眠、唤醒的过程中会涉及到进程的freeze&thaw,wakeup source的使能、失能,设备的休眠、唤醒,power domain的关、开,cpu的拔、插等功能或框架。相关代码如下:
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过程中对进程的处理逻辑
PM driver
PM driver部分主要实现了设备驱动的suspend&resume实现,架构驱动(gpio、irq、timer等)低功耗相关的操作。
//Device PM
drivers/base/power/*
//Platform dependent PM
include/linux/suspend.h----定义platform dependent PM有关的操作函数集
arch/xxx/mach-xxx/xxx.c或者
arch/xxx/plat-xxx/xxx.c----平台相关的电源管理操作
suspend&resume过程概述
2. 核心代码分析
echo mem > /sys/power/state
做如上操作后,整个函数调用流程如下:
其中设置suspend的核心函数为suspend_enter, 如下:
相关功能代码见:kernel/power/main.c和suspend.c
等文件。
Linux内核Suspend
总体流程如下ÿ