第六部分 设备休眠
第一节 Linux休眠唤醒
设备休眠模式,是指设备通过固定的操作,或手动或自动地进入省电模式,挂起或者冻结程序、外设甚至cpu,从而进入一种待机状态,使设备在这种待机状态下尽可能少地消耗电量和功耗,从而满足家用手持设备对待机时长的性能要求。设备在进入休眠状态之后需要能够通过固定的操作进行唤醒,这个唤醒操作使设备能快速地恢复到休眠之前的状态,并正常工作。
首先,关于省电模式,Linux内核支持三种省电模式:standby、STR(suspendto ram)、STD(suspendtodisk),几乎所有的方案都只支持STR模式(也有同时支持standby模式的),但是在使用电池供电的手持设备时,由于STD模式需要有交换分区的支持,而我们的嵌入式设备一般文件系统中是不提供交换分区的,所以这类设备上的Linux都没有支持STD省电模式。在设备中如果已经有对电源管理PM模块的支持,我们就可以查看设备支持的省电模式类型,查看方法是输入命令“cat/sys/power/state”。
先从内核设置开始说起,关于内核的配置,在整个调测过程中是以海思Hi3516AV100R001C01SPC030的SDK提供的内核版本为基础,内核版本号是3.4.35,内核源码中有提供默认的配置文件:hi3516a_full_defconfig,在menuconfig中查看powermanagement options,配置中电源管理配置默认是打开的,其子项的配置如下图所示:
图6-1海思3516A电源管理配置
从以上配置我们可以看到,挂起方式支持RAM和standby两种方式。除此之外,配置默认打开了snapshot快照功能,Hiberanation即STD功能和DEBUG相关的功能。所以我们默认的休眠模式至少支持STR和standby两种方式,这里STD模式虽然打开了,但是由于对交换分区的限制,该功能是否能正常使用,我在后面有做调测和分析。
在如图示的配置中,PowerManagement DebugSupport功能被打开,这个配置被打开之后在系统的/sys/power目录下会多出一个pm_test文件,catpm_test后,列出的测试选项有:[none]core processors platform devicesfreezer。这里有六个参数,代表pm调试的六个级别,跟踪Linux内核里面的相关代码,我发现这六个参数代表了系统挂起的六个阶段,所以,我们可以通过设置这个参数来分别对每一阶段的挂起操作进行调试查看。其中,freezer是级别最低的,none是表示不进行pm_test,也就是完成所有的挂起操作。
有了以上内核的配置支持之后,我们就可以进行简单的休眠唤醒调试了,只要在系统中输入两条命令即可:
echoplatform > /sys/power/pm_test
echomem > /sys/power/state
表示设置采用STR的方式进行休眠,休眠到platform阶段为止,后面的休眠操作不再进行。输入命令之后在设备终端是可以看到相关的操作流程的打印信息的。
第二节 休眠流程
下图为目前内核代码中的休眠的流程:
图6-2海思