整体的结构
wakeup events framework首要包括 wake lock, wakeup count, autosleep等机制体系在suspend进程中的时分,当wakeup事情产生的时分,不能进入suspend状况,wakeup event framework便是处理用户空间和内核空间的同步问题的,包括下面状况
1. 驱动处理进程中,不允许进入suspend
2. 后续需求处理的用户进程,不会获取到wakeup events
3. 正在后续处理的用户进程,处理进程中,体系不能进入suspend
整体结构如下:
wakeup events framework core便是linux关于wakeup event的中心结构,首要向驱动供给唤醒源注册,使能等接口。向上层供给上报,中止等接口,还有关于PM core的状况查询接口
sysfs文件
wake lock/unlock 供给给用户层面,能够阻挠体系进入suspend的一个接口
wakeup count,用户上层用户查询wakeup event的一个接口
auto sleep便是设定体系没活动时,主动休眠的接口
关于wakeup source和wakeup event
1. 只要具有唤醒功用的设备才干作为wakeup source,具有唤醒功用的设备会被标识为唤醒才能,经过设备结构里边的can_wakeup标志标识,而且会在sysfs目录下有关于wakeup信息的文件存在
2. 具有唤醒功用的设备首要和 dev_pm_info结构有关
3. 一个wakeup source的设备,首要虚拟为结构体struct wakeup_source结构
View Code
关于wakeup event framework中心功用
1. __pm_stay_awake : wakeup source 切换为active状况的接口
2. __pm_relax: wakeup source 切换为disacTIve状况的接口
3. __pm_wakeup_event: 上边两个接口的结合体,引入了时刻操控
关于驱动设备常用的接口:
View Code
wakeup count
首要用于处理system suspend 和system wakeup events之间的同步问题
wakeup count给上层供给了sysfs接口,给auto sleep供给了接口
完成的原理
1. 产生电源切换的实体先读取体系的wakeup count变量,而且奉告wakeup events framework。
2. framework core保存这个变量到saved_count中
3. suspend进程中,有可能会产生wakeup events,所以某些时刻点,会调用接口(pm_wakeup_pending),查看是否有wakeup需求处理
4. 如果有,代表读出来wakeup count 和saved_count不一样,这时需求停止suspend的进程
当调用相似 read(&cnt, “/sys/power/wakeup_count”); 的时分,体系终究会调用pm_get_wakeup_count
调用 write(cnt, “/sys/power/wakeup_count”)的时分,体系终究会调用 pm_save_wakeup_count
pm_get_wakeup_count的首要完成:
View Code
pm_save_wakeup_count的首要完成
View Code
前面的suspend进程中,最终阶段会调用suspend_enter函数:
View Code
里边调用的pm_wakeup_pending,首要是:
View Code
以上便是wakeup在用户层和suspend进程中的运用方法
wake_lock/wake_unlock
sysfs下的 /sys/power/wake_lock & /sys/power/wake_unlock
整体的结构
代码剖析
wakeup_lock/wakeup_unlock的接口首要是下面的四个函数
View Code
其 中pm_show_wakelocks 表明
View Code
关于 pm_wake_lock 表明
View Code
关于pm_wake_unlock表明
View Code
wakelock的废物收回机制
首要考虑到wakeup events 树立,毁掉,树立的进程太频频,功率就会下降,所以引入了wakeuplock的废物收回机制
首要的原理是:
先保存一些非acTIve状况的wakelocks,等保存的wakelock的数量抵达某一个界说的最大值时,则从尾部开端,顺次取出wakelock,判别idle的时刻,进行刊出和开释memory资源
Auto Sleep
概念:
当体系没有了正在处理和新增的wakeup events时,就测验suspend
整体的结构为:
1. sysfs关于autosleep的接口 /sys/power/autosleep
这个sysfs文件的读取 函数 autosleep_show:
View Code
2. 关于autosleep的初始化
关于 pm_autosleep_init
View Code
3. 设置 autosleep的状况
View Code
与之有关的函数pm_wakep_autosleep_enabled
View Code