学习
实践
活动
工具
TVP
写文章

Linux电源管理-wakelock

前言之前说过Google为了在user space阻止系统suspend,为Android设计出一套新的电源管理: wakelocks, early_suspend等。 此机制修改了Linux原生的susupend流程,定义子自己的休眠接口。起初Android为了合入此patch和Linux内核开发者有一段时间的讨论。 比如此地址:http:lwn.netArticles318611但是在Linux合入wakeup event framework,提出了wakeup source概念,同时解决suspend和wakeup Android也随之抛弃了自己的wakelocks机制,重新利用Linuxwakeup source,设计了全新的wakelock。 解析传入进来的字符串,如果传入的字符串为123 1000,则123就是wakelock存入到buf,1000为定时器超时时间存入到timeout_ms。3.

1.6K31

Linux电源管理-Autosleep

autosleep一种强大的电源管理方法,只要在系统没有什么事情可做的时候,整个系统就睡眠下去。此机制在android手机上非常有效,同时也能阻止不良应用程序一直保持系统唤醒,浪费电池。 autosleep功能需要在kernel config开启CONFIG_PM_AUTOSLEEP=y。 4. 对系统的所有wakeup source,修改autosleep_enable标志。 2. 而autosleep_wq是在函数pm_autosleep_init函数创建的。 D: 如果有唤醒事件,系统就会从睡眠唤醒。

1K20
  • 广告
    关闭

    2022腾讯全球数字生态大会

    11月30-12月1日,邀您一起“数实创新,产业共进”!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux电源管理-概述

    如何能做到手机待机时间长久,而且用户还能玩的尽兴,这时候就必须对设备进行省电管理。那用什么省电方式呢? 比如在手机听音乐的时候关闭屏幕,在看电影的时候调节屏幕亮度等都可以用来省电。 这些方法在linux操作系统已经做了统一的实现: suspend/resume机制。本节就简单认识下linux下的电源管理电源状态 On (on) S0-Working Standby (standby) S1- CPU and S1状态简称standby状态,此状态下CPU处于低功耗状态,并且没有数据保存到RAM或者disk,此状态待机和恢复通常很快。 如果你用的是linux,就可以直接通过命令行操作,以我的系统Ubuntu为例子: 1.

    1.3K11

    Linux电源管理-Runtime PM

    Runtime PM (Runtime Power Management)翻译过来就是运行时电源管理。主要的作用是: 每个设备处理好自己的电源管理,在不需要工作时进入低功耗状态。 /power/control接口在运行时对该设备进行电源管理。 .no_callbacks: 表明该设备不是有Runtime PM callbacks。 设备的runtime属性是在dpm_sysfs_add函数增加的。 Runtime PM举例 写了一个简单的测试runtime测试例子,如下: #include <linux/module.h> #include <linux/kernel.h> #include <linux /fs.h> #include <linux/cdev.h> #include <linux/platform_device.h> #include <linux/types.h> #include <

    1.7K31

    Linux电源管理-SuspendResume流程

    前言 根据上一节linux电源管理-概述可知,linux电源管理存在的几种方式,如何查看这几种方式,以及最后的如何睡眠唤醒等。 通常情况下就会调用到driver的prepare函数。 dpm_suspend函数分析 当对系统的所有设备调用prepare回调函数之后,就会调用所有设备的suspend回调函数。 在调用到device_suspend函数,会判断是否支持异步suspend操作,这里不关心细节,主要分析主流程,最后调用到__device_suspend函数。 此函数主要调用dpm_suspend_list的设备的suspend_late回调函数,然后又将这些设备加入到dpm_late_early_list链表。 链表

    1.9K31

    Linux电源管理-wakeup count

    在进行suspend之前,需要先获取系统总的wakeup event数量。 2. 将获得的值保存到全局变量saved_count。 3. 此后可能系统已经进入了suspend的流程。 在suspend执行的过程,会调用pm_wakeup_pending接口检测系统有没有发生wakeup event。 那Linux内核到底是如何记录这两个变量呢? linux中使用一个原子变量,高16位记录系统所有的wakeup event总数,低16位记录是否有wakeup events在处理。 那接着再用linux的实现方法回答上述的问题: wakeup event framework是如何保存当前系统中所有的wakeup event? 获得到当前的"wakeup event"总数后,就需要将此值存到全局变量saved_count

    83721

    Linux 电源管理子系统

    Linux 电源管理非常复杂,牵扯到系统级的待机、频率电压变换、系统空闲时的处理以及每个设备驱动对系统待机的支持和每个设备的运行时(Runtime)电源管理,可以说它和系统的每个设备驱动都息息相关。 对于消费电子产品来说,电源管理相当重要。因此,这部分工作往往在开发周期中占据相当大的比重,下图呈现了 Linux 内核电源管理的整体架构。 6、Regulator 驱动 Regulator是Linux系统电源管理的基础设施之一,用于稳压电源管理,是各种驱动子系统设置电压的标准接口。 11、运行时的 PM dev_pm_ops 结构体,有3个以 runtime 开头的成员函数:runtime_suspend()、runtime_resume()和runtime_idle(),它们辅助设备完成运行时的电源管理 另外,在实际工程,尤其是在消费电子的领域,可能有超过半数的bug都属于电源管理。这个时候,电源管理的很多工作就是在搞定鲁棒性和健壮性,可以说,在很多时候,这就是个体力活,需要工程师有足够的耐性。

    37120

    Linux 电源管理子系统

    Linux 电源管理非常复杂,牵扯到系统级的待机、频率电压变换、系统空闲时的处理以及每个设备驱动对系统待机的支持和每个设备的运行时(Runtime)电源管理,可以说它和系统的每个设备驱动都息息相关。 对于消费电子产品来说,电源管理相当重要。因此,这部分工作往往在开发周期中占据相当大的比重,下图呈现了 Linux 内核电源管理的整体架构。 6、Regulator 驱动 Regulator是Linux系统电源管理的基础设施之一,用于稳压电源管理,是各种驱动子系统设置电压的标准接口。 11、运行时的 PM dev_pm_ops 结构体,有3个以 runtime 开头的成员函数:runtime_suspend()、runtime_resume()和runtime_idle(),它们辅助设备完成运行时的电源管理 另外,在实际工程,尤其是在消费电子的领域,可能有超过半数的bug都属于电源管理。这个时候,电源管理的很多工作就是在搞定鲁棒性和健壮性,可以说,在很多时候,这就是个体力活,需要工程师有足够的耐性。

    9720

    Linux电源管理-Linux regulator framework概述

    一般电源管理芯片(Power Management IC)中会包含一个甚至多个regulator。 2. regulator有什么作用? 通常的作用是给电子设备供电。 如果一个regulator控制多个设备,而每个设备的电压或电流需求方式不同,linux regulator framework会怎么管理这些设备? 3. 有些设备只需要enable/disable电源即可,而有些设备在运行的过程需要动态的改变voltage或者current,Linux regulator Framework会如何处理这些问题? .uV_offset: consumer看到的电源和实际电源之间的偏移值,用于电源补偿。 .min_uA/max_uA: 最小/最大的输出电流。 .ramp_delay: 改变电压到电源稳定后时间。因为硬件原因,改变电源后不能立刻就成功,其中需要有一定的延迟。 .enable_time: regulator的使能时间。

    1.6K52

    深入理解Linux电源管理

    6.1 系统级约束 6.2 设备级约束 七、总结回顾 一、电源管理框架 计算机运行在物理世界,物理世界的一切活动都需要消耗能量。 但是当硬件运行起来之后,软件就可以对硬件的电源状态进行管理了。电源管理的内容包括电源状态管理和省电管理电源状态管理是对整个系统的供电状态进行管理,内容包括睡眠、休眠、关机、重启等操作。 6.2 设备级约束 暂略 linux-src/drivers/base/power/qos.c 七、总结回顾 通过本文我们对计算机的电源管理有了一个基本的了解,下面我们再看图回忆一下: 电源管理分为电源状态管理和省电管理两个重要组成部分 电源状态管理是对计算机的电源状态进行管理,包括睡眠、休眠、关机、重启等。省电管理是内核的一些省电机制,可以很好的帮我们节省电力。 光一味地省电也不行,还得考虑计算机的性能,所以电源管理还有PM QoS来保证电源管理的服务质量,使得计算机的运行还要满足一定的性能需求。

    15940

    详解linux电源管理驱动编写

    对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处。所以,各个soc厂家在这方面花了很多的功夫。 下面,我们可以看看linux是如何处理电源管理驱动的。 framework is designed to provide a generic interface to voltage and current regulators within the Linux

    42854

    Linux电源管理(9)_wakelocks【转】

    同时,该补丁集更改了Linux kernel原生的电源管理执行过程(kernel/power/main.c的state_show和state_store),转而执行自定义的state_show、state_store 以阻止睡眠、注销wakelock以允许睡眠:已经由“Linux电源管理(7)_Wakeup events framework”所描述的wakeup source取代。 3.2 Kernel wakelocks在电源管理的位置 相比Android wakelocks,Kernel wakelocks的实现非常简单(简单的才是最好的),就是在PM core增加一个wakelock 注1:上面有关wakeup source的操作接口,可参考“Linux电源管理(7)_Wakeup events framework”。 wakelocks_lru_list的wakelock是按访问顺序排列的,最近访问的,靠近head位置。

    53810

    Linux电源管理之Runtime PM

    Runtime PM (Runtime Power Management)翻译过来就是运行时电源管理。主要的作用是:  每个设备处理好自己的电源管理,在不需要工作时进入低功耗状态。 改变设备的电源状态需要整个平台的支持。 当设备处于低功耗模式时,wakeup signal常常需要platform或者bus的支持。 /power/control接口在运行时对该设备进行电源管理。  unsigned int  no_callbacks:1;  //表明该设备不是有Runtime PM callbacks。   设备的runtime属性是在dpm_sysfs_add函数增加的。    <linux/kernel.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/platform_device.h> #include

    11330

    Linux电源管理-Linux Regulator Framework代码分析

    #include <linux/module.h> #include <linux/kernel.h> #include <linux/err.h> #include <linux/export.h> #include <linux/platform_device.h> #include <linux/regulator/driver.h> #include <linux/regulator/machine.h regulator的作用就是管理consumer设备,给consumer设备提供voltage, current。 所以必须实现一个consumer设备,代码如下: #include <linux/module.h> #include <linux/kernel.h> #include <linux/err.h> # include <linux/export.h> #include <linux/platform_device.h> #include <linux/regulator/consumer.h> static

    1.4K31

    Linux电源管理-wakeup events framework

    Linux系统电源管理一般是冷睡眠,而Android系统却将linux系统的睡眠作为通常待机使用,显然Linux电源管理不符合Android系统。 Android说既然不符合,我就给你改到符合,早期Android就提出了"wakelocks"机制,这种机制将Linux原生的睡眠唤醒流程改变,增加Android自己的处理函数,在一段时间这种机制可以解决 所以Linux在2.6.36引入了wakeup events framework机制,用来解决suspend和wakeup events之间的同步问题。 .entry: 用来将唤醒源挂到链表上,用于管理。 .lock: 同步机制,用于访问链表时使用。 .timer: 定时器,用于设置该唤醒源的超时时间。 在linux系统,只有具有唤醒系统的设备才叫做“wakeup source”。 既然只有设备才能唤醒系统,那设备结构体struce device中就应该有某种标志代表此设备是否具有唤醒的能力。

    1K32

    Linux电源管理-Operating Performance Points(OPP)

    在一个执行各种用例的操作系统,不是Soc的所有模块都一直以其最高的执行频率工作。为了实现这一目的,Soc的子模块被分组成域,允许一些域以较低的频率和电压运行,而其他的域运行在较高的电压和频率上。 Operating Performance Points Library OPP library提供了一系列辅助函数去管理和查询设备的OPP信息。 OPP library的源代码路径在drivers/base/power/opp.c,头文件路径在include/linux/pm_opp.h。 数据结构 Linux系统使用struct dev_pm_opp结构表示一个opp描述结构 struct dev_pm_opp { struct list_head node; bool available Linux系统使用struct device_opp结构表示opp设备。

    97920

    Linux电源管理(7)_Wakeup events framework

    前言 本文继续“Linux电源管理(6)_Generic PM之Suspend功能”中有关suspend同步以及PM wakeup的话题。 这个话题,是近几年Linux kernel最具争议的话题之一,在国外Linux开发论坛,经常可以看到围绕该话题的辩论。辩论的时间跨度和空间跨度可以持续很长,且无法达成一致。 但事实上,该同步问题牵涉到了另外一个比较有争议的话题:日常的电源管理机制。是否要基于suspend实现?系统何时进入低功耗状态,应该由谁决定?kernel还是用户空间程序? 而在运行时的电源管理过程,系统何时进入低功耗状态,也不是用户空间程序能决定的(auto sleep中枪了)。 这表现在suspend过程中频繁调用pm_wakeup_pending接口上(可参考“Linux电源管理(6)_Generic PM之Suspend功能”)。

    78420

    1.Linux电源管理-休眠与唤醒

    /module.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/interrupt.h> #include <linux /irq.h> #include <linux/sched.h> #include <linux/pm.h> #include <linux/slab.h> #include <linux/sysctl.h > #include <linux/proc_fs.h> #include <linux/delay.h> #include <linux/platform_device.h> #include <linux /input.h> #include <linux/gpio_keys.h> #include <linux/workqueue.h> #include <linux/gpio.h> #include <linux/of_platform.h> #include <linux/of_gpio.h> #include <linux/spinlock.h> #include <soc/gpio.h>

    3.7K20

    扫码关注腾讯云开发者

    领取腾讯云代金券