分享

Android linux的休眠和唤醒

 barry525 2015-03-04

写了很多内容,突然发布文章的时候保存失败。郁闷

 

凭借记忆只重写如下总结:

1. Early suspend/ late resume 是android 添加的机制,用户关闭LCD, TS, Sensors等为了省电。可称之为浅度休眠

2. Linux的Suspend/resume 仍然有效,可称之为深度休眠

3. echo mem > sys/power/state 会触发early suspend,

    echo on > sys/power/state 会触发late resume,

    cat sys/power/state 会显示当前支持的休眠状态,有mem, on, standby选项,但针对android 则只有mem, 同时无条件支持on

4. LCD, TS, Sensors等设备会注册early suspend 和late resume 回调函数,用于early suspend/late resume时逐个执行。

5. User space 通过操作 sys/power/wake_lock, sys/power/wake_unlock 可以向kernel申请一个wake lock;

    cat sys/power/wake_lock 或wake_unlock 只是显示User Space 申请的wake lock, kernel 申请的wake lock显示不出来

6. cat proc/wakelocks 可以显示所有的wake lock的信息

7. Early suspend/Late resume中有一个关键wake lock是main_wake_lock, 执行early suspend后会unlock main_wake_lock;执行late resume之前会lock main_wake_lock.

8. 当任何一个wake lock被unlock时,会检测是否有其他wake lock处于locked状态?如果没有则系统进入 linux 常规suspend

9. 一般而言android系统是否休眠,是由user space发起的,而kernel space 是不能主动进入休眠的;当android系统需要进入休眠时,user space 执行echo mem > sys/power/state;强迫kernel 进入early suspend状态,如果还没有任何wake lock被locked,则进入linux 常规suspend.

10.  如果android系统没有进入深度休眠,则user space发起echo on> sys/power/state, 则系统马上执行late resume, 唤醒LCD,TS,sensor等;如果已经进入深度休眠,则另外处理

11. kernel会依次同步文件系统,执行各设备注册的suspend, 执行system core 的suspend disble bus和irq等,然后进入深度休眠后会在suspend_enter@kernel/kernel/power/suspend.c中的  suspend_ops->enter(state) 系统挂起,直到有硬件的操作唤醒;一旦被唤醒则依次执行system core resume, device resume等,最后还会执行late resume.

12. User space 向kernel申请wake lock时, 写入sys/power/wake_lock 的buf格式为<wakelock名称> [延时的纳秒数];但是User space 没有这么使用,android在java层自己实现了 计数wake lock和记次wake lock.

13. Early suspend/late resume 针对LCD,TS等设备来说,所起的作用与suspend/resume是一样的。一般而言 两者不会同时使用 , Early suspend/late resume只是在Linux kernel 系统不能深度休眠时,还能执行从而关掉某些设备,达到省电的目的。

 

主要源代码路径

[Kernel]
1. @kernel/drivers/base/power/main.c
2. @kernel/kernel/power/suspend.c
3. @kernel/kernel/power/main.c
4. @kernel/kernel/power/earlysuspend.c
5. @kernel/kernel/power/wakelock.c
6. @kernel/drivers/base/syscore.c
7. @kernel/kernel/power/userwakelock.c
[User space]
1. @frameworks/base/services/java/com/android/server/powermanagerservice.java
2. @frameworks/base/services/jni/com_android_server_powermanagerservice.cpp
3. @system/core/libsuspend/autosuspend.c
4. @system/core/libsuspend/autosuspend_earlysuspend.c
5. @frameworks/base/services/java/com/android/server/systemserver.java
6. @hardware/libhardware_legacy/power/power.c
7. @frameworks/base/core/java/android/os/powermanager.java

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多