第十三章_Android内核驱动――电源管理.docVIP

第十三章_Android内核驱动――电源管理.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十三章Android内核驱动——电源管理13.1 基本原理 Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。 ●earlysuspend是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如 LCD可以降低亮度或灭掉; ●suspend是指除电源管理以外的其他外围模块以及cpu均不工作,只有内存保持自刷新的 状态; ●hibernation是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到 “关机”之前的状态。 13.2 电源管理机制的实现 电源管理机制的源代码主要在kernel/power/文件夹下面。 main.c文件是整个框架的入口。用户可以通过读写sys文件/sys/power/state实现控制系统进入低功耗状态。用户对于/sys/power/state的读写会调用到main.c中的state_store(,用户可以写入const char * const pm_states[] 中定义的字符串,比如“on”,“mem”,“standby”,“disk”。 state_store(首先判断用户写入的是否是“disk”字符串,如果是则调用hibernate(函数命令系统进入hibernation状态。如果是其他字符串则调用request_suspend_state((如果未定义CONFIG_EARLYSUSPEND或者调用enter_state((如果未定义CONFIG_EARLYSUSPEND。 request_suspend_state(函数是android相对标准linux改动的地方,它实现在earlysuspend.c 中。在标准linux内核中,用户通过sysfs 写入“mem”和“standby”时,会直接调用enter_state(进入suspend模式,但在android中则会调用request_suspend_state(函数进入early suspend 状态。request_suspend_state(函数代码如下: 可见实际工作的是early_suspend和late_resume这两个函数。Android提供了register_early_suspend和unregister_early_suspend两个函数供驱动调用,分别完成设备earlysuspend的注册和注销。系统将所有注册支持early_suspend的设备驱动对应的handler 挂在一个称为early_suspend_handler的链表上。函数early_suspend和late_resume完成的事情很简单,就是遍历这个链表,依次调用每个设备注册的handler,late_resume是唤醒处于 register_early_suspend函数完成的功能就是把驱动提供的earlysuspend handler挂到early_suspend_handler链表上。unregister_early_suspend则相反,从链表上摘下handler。 fbearlysuspend.c和consoleearlysuspend.c这两个文件实现了针对lcd framebuffer的earlysuspend支持和console的earlysuspend支持。实际上这两个文件就是利用上面earlysuspend.c提供的接口注册了针对framebuffer和console的early suspend handler,并提供相应的handler函数。 Hibernate.c文件实现hibernation低功耗状态,是最彻底的低功耗模式,它把所有内存镜像都写入磁盘中,然后系统关机。该文件还在sysfs文件系统中创建了多个entry,分别是/sys/power/disk,/sys/power/resume和/sys/power/image_size,这样用户可以直接通过sysfs 来控制系统进出hibernation状态。这块代码跟标准Linux内核没有什么区别。 Android改动较大的另一处是增加了wakelock机制。实现在wakelock.c和userwakelock.c中。wakelock可以阻止处于正常运行(active或者空闲(idle状态的系统进入睡眠等低功耗状态。直到所持有的wakelock全部被释放,系统才能进入睡眠等低功耗的状态。 wakelock有加锁和解锁两种状态,加锁的方式有两种,一种是永久的锁住,这样的锁除非显示的放开,是不会解锁的。第二种是超时锁,这种锁会锁定系统一段时间,如果这个时间过去了,这个锁会自动解除。 锁有两种类型: ●WAKE_LOCK_SUSPEND:这种锁会防止系统进入睡眠,这种锁可以具有 WAKE_L

文档评论(0)

0004499 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档