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

 1.     电源管理      的状态

    Android       Linux   内核为系统提供了4种电源状态,内核的源代码为其中的3种定义了名字和对应的宏定义,名字定义在kernel/power/suspend.c中:

[cpp] view pl     ai   n copy

const char *const pm_sta     te   s[PM_SUSPEND_MAX] = {

#ifdef CONFIG_EARLYSUSPEND

[PM_SUSPEND_ON]     = "on",

#endif

[PM_SUSPEND_STANDBY]    = "standby",

[PM_SUSPEND_MEM]    = "mem",

};


对应的宏定义在:include/linux/suspend.h中:

[cpp] view plain copy

typedef int __bitwise suspend_state_t;

#define PM_SUSPEND_ON       ((__force suspend_state_t) 0)

#define PM_SUSPEND_STANDBY  ((__force suspend_state_t) 1)

#define PM_SUSPEND_MEM      ((__force suspend_state_t) 3)

#define PM_SUSPEND_MAX      ((__force suspend_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流程,直到最后系统停止工作,等待外部事件的唤醒。

 基于Android的Linux内核的电源管理_设计制作_处理器/DSP

图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过程,直到这个锁释放为止。



87
139
0
15

相关资讯

  1. 1、银幕不是最后的舞台,《一出好戏》可能实现电影向话剧反输出3497
  2. 2、《奇怪的袜子精灵》:袜子总是丢一只?原因在这里呀!1627
  3. 3、《陪读妈妈》为夏天挂出免死金牌!男主角此时必须任性2034
  4. 4、从9.1到3.8分,国产剧真不能这么作。。。3492
  5. 5、专访陈瑾如|做演员的心始终坚定1193
  6. 6、《理想照耀中国》好看在哪?3点足以调动观众的胃口,优秀3675
  7. 7、经超饰演的凌云彻上线,结局被海兰赐死,帮如懿扳倒令妃!1502
  8. 8、2020,再见丨最后一天,中国电影票房突破200亿!2396
  9. 9、《做梦吧!晶晶》全新来袭,微短剧或成抖音全娱乐布局新王牌?4341
  10. 10、秦俊杰工作室回应造谣,网友:分手吃相不要太难看3596
全部评论(0)
我也有话说
0
收藏
点赞
顶部