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的休眠和唤醒流程的更多相关文章

  1. android MTK驱动背光唤醒流程

    在标准的android驱动中,睡眠唤醒流程非常清晰,能够较方便的更改lcd唤醒时间和led背光的点亮时间,但是也很容易出现问题,比如说闪屏,唤醒慢! 出现闪屏有两个原因 1. 开背光时间在唤醒lcd前 ...

  2. Android的休眠与唤醒

    Android 休眠(suspend),在一个打过android补丁的内核中,state_store()函数会走另外一条路,会进入到request_suspend_state()中,这个文件在earl ...

  3. android 系统的休眠与唤醒+linux 系统休眠

    Android休眠与唤醒驱动流程分析 标准Linux休眠过程: powermanagement notifiers are executed with PM_SUSPEND_PREPARE tasks ...

  4. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  5. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  6. Android中Linux suspend/resume流程

    Android中Linux suspend/resume流程首先我们从linux kernel 的suspend说起,不管你是使用echo mem > /sys/power/state 或者使用 ...

  7. android设备休眠机制

    如果一开始就对Android手机的硬件架构有一定的了解,设计出的应用程序通常不会成为待机电池杀手,而要设计出正确的通信机制与通信协议也并不困难.但如果不去了解而盲目设计,可就没准了. 首先Androi ...

  8. linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)

    1. Based on linux2.6.32,  only for mem(SDR) 2. 有兴趣请先参考阅读: 电源管理方案APM和ACPI比较.doc Linux系统的休眠与唤醒简介.doc 3 ...

  9. linux驱动程序之电源管理 之linux休眠与唤醒(2)

    在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务:(2)调用注册的设备的suspend的回调函数:(3)按照注册顺序休眠核心设备和使CPU进入休眠态.       冻结进程是 ...

随机推荐

  1. 在PHP中如何使用消息列队

    /** * 消息列队服务 * @author zhou.tingze * @example * -----------------------------------Create----------- ...

  2. [Linux] Linux学习笔记(5)-文件与目录管理

    1.Linux目录结构为树状结构,最顶层的目录为跟目录"/",其它目录通过挂载可以将它添加到目录树中,通过解除挂载移除它们. 2.绝对路径与相对路径 绝对路径写法:由根目录&quo ...

  3. 【WPF】Application应用程序启动

    wpf应用程序在启动的时候会自动创建Main函数并调用Application实例的run(),从而启动Application进程.Main函数在一个App.g.cs文件中,App.g.cs文件的位置在 ...

  4. Python+PyQt 数据库基本操作

    Sqlite: 使用Python的sqlite3: 需要注意下commit方式与qt稍有不同 import sqlite3 class DBManager(): def __init__(self): ...

  5. [Learn Android Studio 汉化教程]第三章:使用 Android Studio 编程

    [Learn Android Studio 汉化教程]第三章:使用 Android Studio 编程 本章包含如何在 Android Studio 中书写或生成代码. Android Studio ...

  6. Google code: Why ‘Everything up-to-date’ when pushing (git)

    原文链接:http://blog.rexzhao.com/2011/11/28/google-code-git-everything-up-to-date-when-push.html 第一次在Goo ...

  7. class_create(),device_create自动创建设备文件结点

    class_create(),device_create自动创建设备文件结点 从linux 内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.相比devfs,udev有很多优 ...

  8. OData 集成

    OData 集成 文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响 ...

  9. 分布式日志收集系统--Chukwa

    1. 安装部署 1.1 环境要求 1.使用的JDK的版本必须是1.6或者更高版本,本实例中使用的是JDK1.6 2.使用的hadoop的版本必须是Hadoop0.20.205.1及以上版本,本实例中使 ...

  10. (转)Linux SLUB 分配器详解

    原文网址:https://www.ibm.com/developerworks/cn/linux/l-cn-slub/ 多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器.但是, ...