博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android linux的休眠和唤醒
阅读量:4213 次
发布时间:2019-05-26

本文共 2335 字,大约阅读时间需要 7 分钟。

总结:

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_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

 

转载地址:http://gedmi.baihongyu.com/

你可能感兴趣的文章
C/C++ 位运算
查看>>
HDOJ 2045 LELE的RPG难题 递推
查看>>
HOOJ 2047 阿牛的EOF牛肉串 (递推)
查看>>
windows 下远程访问 远程主机ubuntuMysql数据库 遇到的问题
查看>>
STL使用
查看>>
python 用matplotlib 画图
查看>>
常用分类算法在不同样本下的选择
查看>>
python 使用 libsvm
查看>>
android 获取百度地图SDK遇见的问题(只显示网格,也就是调用失败)
查看>>
matplotlib 学习
查看>>
Linux Ubuntu 下改变 Mysql max_connections
查看>>
Android Studio 常用快捷键
查看>>
Android 导入项目遇到的问题
查看>>
Git 学习笔记
查看>>
[CSP]2017-12-3 Crontab
查看>>
Poj 3279 FlipTile
查看>>
Poj 3126 筛法 + bfs (spfa)
查看>>
POJ 3414 Pots 记录路径的搜索
查看>>
FZU 1250 BFS(两起点)
查看>>
UVA 11624 BFS + 技巧
查看>>