android的休眠和唤醒流程
android休眠唤醒流程:
power按键事件上报给android系统,最终由windownmanager接收到,当有按键事件时判断是否需要休眠后唤醒系统,然后调用powermanager系统服务去写/sys/power/state节点.
此节点的写函数里判断收到的内容,来执行android的休眠early_suspend/唤醒late_resume流程.
android层:
private int setScreenStateLocked(boolean on) 电源管理服务: frameworks/base/services/java/com/android/server/PowerManagerService.java
int err = Power.setScreenState(on);
在文件frameworks/base/core/java/android/os/Power.java定义
79 public static native int setScreenState(boolean on);
具体实现在:frameworks/base/core/jni/android_os_Power.cpp
static int setScreenState(JNIEnv *env, jobject clazz, jboolean on);
set_screen_state(on); 在文件hardware/libhardware_legacy/power/power.c中定义并实现
write(g_fds[REQUEST_STATE], buf, len); 写/sys/power/state节点
内核层:
向节点写内容会调用kernel/power/main.c的写函数:
static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n)
request_suspend_state(state); 调用此函数: 具体实现在./kernel/power/earlysuspend.c中
state: 为休眠则调用early_suspend_work android early_suspen工作队列
为唤醒则调用late_resume_work android late_resume_work工作队列
drivers/video/samsung/s3cfb_main.c中早已经注册屏幕开关
register_early_suspend(&fbdev[i]->early_suspend);
所以
为休眠则调用early_suspend_work中的屏幕休眠函数:
s3cfb_early_suspend()
backlight_on()---->s3cfb_backlight_on() 在文件arch/arm/plat-s5p/dev-fimd-s5p.c中定义 npd->backlight_on = s3cfb_backlight_on;
s3cfb_backlight_on中直接操作用来控制lcd的gpio关闭屏幕 arch/arm/mach-exynos/setup-fb-s5p.c
为唤醒时调用late_resume_work中的屏幕唤醒函数:
s3cfb_late_resume()
backlight_off()---->s3cfb_backlight_off() 在文件arch/arm/plat-s5p/dev-fimd-s5p.c中定义 npd->backlight_off = s3cfb_backlight_off;
s3cfb_backlight_off中直接操作用来控制lcd的gpio使能屏幕
执行完所有的early_suspend后执行解锁main_wake_lock,以便休眠.
wake_unlock(&main_wake_lock);
mod_timer(&expire_timer, jiffies + has_lock); 在文件/kernel/power/wakelock.c中
此函数将启用expire_timer定时器,定时器内容即expire_wake_locks
340 static DEFINE_TIMER(expire_timer, expire_wake_locks, 0, 0);
有四种方式可以引起休眠
①在wake_unlock()中, 如果发现解锁以后没有任何其他的wake lock了, 就开始休眠
②在定时器到时间以后, 定时器的回调函数会查看是否有其他的wake lock, 如果没有, 就在这里让系统进入睡眠
③在wake_lock() 中, 对一个wake lock加锁以后, 会再次检查一下有没有锁, 刚加上锁,为什么要检查,有用吗????
④按power键,调用earlysuspend.使系统或应用程序释放锁.从而调用上述三个函数进入休眠
if(has_lock ==0)
queue_work(suspend_work_queue,&suspend_work); 由DECLARE_WORK(suspend_work, suspend);知道,队列中的内容即suspend函数.
suspend(); kernel/power/wakelock.c
pm_suspend(requested_suspend_state);
enter_state(state); kernel/power/suspend.c
suspend_devices_and_enter(state);
suspend_enter(state);
suspend_ops->enter(state); -->调用平台相关的休眠函数,定义在中arch/arm/plat-samsung/pm.c:379:static const struct platform_suspend_ops s3c_pm_ops
即s3c_pm_enter
s3c_pm_arch_stop_clocks() --> 休眠时执行的的最后一个函数.系统停在此处,等待中断或rtc等唤醒源唤醒.
从此处开始唤醒流程
enable_nonboot_cpus();
suspend_test_start(); ---------->kernel已经被唤醒,当按键或中断来临后可以执行中断函数,上报唤醒事件.对于外部中断来说,上报power按键事件.
pm_restore_gfp_mask(); kernel/power/suspend.c
enter_state(state);
pm_suspend(suspend_state_t state);
suspend(); kernel/power/wakelock.c
android的休眠和唤醒流程的更多相关文章
- android MTK驱动背光唤醒流程
在标准的android驱动中,睡眠唤醒流程非常清晰,能够较方便的更改lcd唤醒时间和led背光的点亮时间,但是也很容易出现问题,比如说闪屏,唤醒慢! 出现闪屏有两个原因 1. 开背光时间在唤醒lcd前 ...
- Android的休眠与唤醒
Android 休眠(suspend),在一个打过android补丁的内核中,state_store()函数会走另外一条路,会进入到request_suspend_state()中,这个文件在earl ...
- android 系统的休眠与唤醒+linux 系统休眠
Android休眠与唤醒驱动流程分析 标准Linux休眠过程: powermanagement notifiers are executed with PM_SUSPEND_PREPARE tasks ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android中Linux suspend/resume流程
Android中Linux suspend/resume流程首先我们从linux kernel 的suspend说起,不管你是使用echo mem > /sys/power/state 或者使用 ...
- android设备休眠机制
如果一开始就对Android手机的硬件架构有一定的了解,设计出的应用程序通常不会成为待机电池杀手,而要设计出正确的通信机制与通信协议也并不困难.但如果不去了解而盲目设计,可就没准了. 首先Androi ...
- linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)
1. Based on linux2.6.32, only for mem(SDR) 2. 有兴趣请先参考阅读: 电源管理方案APM和ACPI比较.doc Linux系统的休眠与唤醒简介.doc 3 ...
- linux驱动程序之电源管理 之linux休眠与唤醒(2)
在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务:(2)调用注册的设备的suspend的回调函数:(3)按照注册顺序休眠核心设备和使CPU进入休眠态. 冻结进程是 ...
随机推荐
- linux之Gcc使用
本篇文章摘自 http://blog.csdn.net/ljzcom/article/details/7213101 对于Gcc自带的很多命令行,只有具体编程里面用到了或者看到别人真真用到的,用的目的 ...
- RadioStream应用源码完整版(iphone版和ipad版)
RadioStream应用源码完整版(iphone版和ipad版),这个项目是从那个ios教程网分析过了的,也是一个不错的国外音乐应用的,支持iphone版和ipad版. <ignore_js_ ...
- DB Cache Reloaded Fix缓存不能被激活解决方法
1.创建wp-content/plugins/db-cache-reloaded-fix/cache目录. 2.将cache权限改为777. 3.拷贝wp-content/plugins/db-cac ...
- PHPNow升级PHP版本的方法
在WIN上有时候需要测试一些PHP程序,又不会自行独立配置环境,那么PHPNow是非常好的选择. PHPNow自带的PHP版本为5.2.14,而最后一次更新在于2010-9-22,PHP5.2对于现在 ...
- [SQL Server]树形结构的创建
对于SQL Server来说,构建显示一个树形结构不是一件容易的事情,逻辑构造能力不是它的强项.不过也不是说它没有能力干这个事情,只要换一种思维方式就可以理解它的工作原理. 例如,现在有一张表的内容如 ...
- C# 返回json结果集,js日期格式化
asp.net mvc返回json结果集 return Json(new { total = totalCount, rows = result }, JsonRequestBehavior.Allo ...
- Oracle设置表只读-alter table xxx read only
11g以前,当需要设置一个表只读时,我们通过赋予某些用户select权限.但对于表的owner来说,还是可以读写的. 从Oracle 11g开始,我们可以通过一下命令设置表只读或可读可写: alter ...
- 使用NPIO操作Excel
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...
- 【NHibernate】应用层面需要掌握的知识汇总
休息接待区 欢迎加入NHibernate中文社区!在讨论中寻找乐趣!在问题中寻找答案! 旅途站点路线 第一站:熟悉NHibernate NHibernate之旅(1):开篇有益 第二站:接触NHibe ...
- 【BZOJ3196】Tyvj 1730 二逼平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的 ...