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进入休眠态. 冻结进程是 ...
随机推荐
- AspectJ的简单使用
aspectj是一款优秀的面向切面的编程框架,下面就简单介绍一下入门教程吧: 1.官网下载AspectJ的jar包,我这里下的是最新版本1.8.7的. 2.因为AspectJ.jar 是一个可执行的j ...
- mysql主从集群定时备份脚本
#!/bin/bash dpath="/mysql_backup" mydays="7" username="root" mysql_p ...
- GDB 进行调试 使用心得
GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的. 需要像以下这样使用: #gdb app ...
- stl::find,find_if,find_if_not
//满足特定条件下的实现,回调函数template<class InputIt, class UnaryPredicate> InputIt find_if(InputIt first, ...
- laravel方法汇总详解
1.whereRaw() 用原生的SQL语句来查询,whereRaw('select * from user') 就和 User::all()方法是一样的效果 2.whereBetween() 查询时 ...
- window下安装composer和laravel
安装composer: 1.在https://getcomposer.org/download/ 中下载 Composer-Setup.exe 2.安装composer步骤如下: 至此,compose ...
- 将Ecshop后台fckeditor升级更改为kindeditor 4.1.10编辑器
ecshop在win8部分电脑上,不管用任何浏览器,都打不开,即使升级到最新版本都不行,问题应该吃在fckeditor兼容上.fckeditor 很久未升级,换掉该编辑器是最佳方法 第一步:下载kin ...
- XE5 ANDROID平台 调用 webservice
服务端需要midas.dll XE5对android的平台支持很有吸引力,虽然目前用来直接开发应用到安卓市场卖赚钱可能性估计不大(安卓市场目前国内好像都是免费的天下),但是对于企业应用很是很有帮助 ...
- Oracle的AUTOTRACE功能
ORACLE9i在使用autotrace之前,需要作一些初始设置: 1.用sys用户运行脚本utlxplan.sql创建PLAN_TABLE表 脚本目录:(UNIX:$ORACLE_HOME/rdbm ...
- oracle行转列、列转行
一.行转列 需要将如下格式 转换为: 这就是最常见的行转列,主要原理是利用decode函数.聚集函数(sum),结合group by分组实现的 create table test( id varcha ...