基于Android的Linux内核的电源管理

1. 电源管理的状态
android的linux内核为系统提供了4种电源状态,内核的源代码为其中的3种定义了名字和对应的宏定义,名字定义在kernel/power/suspend.c中:
[cpp]view plaincopy
constchar*constpm_states[pm_suspend_max]={
#ifdefconfig_earlysuspend
[pm_suspend_on]=on,
#endif
[pm_suspend_standby]=standby,
[pm_suspend_mem]=mem,
};
对应的宏定义在:include/linux/suspend.h中:
[cpp]view plaincopy
typedefint__bitwisesuspend_state_t;
#definepm_suspend_on((__forcesuspend_state_t)0)
#definepm_suspend_standby((__forcesuspend_state_t)1)
#definepm_suspend_mem((__forcesuspend_state_t)3)
#definepm_suspend_max((__forcesuspend_state_t)4)
很奇怪的是,第四种状态(disk)没有具体的定义,而是硬编码在代码中,不明白为什么会这样做,至少我现在看的版本是这样(2.6.35),这种就是所谓的suspend to disk或者叫hibernate。不过这不是重点,再说,目前也很少有android的设备支持hibernate。
顾名思义:
pm_suspend_on -- 设备处于全电源状态,也就是正常工作状态;
pm_suspend_standby -- 设备处于省电状态,但还可以接收某些事件,具体的行为取决与具体的设备;
pm_suspend_mem -- suspend to memory,设备进入睡眠状态,但所有的数据还保存在内存中,只有某些外部中断才可以唤醒设备;
目前,大多数的android设备都只支持其中的两种:pm_suspend_on 和 pm_suspend_mem,所以下面的讨论说道suspend的地方,均是指pm_suspend_mem。
2. early suspend、late resume
early suspend和late resume是android在标准linux的基础上增加的一项特性。当用户空间的向内核请求进入suspend时,这时候会先进入early suspend状态,驱动程序可以注册early suspend的回调函数,当进入该状态时,内核会逐一地调用这些回调函数。例如显示屏的驱动程序通常会注册early suspend,在他的回调函数中,驱动程序会把屏幕和背光都关闭。在这种状态下,所有的后台进程都还在活动中,该播放歌曲的播放歌曲,该下载数据的依然在下载,只是显示屏不良而已。进入early suspend状态以后,一旦所有的电源锁(wake lock)被释放,系统马上会进入真正的suspend流程,直到最后系统停止工作,等待外部事件的唤醒。
图2.1 电源状态的转换
3. android的电源锁机制:wake lock
android相比标准的linux内核,在电源管理中加入了wake lock机制。一旦申请了某种类型的锁,电源管理模块将会“锁住”某一种电源状态,目前,android提供了两种类型的锁:
wake_lock_suspend -- 阻止系统进入suspend状态;
wake_lock_idle -- 阻止系统进入idle状态;
wake lock也可以设定超时,时间一到,自动释放该锁。
有关wake lock的代码在:kernel/power/wakelock.c中。
4. 电源状态迁移
内核启动完成以后,电源管理系统会在sysfs文件系统中建立3个文件:
/sys/power/state
/sys/power/wake_lock
/sys/power/wake_unlock
电源状态的迁移首先由用户空间的应用程序发起,当系统应用检测到一定时间内没有用户活动后(例如触摸屏、按键),可以向/sys/power/state文件写入相应的电源状态名称(请参考第一节内容),如果写入“mem”,将会触发内核启动suspend的流程,内核将会按照图2.1进行状态的迁移。应用程序也可以通过/sys/power/wake_lock申请一个wake_lock_suspend 类型的锁,相应地,通过/sys/power/wake_unlock则可以释放一个锁。内核在进入suspend之前如果检测到某个锁没有释放,则会放弃本次的suspend过程,直到这个锁释放为止。

超声波传感器在流量测量中的原理解析
一因素或使SiC寿命缩短90%!如何破局?
Exaddon开发了一种低于20μm间距进行细间距探测的3D微打印探针
LED显示“黎明拐点”已至
贴片电容是陶瓷电容吗?
基于Android的Linux内核的电源管理
中国移动的“全球通”回归之路
蓄电池材料一般有哪些?
RFID技术在粮食收购中有什么可以展示自己的
锂电设备企业普遍尝到了“甜蜜的烦恼”
高速相机:工业领域的视觉检测
电动汽车无线充电设备对可编程交流电源的要求与测试
pcb设计需要遵循哪些规范
钳位二极管保护电路图 TVS钳位二极管保护原理详解
一个名叫ehisforadam的Reddit
一文带你读懂目标检测
AI对人类生活及工作将带来巨大影响 半导体技术发展将是人工智能重要的推进器
2016第十届国际ICRN双创大赛VR/AR行业赛 暨首届“红谷滩”杯决赛颁奖典礼
关于第二代矢量信号收发仪的性能分析和应用介绍
Rambus推出全球首个PCIe 6.0接口子系统 面向大数据与AI领域