版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android电源管理内核模块总体框架2初始化与接口模块4early suspend/late resume模块8Early suspend/late resume概述8Early suspend/late resume流程9流程1 :创建earlysuspend的核心工作队列线程suspend_work_queue10流程2 :系统启动完成后,相关的驱动程序通过register_early_suspend()函数注册了early suspendlateresume特性10流程 3:用户空间,通过调用set_screen_state函数来触发suspend的流程13流程 4:先valid_st
2、ate()一下,这给了平台相关的代码一个机会确认该平台是否支持所请求的电源状态13流程 5:调用request_suspend_state()函数13流程 6:early_suspend()完成最主要工作13Wakelock模块14Suspend 及平台相关驱动模块14参考资料17Android电源管理内核模块总体框架Android电源管理内核模块,主要是由以下几个基本模块组成,详细分析如下:电源管理内核模块总体组成电源管理内核模块总体组成图电源管理内核模块从功能角度出发,各模块关系示意图如下:电源管理内核模块各模块关系示意图1简单说明:内核空间提供3个sys接口,即加锁,解锁,休眠唤醒,当所
3、有的锁解开的时候,会执行标准linux的suspend.ealry_suspend: 设备:触摸屏,按键,gpu,电子罗盘,摄像头,led,wifi等linux suspend设备:usb cpu 总线等。电源管理内核模块各模块关系示意图2初始化与接口模块主要涉及文件:/kernel/power/main.c;/kernel/power/userwakelock.c在kernel/power/main.c中,定义了一组sysfs的属性文件,其中一个定义是:power_attr(state);line215把这个宏展开后:1. kernel/power/main.h line65732. sta
4、tic struct kobj_attribute state_attr = 3. 4. .attr = 5. 6. .name = "state", 7. 8. .mode = 0644, 9. 10. , 11. 12. .show =state_show, 13. .store =state_store, 14. 15. 源码位置:kernel/power/main.c在此文件中,定义了一组sysfs的属性文件,并且main.c的入口:1. static int _init pm_init(voi
5、d)2. 3. 4. 5. .6. 7. power_kobj =kobject_create_and_add("power", NULL);8. 9. .10. 11. 12. 13. core_initcall(pm_init);14. 函数执行后,会在生成/sys/power目录,该目录下会建立一系列属性文件,其中一个就是/sys/power/state文件.从core_initcall(pm_init))可以知道:函数在初始化时被执行关于此函数可见1,同样,我们从main.c中可以看
6、到,/sys/power目录下应该还有的属性文件有:如果内核:#ifdef CONFIG_PM_SLEEPpower_attr(pm_async);/line 70则有:/sys/power/pm_async功能:cat/sys/power/pm_async用于判断当前设备的suspend、resume操作是否是同步操作echo/sys/power/pm_async用于控制是否异步的执行设备的suspend、resume操作#ifdef CONFIG_USER_WAKELOCKpower_attr(wake_lock);power_attr(wake_unlock);#endif则有:/sys
7、/power/wake_lock,sys/power/unwake_lock文件注意其对应的SHOW与STORE功能实现函数在:/kernel/power/userwakelock.c功能:cat/sys/power/wake_lock查看系统的wake lock情况echo/sys/power/wake_lock申请一个wake lockunwake_lock类似。#ifdef CONFIG_PM_SLEEP#ifdef CONFIG_PM_DEBUGpower_attr(pm_test);/line 132则有:/sys/power/pm_test功能:none>>core &
8、gt;> processors >> platform >> devices >> freezer, 控制范围示意;cat pm_test,在终端上打印出上面数组中的字符串,当前的模式用表示出来。echo devices > pm_test的时候会最终调用到函数pm_test_store()中去,该函数中设置全局变量pm_test_level的值,可以是0-5,分别代表上none freezer。该全局变量会在后面的suspend和resume中被引用到。#ifdef CONFIG_PM_SLEEPpower_attr(wakeup_c
9、ount);则有:/sys/power/wakeup_count注意其对应的SHOW与STORE功能实现函数在:/drivers/base/power/wakeup.c功能:cat/sys/power/wakeup_count读取当前已经注册wakeup事件数目echo/sys/power/wakeup_count写入时,只有写入值和当前已经注册wakeup事件数目相同时,才会有作用,如果成功了,会使内核进入一段连续睡眠如果在写入后没有任何的wakeup事件到来。#ifdef CONFIG_PM_TRACEpower_attr(pm_trace);power_attr(pm_trace_dev
10、_match);则有:/sys/power/pm_trace,/sys/power/pm_trace_dev_match功能:cat/sys/power/pm_trace下面就会显示 1 或者 0echo/sys/power/pm_traceThe /sys/power/pm_trace 本文件可以在保存重启过程中RTC中的最后一个PM事件点,这样可以用来调试时使用。/sys/power/pm_trace则是如果使用了pm_trace,此文件中可以包含和最后的PM事件点有关的设备的名称。这些文件接口使用例子:1) cat /sys/power/state
11、 -查看系统状态,echo mem > /sys/power/state -将系统设置为进入休眠2) echo "name" > /sys/power/wake_lock -申请一个锁cat /sys/power/wake_lock -查看系统的wake lock情况wake_unlock同样。总结:cat会调用相应的xxx_show();echo会调用相应的xxx_store()来实现一定的获取状态或设置等功能。early suspend/late resume模块Early suspend/late resume概述android引入了新的机制来管理电源,e
12、arly suspend、late resume和wake lock。Early Suspend和Late Resume是Android在标准Linux的基础上增加的一项特性。当用户空间的向内核请求进入suspend时,这时候会先进入early suspend状态,驱动程序可以注册early suspend的回调函数,当进入该状态时,内核会逐一地调用这些回调函数。例如显示屏的驱动程序通常会注册early suspend,在他的回调函数中,驱动程序会把屏幕和背光都关闭。在这种状态下,所有的后台进程都还在活动中,该播放歌曲的播放歌曲,该下载数据的依然在下载,只是显示屏不良而已。进入early su
13、spend状态以后,一旦所有的电源锁(wake lock)被释放,系统马上会进入真正的suspend流程,直到最后系统停止工作,等待外部事件的唤醒。Early suspend用于在关闭显示的时候使一些与显示有关的设备(如LCD背光、重力感受器、触摸屏等)都关掉,但是系统可能仍处于运行状态并处理着任务,在嵌入式设备中,背光会消耗大量的电量,所以android引入了early suspend。进入early suspend状态以后,一旦所有的电源锁(wake lock)被释放,系统马上会进入真正的suspend流程,直到最后系统停止工作,等待外部事件的唤醒2。加入后early suspend电源状
14、态整体状态转换图:加入后early suspend电源状态整体状态转换图用户空间的接口创建,见 初始化与接口模块部分存在/sys/power/state的SYS接口Early suspend/late resume流程Early suspend/late resume 调用流程图Early suspend调用流程详细说明流程1 :创建earlysuspend的核心工作队列线程suspend_work_queue源码位置:(平台不同源码实际位置不定,目录及文件固定kernel/power/wakelock.cstatic int _initwakelocks_init(void) .
15、suspend_work_queue = create_singlethread_workqueue("suspend"); .流程2 :系统启动完成后,相关的驱动程序通过register_early_suspend()函数注册了early suspendlateresume特性源码位置:(平台不同源码实际位置不定,目录及文件固定)kernel/power/earlysuspend.cvoid register_early_suspend(struct early_suspend *handler)希望执行early suspend的设备,他的设备驱动
16、程序需要向电源管理系统注册earlysuspend/lateresume,当电源管理系统启动suspend流程时,回调函数suspend会被调用,相反,resume的最后阶段,回调函数resume会被调用。所有注册到系统中的early_suspend结构都会按level值按顺序加入到全局链表early_suspend_handlers中。suspend时,level的数值越小,回调函数的被调用的时间越早,resume时则反过来。例:在PANDA平台上,我们通过命令查看可以看到哪些设备在哪里注册了earlysuspend,其中有明显的网上,触摸屏的身影;1. cd /omap2. fi
17、nd -name "*.*"| xargs grep -rn "register_early_suspend"3. 4. ./drivers/staging/brcm80211/brcmfmac/dhd_linux.c:2023: register_early_suspend(&dhd->early_suspend);5. ./drivers/staging/brcm80211/brcmfmac/dhd_linux.c:2263: unregister_ear
18、ly_suspend(&dhd->early_suspend);6. ./drivers/staging/msm/mddi.c:231: register_early_suspend(&mfd->mddi_early_suspend);7. ./drivers/staging/msm/mdp.c:1087: register_early_suspend(&early_suspend);8. ./drivers/staging/msm/msm_fb.c:986: register_early_suspend(&mfd-&g
19、t;early_suspend);9. ./drivers/staging/msm/mddi_ext.c:222: register_early_suspend(&mfd->mddi_ext_early_suspend);10. ./drivers/leds/ledtrig-sleep.c:67: register_early_suspend(&ledtrig_sleep_early_suspend_handler);11. ./drivers/leds/ledtrig-sleep.c:73: unregister_early_suspend
20、(&ledtrig_sleep_early_suspend_handler);12. ./drivers/video/omap2/dsscomp/gralloc.c:559: register_early_suspend(&early_suspend_info);13. ./drivers/video/omap2/dsscomp/gralloc.c:598: unregister_early_suspend(&early_suspend_info);14. ./drivers/misc/akm8975.c:664: register_ear
21、ly_suspend(&akm->early_suspend);15. ./drivers/input/touchscreen/synaptics_i2c_rmi.c:539: register_early_suspend(&ts->early_suspend);16. ./drivers/input/touchscreen/synaptics_i2c_rmi.c:561: unregister_early_suspend(&ts->early_suspend);17. ./drivers/input/misc/gpio_event
22、.c:177: register_early_suspend(&ip->early_suspend);18. ./drivers/input/misc/gpio_event.c:203: unregister_early_suspend(&ip->early_suspend);19. ./drivers/input/misc/gpio_event.c:227: unregister_early_suspend(&ip->early_suspend);20. ./drivers/gpu/pvr/display/omap_sg
23、x_displayclass.c:1594: register_early_suspend(&driver_early_suspend);21. ./drivers/gpu/pvr/display/omap_sgx_displayclass.c:1611: unregister_early_suspend(&driver_early_suspend);22. ./drivers/gpu/pvr/omaplfb/omaplfb_linux.c:841: register_early_suspend(&psDevInfo->sEarlyS
24、uspend);23. ./drivers/gpu/pvr/omaplfb/omaplfb_linux.c:852: unregister_early_suspend(&psDevInfo->sEarlySuspend);24. ./drivers/net/wireless/bcmdhd/dhd_linux.c:2674: register_early_suspend(&dhd->early_suspend);25. ./drivers/net/wireless/bcmdhd/dhd_linux.c:3472: unregister_e
25、arly_suspend(&dhd->early_suspend);26. ./drivers/net/wireless/bcm4329/dhd_linux.c:2206: register_early_suspend(&dhd->early_suspend);27. ./drivers/net/wireless/bcm4329/dhd_linux.c:2559:流程 3:用户空间,通过调用set_screen_state函数来触发suspend的流程可参考:Android能耗管理机制及优化-电源键事件处理流程 4:先valid_state()一下,这给了
26、平台相关的代码一个机会确认该平台是否支持所请求的电源状态源码位置:/kernel/power/suspend.cbool valid_state(suspend_state_t state) /* * All states need lowlevel support and need to be valid to the lowlevel * implementation, no valid callback implies that none are valid. */ return suspend_ops &&
27、suspend_ops->valid && suspend_ops->valid(state); 流程 5:调用request_suspend_state()函数request_suspend_state()只是简单地向suspend_work_queue中加入early_suspend_work或者是late_resume_work并调度他们执行。源码位置:kernel/power/earlysuspend.cvoid request_suspend_state(suspend_state_t new_state) 流程 6:early_su
28、spend()完成最主要工作在 early_suspend()函数中,首先要判断当前请求的状态是否还是suspend,若不是,则退出了;若是,early_suspend()遍历 early_suspend_handlers链表,从中取出各个驱动程序注册的early_suspend结构,然后调用它的suspend回调函数。 最后,释放main_wake_lock锁,至此整个earlysuspend的流程完成。这时整个系统只是处于所谓的idle状态,cpu还在工作,后台进程也在工作中,某些设备可以选择进入某种功耗较低的状态,比如LCD可以降低亮度或灭掉。源码位置:kernel/power/earl
29、ysuspend.cstatic void early_suspend(struct work_struct *work)Wakelock模块Wake lock -是一种锁的机制,只要有task拿着这个锁,系统就无法进入休眠,可以被用户态进程和内核线程获得。这个锁可以是有超时的或者是没有超时的,超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了,内核就会启动标准linux的那套休眠机制机制来进入休眠。详细内核实现可参见:Wakelock相关机制之wakelock 内核实现Suspend 及平台相关驱动模块在wake_unlock()中(可参见上面wakelock模块内容),删除链表中wake_lock节点,判断当前是否存在wake_lock,若wake_lock的数目为0,则调用工作队列suspend_work,进入suspend状态。static DECLARE_WORK(suspend_work, suspend);其详细如下:susp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年农产品仓储保鲜冷链物流设施建设试题
- 2026年医疗合规经理面试题库
- 2026年温度敏感产品断链应急预案试题
- 2026年新高考化学情境化试题应对策略
- 2026年面试礼仪与着装指南中国能建集团面试
- 2026年保险资金运用岗位招聘考试题
- 2026年粮食产后服务中心建设及服务知识测试
- 2026年信息时代新闻传播发展趋势考题集
- 2026年无线电频率使用许可管理办法与干扰协调处理流程测试
- 2026年供销社农资服务助力粮食单产提升测试
- DBJ50-T-200-2024 建筑桩基础技术标准
- 2024船用电气电子产品型式认可试验指南
- 更换潜污泵施工方案
- 物业防恐防暴演练课件
- 《沉井与沉箱结构》课件
- 2024年04月中国邮政储蓄银行股份有限公司广西壮族自治区分行2024年春季校园招考笔试历年参考题库附带答案详解
- UL489标准中文版-2019断路器UL标准中文版
- 医疗核心制度考试题(含参考答案)
- AQ/T 9009-2015 生产安全事故应急演练评估规范(正式版)
- 2024年高考北京卷物理真题
- 2024年立体停车场项目立项申请报告范本
评论
0/150
提交评论