Linux的电源管理架构
Linux下PowerManagement开发总结
Linux下PowerManagement开发总结本⽂作为⼀个提纲挈领的介绍性⽂档,后⾯会以此展开,逐渐丰富。
1. 前⾔在《》中介绍了PM开发的⼀般流程,重点是好的模型、简单有效的接⼝参数、可量化的测试环境以及可独性强的输出。
内核中功耗开发⽆论是新模型开发还是已有模型的调优,都需要了解现有的框架,遵循已有框架,简单有效的修改。
这就需要了解《》,关于Linux省电,从开机-->运⾏-->suspend-->关机这四种状态,开机/关机不太受关注,但是⾜够快也是省电的⼀种。
在进⼊细节之前,了解⼀下Linux中PM框架()有助于下⾯学习。
suspend()是⼀种深层次的省电,运⾏态情况下省电就⼋仙过海各显神通了。
如果将电流曲线以timeline形式画出,功耗就是曲线覆盖的阴影⾯积了。
⼀个任务来看,⾯积越⼩越好,当然时间也要满⾜需求。
suspend是系统级省电,涉及到各外设、Memory、CPU等等各种设备,总之是尽量关闭。
只保留不能断电部分⽤于唤醒系统,以及系统恢复,⽐如外设唤醒中断、RAM Retention等。
suspend本⾝也有不同种类,mem/standby/hibernation。
⼤部分使⽤的还是mem,即suspend to ram。
此时内核处于冻结状态(),系统tick停⽌,只有中断将其从睡眠唤醒才会去处理任务。
在系统运⾏过程中省电,则要复杂多变多了。
对于CPU在⼯作是根据负载动态调频调压(),没有⼯作处理的时候进⼊IDLE(),更进⼀步在多核情况下CPU都可以被热插拔();对于各种其他外设可以根据是否被使⽤⽽动态关闭()。
当然这些调节都要保证性能的输出()。
在系统运⾏过程中,⾼温可能导致设别损坏,因此根据温度来分配功耗也是⼀门必要⼿段()。
当然省电也离不开⼀些基础功能⽐如时钟控制()、供电开关()、电源域划分(),以及内核和应⽤都会⽤到的睡眠锁、唤醒源、唤醒事件都可以归到唤醒事件框架中()。
Linux内核背光backlight驱动架构文档
if (bd->ops && bd->ops->update_status) bd->ops->update_status(bd);//开发人员写的调节 pwm 的函数
ddeevviicceess{{}} .parent .platform_data
ffbb__nnoottiiffiieerr__lliisstt
bbaacckklliigghhtt__ooppss{{}} .options .*update_status() .*get_brightness() .*check_fb
1
数据结构:lliisstt backlight_class
bbaacckklliigghhtt__ooppss{{}} .options .*update_status() .*get_brightness() .*check_fb
ddeevviiccee{{}} .class .*p
backlight_store_brightness), __ATTR(actual_brightness, 0444, backlight_show_actual_brightness, NULL), __ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL), __ATTR_NULL,
input子系统初始化驱动架构背光控制原理电源管理芯片是一个led驱动器相当于一个led开关
Backlight 子系统初始化驱动架构
本文要点: 1. input 子系统重要数据结构及关系图 2. input 子系统初始化驱动架构
基于嵌入式Linux系统的电源管理软件
中 分 号: P1 图 类 T3 1
基 于蕨 式 L n x系统 的 电 管 理 软 件 入 iu 源
邢 向磊 ,周 余 ,都思丹
( 南京大 学电子科 学与工程系 ,南京 2 0 9 ) 10 3
摘
要: 针对嵌入 式系统 的低功耗 要求 , 出高效 的电源管理方案 。 高级 电源管理技术 的基础上 , 提 在 增加启动加载程序对 电源管理 的支持 ,
1 概 述
嵌入式系统大多是功耗敏感 的, 尤其是便携 式手持设备 , 随着计算性能的提高和服务功能的多样 化 ,低功耗设计成为 设计的主要 目标 之一 。 目前嵌 入式系统广泛采 用高级 电源 管
理 ( d acd P w rMaa e n, M) 术 。嵌 入 式 系 统 的 A v ne o e ng metAP 技
ma a e n f r sse id s n da di l ne ae nAd a cdP w r ng me t P tcn lg t d igteb olae’ n gme to wae ytm ei e n st s g mpe tdb sdo v ne o e ae n( M)eh oo ywi adn o t d r me Ma A h h o S
第3 6卷 第 1期
VL o 36
・
计
算
机
工
程
21 0 0年 1月
J nua y 01 a r 2 0
NoI 。
Co mput rEn ne rng e gi e i
开发研究与设计技术 ・
文 编 1 0 3 8 0 )— 2 - 3 文 标识 : 章 号: 0 _ 4 ( 1 0 5 _ 0 _ 22 o1 3 0 献 码 A
linux-acpi
试试 kernel 参数”acpi=off”,如果此参数没有带来任何改变,那么这不是一个 ACPI bug。 反之,则这很可能是一个 ACPI bug。 确定了是一个 ACPI bug 后,我们还有其他一些参数来 更进一步的区分到底是 ACPI 哪个部分的 bug。
acpi=ht
这个参数和"acpi=off"几乎一样,它禁止了除多处理器配置相关的内容以外的所有 ACPI 功 能。如果 acpi=off 正常,但 acpi=ht 不正常, 则解析 ACPI 表或者 Linux SMP 的代码有 bug.
pci=noacpi
禁止使用 ACPI 来处理任何 PCI 相关的内容,包括 PCI root bus 的枚举和 PCI 设备中断路由。
acpi=noirq
禁止使用 ACPI 来处理 PCI 设备中断路由,和 pci=noacpi 的区别是它允许使用 ACPI 来枚举 PCI root bus.
pnpacpi=off
• AML 代码,一种类 C 的代码。由 BIOS 提供,OS 的 AML 解释器(在 Linux 中叫 ACPI CA) 解释执行这些代码。这是 ACPI 抽象层的关键,下面会详细介绍。
• 配置信息,ACPI 包含的配置信息很多,比如多处理器配置信息(MADT)、NUMA 配置信 息(SRAT、SLIT)、高精度定时器(HPET)等。
Method (_DIS, 0, NotSerialized) {
Or (\_SB.PCI0.LPC.PIRA, 0x80, \_SB.PCI0.LPC.PIRA) } }
比如我们想禁止 LNKA 设备,ACPI 规范定义了 OS 必须执行此设备的_DIS 函数。从硬件的角度 来讲,禁止 LNKA 设备需要将某个 PCI 设备的配置空间的寄存器 0×60 的最高位置上。OS 不 需要知道硬件的细节,它解释执行_DIS 函数即可。上面的代码就是 AML 代码,由 BIOS 提供, 语句‘Or (\_SB.PCI0.LPC.PIRA, 0×80, \_SB.PCI0.LPC.PIRA)’实际上就是给寄存器 \_SB.PCI0.LPC.PIRA 置上最高位, 而 PIRA 就是 PCI 设备 LPC 的配置空间的寄存器 0×60。 从此段代码我们可以明显的看出 BIOS 以 AML 代码的形式隐藏(抽象)了硬件的细节,从而使 得 OS 看到的是一个平台无关的硬件。
WOLF-Linux系统上的脉冲式动态电源管理
Li x , nu
0 引 言
随 着 Ln x系 统 在 各 种 移 动 和 嵌 入 式 设 备上 的 应 用 不 断 iu 扩 展 , i x的 电 源 管 理 能 力 越 来 越 受 到 众 多 Lnx开 发 者 的 Ln u iu 重 视 。移 植 和 改进 原 有 的 P C平 台 上 基 于 bo 的 电源 管 理 方 is
L n —h n , L U L —o g L U axn MAO o gk n I gc e g Qi I i n , I J —i, d i Y n —a g
( eat et f o p t c ne ol e fnoma o cec,Nak i ie i ,Taj 00 hn) D pr n o m ue S i c,C l g fr t nS i e m C r e e oI i n n aUn r t i i 30 7 ,C ia v sy nn 1
李庆 诚 , 刘立冬 , 刘嘉欣 , 毛永康
( 南开 大学 信 息科 学学 院计 算机 系, 天津 307) 00 1
摘 要 : 态电源管J dnmi p w r aa e n, P 是一 种动 态重构 系统资源 以提 供适 当系统处 理能 力和优 化 的 系统功 动  ̄(y a c o e m ngmetD M)
linux内核电源管理
2.set_freeable函数
设置current的flags=PF_FREEZE
task_unlock(current);
} else {
task_unlock(current);
return;
}
save = current->state;
pr_debug("%s entered refrigerator\n", current->comm);
pr_debug("%s left refrigerator\n", current->comm);
/* 恢复frozen以前的状态 */
__set_current_state(save);
}
/* prevent accounting of that task to load */
current->flags |= PF_FREEZING;
for (;;) {
set_current_state(TASK_UNINTERRUPTIBLE);//开始切换本线程
if (!frozen(current))//frozen判断当前进程是否已经frozen,如果是返回1
*/
static inline int freezing(struct task_struct *p)
{
return test_tsk_thread_flag(p, TIF_FREEZE);
Linux电源管理详解
s a d y tn b :
要实 现 电源 管理 ,最 重要 的有 两 点:第 一 是 需要 设备本 身支 持 节 电功
能 , 比如硬 盘 ,可 以通 过指 令 暂 时关 闭 :第二 是 需要 操 作系 统支 持 电源 管 理 ,这 样就 可 以在 空 闲一段 时 间之 后 调用 驱动 的 电源 管理 功 能关 闭 设备 。
1摄 述 虽 然L nx 以在任 何 一 台36 iu 可 8 以上 的P 上 运行 , 目前 大多 数人 使用 的 c 都 是 新型 的 ,带有 各 种外 设 的桌 面P 或 者笔 记本 电脑 ,这样 ,电源 管 理功 c 能 (M P )就 逐渐 变 得越 来越 重 要 。在 笔记 本 电脑 上 电源 管理 可 以节 能 ,延 长 电池 寿命 ,而在 桌面 P上 它 可 以降低 辐 射 ,降 温 ,延 长外 设使 用 寿命 。 c 现 在的 操作 系统 大都 内置 了电源 管理 支持 。 2P 机实现 电源管理 的 方法 C
毫 子
鳃 VALLEJ 科 学 L
Ln x i u 电源 管 理 详 解
田冰 超
( 河北省廊坊市武警学 院 河北 廊坊 050 ) 6 0 0
中图分类号 :T 3 文献标识 码:A 文章编号 :1 7 - 7 9 2 1 )0 2 0 5 1 P 6 1 5 7( 0 O 1 0 1 —0
p _c es ( 样 会保 证设 备 已被唤 醒并 且 处于r ay 态 );⑨ 用户 自己 ma c s 这 e d状 的 p_ a lak 数 在 系 统 进 入 s se d 态 ( C I D 3 , 或 者 从 mc lb e 函 up n状 AP 卜D ) sse d up n 状态 恢复 ( C ID ) 的时候 会被 调用 ;④ 当设 备不 在被 使用 的时 AP O
linux ACPI
ACPI in Linux ── 传闻与事实Len BrownIntel Open Source Technology Centerlen.brown@Translated by Albcamus <albcamus@>概要:主流的Linux发型版从几年前就开始提供ACPI支持了,但直到今天,Linux社区中还存在着很多对ACPI的误解。
本文给出并澄清了关于ACPI in Linux的几个最主要的传闻。
1, 传闻: 在我的笔记本、PC机、服务器上,打开ACPI支持没有什么好处当用户不再以传统模式引导,而以ACPI模式引导,他们注意到的第一件事就是,电源按钮也被软件控制了。
在传统模式下,当按下电源按钮从而切断电源时,对计算机来说这是个物理的状态改变(断电);而在ACPI模式下,按下电源按钮会给OS发送中断,从而使OS能安全关机。
实际上,电源、休眠,和笔记本上盖合拢, 这些事件都被ACPI标准化了, OS可以把它们映射到自己的处理例程上。
除了把电源按钮的按下事件标准化之外, OS怎样用软件方式切断电源, 也被ACPI标准化了。
所以,由软件引发的关机,在Linux系统关闭之后,还可以切断电源;而在传统模式下,必须在Linux关闭后手工按电源按钮断电。
当在ACPI模式运行时, 用户会注意到电池的寿命延长了。
在今天的笔记本上,要想延长电池寿命, 一个重要的手段就是电源管理。
当处理器空闲,Linux内核的IDLE循环例程,将利用ACPI的 「CPU空闲的电源状态(CPU idle power states)」(C-states)来省电。
当处理器部分空闲,Linux的cpufreq子系统,将利用ACPI的「CPU的性能状态(performance states)」(P-states),降低CPU的电压和频率,以达到省电目的。
ACPI和传统模式的其他区别,可能受到用户所在的平台(译按,platform,可能专指BIOS实现)和GUI界面的影响,这些区别包括:电池低容量警报,发热控制(thermal control),以及调用suspend-to-dis k或suspend-to-R A M的能力等等。
arm,linux,电源管理解决方案
arm,linux,电源管理解决方案篇一:ARM+Linux开发平台搭建详细步骤1、安装VMWare虚拟机(创建一台虚拟的电脑)并设置(1)用默认的步骤安装,并输入注册号(2)打开VMWare,点击文件-新建虚拟机接下去几步选择默认不停的点击“下一步”直到最后点击“完成”就行了2、在VMWare上定制安装Linux系统在虚拟机的CD中选择挂载硬盘上的Linux iso镜像文件点击开启此虚拟机,出现这个界面时,把鼠标点进虚拟机界面,选择第一项,并回车这里选择Skip这里选择忽略所有数据篇二:基于arm的智能家居系统方案基于ARM的智能家居系统设计方案1. 系统综述智能家居(Smart Home)是以住宅为平台,利用综合布线技术、网络通信技术、安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务管理系统,以提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。
衡量一个智能家居系统的成功与否,并非仅仅取决于智能化系统的多少、系统的先进性或集成度,而是取决于系统的设计和配置是否经济合理并且系统能否成功运行,系统的使用、管理和维护是否方便,系统或产品的技术是否成熟适用,换句话说,就是如何以最少的投入、最简便的实现途径来换取最大的功效,实现便捷高质量的生活。
智能家居通常包括以下子系统:访问/控制系统通过电脑、手持终端等设备了解家中状况,对设备进行控制。
门禁系统门禁系统主要包括以下功能,室外监控功能:当门口有异响自动提示,能在家中或远程看到外面情况;拍照存档功能:当家中没人且有人按动门铃,便自动拍照存储,方面房屋主人查询;可视对讲功能:有客来访,可自由通话,并能看到外面情况,并能控制门锁的打开关闭;远程开锁功能:可以通过Internet 网,在任何地方开启家里的门锁。
视频监控系统视频监控的基本功能主要有:远程监控:可以进行实时本地和远程网络监控;远程控制:可以实现远程对设备的各种控制,可以对图像质量,分辨率,图像缩放进行操作,可以对云台的移动方向进行控制;视频存储:能够将视频数据本地存储,能够在任何时候对这些数据进行回放;移动侦测:布防后能够发现移动的物体并报警。
linux驱动程序之电源管理之Run-time PM 详解(4)
linux驱动程序之电源管理之Run-time PM 详解(4)linux驱动程序之电源管理之Run-time PM 详解(4)Run-time PM.每个device或者bus都会向run-time PM core注册3个callbackstruct dev_pm_ops {...int (*runtime_suspend)(struct device *dev);int (*runtime_resume)(struct device *dev);int (*runtime_idle)(struct device *dev);...};每个device或者bus都会有2个计数器,一个是device的usage counter,一个是device的active状态的children个数。
当这个device的两个counter都减少为0的时候。
run-time PM core就会去调用runtime_idle函数,但是这里的idle函数可不是当前device的idle函数。
代码如下:if (dev->bus && dev->bus->pm&& dev->bus->pm->runtime_idle) {spin_unlock_irq(&dev->power.lock);dev->bus->pm->runtime_idle(dev);spin_lock_irq(&dev->power.lock);} else if (dev->type && dev->type->pm && dev->type->pm->runtime_idle) { spin_unlock_irq(&dev->power.lock);dev->type->pm->runtime_idle(dev);spin_lock_irq(&dev->power.lock);} else if (dev->class && dev->class->pm && dev->class->pm->runtime_idle) { spin_unlock_irq(&dev->power.lock);dev->class->pm->runtime_idle(dev);spin_lock_irq(&dev->power.lock);}按照dev->bus, dev->type, dev->class的顺序去调用。
Linux电源管理详解
Linux电源管理详解作者:田冰超来源:《硅谷》2010年第02期中图分类号:TP3文献标识码:A文章编号:1671-7597(2010)0120015-011 概述虽然Linux可以在任何一台386以上的PC上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能(PM)就逐渐变得越来越重要。
在笔记本电脑上电源管理可以节能,延长电池寿命,而在桌面PC上它可以降低辐射,降温,延长外设使用寿命。
现在的操作系统大都内置了电源管理支持。
2 PC机实现电源管理的方法要实现电源管理,最重要的有两点:第一是需要设备本身支持节电功能,比如硬盘,可以通过指令暂时关闭;第二是需要操作系统支持电源管理,这样就可以在空闲一段时间之后调用驱动的电源管理功能关闭设备。
两种电源管理标准:APM和ACPI:传统的APM(Advanced Power Management)是一种基于bios的电源管理标准,目前的最新版本是1.2,它提供了CPU和设备电源管理的功能,但是由于这种电源管理方式主要是由bios实现,所以有些缺陷,比如对bios的过度依赖,新老bios之间的不兼容性,以及无法判断电源管理命令是由用户发起的还是由bios发起的,对某些新硬件如USB和1394的不支持性为了弥补APM的缺陷,新的电源管理ACPI应运而生,这就是ACPI(AdvancedConfiguration and Power Interface),它主要是将电源管理的主要执行者由bios转换成为操作系统,这样可以提供更大的灵活性以及可扩展性。
目前的PC机主板一般同时支持APM和ACPI 两种标准。
3 Linux对电源管理的支持针对APM和ACPI两种不同的标准,Linux内核提供了两个不同的模块来实现电源管理功能,这就是apm和acpi。
需要注意,apm和acpi是互相冲突的两个模块,用户在同一时间内只能加载其中之一,如果当他们在加载的时候发现二者之一已经加载,就会自动退出。
Linux Thermal 框架
Linux Thermal 框架&电源管理基础Duzi Huang2020.7.14.北京·小米科技园前言•1970~1972年,Ken Thompson & Dennis Ritchie为了玩游戏Space Travel,完成了第一版UNIX系统,并在此基础上改进了计算机语言,诞生了C语言•1991年21岁的Linus Torvalds,在赫尔辛基大学上学的时候出于个人爱好,编写了LINUX的第一版内核•如今基本所有的人类的智能设备和服务器都在运行LINUX系统,基本所有的硬件开发和驱动都是使用C语言,并且现今互联网底层至少60%的通讯协议是使用C语言完成的•单纯&无功利心的兴趣和爱好能引导我们造福人类•牛马驴无脑奋斗,人类更需要思考•下文仅仅给热设计工程师提供简单培训,了解相关领域的基础知识,作者水平有限,难免谬误。
指穷于为薪,火传也目录•Linux Thermal 框架 •高通8350平台热管理概论•Linux电源管理•Android电源管理基础Thermal框架图•Linux thermal框架主要包括•感知层:thermal zone device•控制策略层:thermal governor•执行层:thermal cooling device•中枢:thermal Core•Thermal zone device: 获取温度设备的抽象•Thermal cooling device: 降低温度措施的抽象•Thermal governor: 温控策略,step wise, bangbang, user space, power allocator,fair share•Thermal core: 作为user space和kernel的接口,同时也是Thermal框架的中枢Thermal是Linux内核中的温度控制模块,主要用于控制在系统运行过程中芯片产生的热量,通过传感器设备实时监控设备温度,在温度发生变化时候通过一定的cooling机制促使芯片和外设工作环境温度能够稳定在安全的范围内。
linux电池充电阈值
linux电池充电阈值全文共四篇示例,供读者参考第一篇示例:Linux系统提供了一种便捷的方式来设置电池充电阈值,以帮助用户延长电池的使用寿命并保持其性能。
电池充电阈值是指在何种电量范围内开始或停止充电,通过设置合适的充电阈值,可以有效减少充电次数,延长电池寿命,提高电池的健康状态。
本文将介绍如何在Linux系统中设置电池充电阈值,以及为什么这一步骤对于延长电池寿命至关重要。
在Linux系统中,用户可以使用命令行工具或者图形界面工具来设置电池充电阈值。
最常用的命令行工具是TLP(TLP – Linux Advanced Power Management),它是一个功能强大且易于使用的电源管理工具,可以帮助用户最大限度地优化和扩展电池寿命。
通过修改TLP的配置文件,用户可以轻松地设置电池充电阈值,以达到最佳的电池管理效果。
使用TLP工具设置电池充电阈值非常简单,只需要编辑TLP的配置文件并添加相应的参数即可。
在配置文件中,用户可以设置两个关键参数:START_CHARGE_THRESH和STOP_CHARGE_THRESH。
START_CHARGE_THRESH用于设置电池达到多少电量开始充电,而STOP_CHARGE_THRESH则用于设置电池达到多少电量停止充电。
通过合理地设置这两个参数,用户可以有效地控制电池的充电行为,减少充电次数,延长电池寿命。
除了使用TLP工具外,用户还可以通过图形界面工具来设置电池充电阈值。
在GNOME桌面环境下,用户可以通过Power Management设置来调整电池充电阈值。
在Power Management设置中,用户可以找到一个名为"自定义电池充电级别"的选项,通过该选项可以设置电池的充电阈值。
用户只需要在相应的输入框中输入所需的充电阈值即可,非常方便快捷。
设置电池充电阈值的重要性不容忽视。
根据专家的建议,通常情况下,电池的最佳工作范围是20%至80%之间,因此设置电池充电阈值为20%和80%是一个比较理想的选择。
linux runtime pm 实现机制
linux runtime pm 实现机制
Linux Runtime PM(Power Management)是Linux操作系统中用于管理设备电源的机制。
它可以让设备在不需要使用时自动进入低功耗或休眠状态,从而降低设备的能耗和热
量产生。
实现机制包括以下步骤:
1. 设计电源管理框架
Linux操作系统使用一种称为电源管理框架的结构来实现对设备的电源管理。
该框架
提供了一些通用的函数和接口,可以被所有设备所使用。
2. 为设备设置电源管理方法
在设备驱动中,应该重载一些函数或者使用结构体来描述设备的电源管理方法。
例如,设备的驱动程序应该提供suspend和resume函数,在设备进入休眠状态之前保存设备的状态,在设备唤醒后恢复状态。
3. 根据设备的状态进行决策
在设备的使用过程中,操作系统会根据设备的状态进行电源管理的决策。
例如,在设
备没有使用时,系统可以将设备设置为低功耗模式。
系统提供一些工具和接口来跟踪设备
的状态,例如pm_runtime_get和pm_runtime_put函数可以增加和减少设备的使用计数器,如何使用这些接口可以根据具体的需要进行决策。
4. 设备的唤醒
设备进入低功耗或者休眠状态后,如果需要使用设备,系统将会唤醒设备。
唤醒由设
备注册的回调函数进行处理,在这个回调函数中设备可以执行如下操作:
- 恢复设备的状态
- 告知操作系统设备已经唤醒
总结:Linux Runtime PM 机制可以有效地降低设备的能耗,提高系统的效率。
在开发中需要注意设计合理的电源管理框架和针对设备的电源管理决策。
《Linux设备驱动开发详解:基于最新的Linux 4.0内核》19. Linux电源管理系统架构和驱动
以下电子书来源于宋宝华《Linux设备驱动开发详解:基于最新的Linux 4.0内核》第19章《Linux电源管理系统架构和驱动》本章导读Linux在消费电子领域的应用已经铺天盖地,而对于消费电子产品而言,省电是一个重要的议题。
本章将介绍Linux设备树(Device Tree)的起源、结构和因为设备树而引起的驱动和BSP 变更。
19.1节阐述了Linux电源管理的总体架构。
19.2~19.8节分别论述了CPUFreq、CPUIdle、CPU热插拔以及底层的基础设施Regulator、OPP以及电源管理的调试工具PowerTop。
19.9节讲解了系统Suspend to RAM的过程以及设备驱动如何提供对Suspend to RAM的支持。
19.10节讲解了设备驱动的Runtime suspend。
本章是相对《Linux设备驱动开发详解(第2版)》全新的一章内容,也是Linux设备驱动工程师必备的知识体系。
第十九章Linux电源管理系统架构和驱动1.Linux电源管理全局架构Linux电源管理非常复杂,牵扯到系统级的待机、频率电压变换、系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关。
对于消费电子产品来说,电源管理相当重要。
因此,这部分工作往往在开发周期中占据相当大的比重,图19.1呈现了Linux内核电源管理的整体架构。
大体可以归纳为如下几类:1.CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq2.CPU在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle3.多核系统下CPU的热插拔支持4.系统和设备对于延迟的特别需求而提出申请的PM QoS,它会作用于CPUIdle的具体策略5.设备驱动针对系统Suspend to RAM/Disk的一系列入口函数6.SoC进入suspend状态、SDRAM自刷新的入口7.设备的runtime(运行时)动态电源管理,根据使用情况动态开关设备8.底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用到图19.1 Linux电源管理系统架构2.CPUFreq驱动CPUFreq子系统位于drivers/cpufreq目录,负责进行运行过程中CPU频率和电压的动态调整,即DVFS(Dynamic Voltage Frequency Scaling,动态电压频率调整)。
动态电源管理DPM
动态电源管理DPM1、DPM(Dynamic power management)定义及基本原理:动态电源管理是通过动态的配置系统使其通过最少的活动部件来为到来的请求服务,以节省电能。
动态电源基本原理是有选择性地关闭空闲的系统部件或降低其性能,在需要服务时再重新打开,以减少功耗。
2、嵌入式Linux系统电源状态转换图接收中断(1)任务0、任务1、任务2是三个不同优先级的任务,此时系统运行在某个任务状态中,此时系统可以响应中断处理程序去处理中断,也可以被请求睡眠而进入睡眠状态,亦可以返回空闲状态。
不同的任务需要不同的电源状态,例如音乐播放不需要较高的处理器速率,此时可以将处理器的频率调低,而视频播放需要复杂的处理运算,一般情况下需要把处理器调到最高频率,DPM需要依据不同的任务需要选择合适的电源状态。
(2)当系统为空闲状态,没有任务需求时继续保持空闲状态,当有任务需求时可以接收中断处理程序去处理中断。
(3)系统在接收中断处理程序处理完中断后,可以从中断返回到任务态,也可以继续回到空闲态。
(4)系统在任务态时可以经请求睡眠而进入睡眠模式,例如系统可以挂起到RAM或硬盘中,实现尽可能最大程度地节能。
3、工作状态:处于工作状态的无线传感器节点能耗为计算、传感和通信三个功耗模块的能耗之和,这三个模块互相独立。
随着集成电路工艺的进步,处理器和传感器模块的功耗变得很低,绝大部分能量消耗在无线通信模块上。
图3.2所示是Deborah Estrin在Mobicom 2002会议的特邀报告(Wireless Sensor Networks,Part IV: Sensor Networks Protocols)中所述传感器节点各部分能量消耗的情况,从图中可知,传感器节点的大部分能量消耗在无线通信模块。
3、传感器节点状态变换从实用的角度上来说,不是所有的状态模式都有意义,并且不同状态之间的转换会消耗一定的能耗并有一定的时间延迟,如果状态转换的能耗比节约的能量还大,则没有必要进行这种状态转换。
Ubuntu Linux 电池续航时间问题解决方法
Ubuntu, CPU Scaling, Battery life and YouCPU Scaling is a feature built into most modern (mobile) CPUs that allows them to scale up or down in how fast they run and how much energy they suck down based on demand. If you have a fairly modern mobile computer there‘s a very good chance that your CPU(s) can handle frequency scaling.Why should you care? Well, you can control this to tell you computer how much power and how fast it should allow it‘s CP U(s) to operate. This can save some energy and thus battery life at the expense of a little performance – which is great for extending the use time of your laptop when it‘s unplugged.Can your CPU(s) handle scaling? There‘s an easy way to find out. Open up a terminal session (Applications -> Accessories ->T erminal) and type or paste the following into it: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequenciesOn my machine I get back 1667000 1333000 1000000Those are in Hertz, so my machine is capable of 1.66Ghz, 1.33Ghz and 1.00 Ghz.Now that you know your CPU(s) can handle scaling, let‘s see what modes are available. In the terminal, type or paste:cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governorsAgain, I get powersave ondemand userspace conservative performancePowersave will keep the CPU constantly at the lowest frequency. Ondemand will set the CPU at the lowest frequency (in my case, 1.00Ghz) until use of the CPU increases, then it will automatically bump it up to the highest frequency (with me, 1.66Ghz). Userspace means that a different program will be used to control the CPU‘s scaling. Conservative is where your CPU will go up as needed, starting at the lowest frequency, and then bumping up to the next available until itmaxes out. Performance simply sets the CPU(s) at the highest available frequency and keeps it there.The lower your frequency, the less power you use. So, if you‘re bent on extending your battery life to the max, you‘d want to keep your CPU(s) at their lowest frequency –but you‘ll do this at the expense of computing power. In my case my 1.66Ghz processors would effectively be 1.00Ghz processors.Now, how do you actively control this? It‘s fairly easy. Right click on an empty space in your taskbar (where your a pplets and such things as Applications, Places and System are located) and choose ―Add to panel‖. From there, find the CPU Frequency Scaling Monitor. Double click on this and it will appear in your taskbar. Right click on it and choose Properties and you can set various options like have it show your CPU frequency as a frequency (i.e. 1.33Ghz) or as a percentage. If you have multiple CPU‘s or a dual/quad core machine you can also choose which CPU to monitor.To configure this applet to actually allow you to control how your CPU(s) scale, you‘ll have to had back to the terminal.Type this: sudo dpkg-reconfigure gnome-appletsThis will throw up a nifty blue screen asking you to say Yes. Do so. Then it will ask if you want to install cpufreq-selector with SUID roo t. Say yes. Once you‘ve done this, go back to your CPU Frequency Scaling Monitor in your taskbar and left click it. You should now be presented with a bunch of options from which you can choose the one you want. You can also directly set the frequency at which your CPU(s) will run at, which can be handy if you want to scale up or down for a short bit and then manually change it again.As you can see, I‘ve got mine set to Ondemand, allowing the frequency to scale up through three different settings (1 GHz, 1.33 GHz or 1.66 GHz) as needed.While this will take effect immediately, it will only be in effect until you reboot at which time your default settings will come back. To change the default head back into your terminal and type: gconf-editorFrom there head to apps -> gnome-power-manager -> cpufreq. Find the settings policy_ac and policy_battery and change them to whichever setting you want for the default.For those with multiple cores or processors who happen to be a bit needy in the info department (like myself) you can add an applet for each CPU. Just add as many applets as you have CPUs and then right click on them, choose Preferences and use the drop down to choose which CPU that particular applet is monitoring.Now you know a lot more about CPU Frequency Scaling then you may have when you started reading this article and you know how to set it on your computer.Ubuntu 笔记本电源管理优化指南看到许多朋友抱怨linux电源管理很糟糕,说什么电池使用比win下短了很多。
struct regulator结构
struct regulator结构
在Linux内核中,struct regulator结构是一个用于描述和操作电压调节器
的数据结构。
它提供了对电压调节器的抽象,使得消费者(consumer)可
以以统一的方式来获取、启用、修改和禁用电压调节器。
struct regulator结构包含以下主要成员:
1. name:电压调节器的名称。
2. desc:描述电压调节器的信息,包括最小和最大的电压值、电流限制等。
3. driver:指向实现电压调节器操作的驱动程序的指针。
4. lock:用于保护对电压调节器的并发访问。
5. consumer:指向使用该电压调节器的消费者的指针。
消费者可以通过struct regulator结构来获取、启用、修改和禁用电压调节器。
例如,消费者可以使用regulator_get()函数来获取一个指向struct regulator结构的指针,然后使用该指针来调用相应的接口来操作电压调节器。
总体来说,struct regulator结构是Linux内核中电源管理子系统的重要组成部分,它提供了一种抽象的机制来管理电压调节器,使得消费者可以以统一的方式来操作不同的电压调节器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux的电源管理架构Linux的源代码里,大部分都属于设备驱动程序的代码,因此,大多数电源管理(PM)的代码也是存在于驱动程序当中。
很多驱动程序可能只做了少量的工作,另外一些,例如使用电池供电的硬件平台(移动电话等)则会在电源管理上做了大量的工作。
这份文档对驱动程序如何与系统的电源管理部分交互做了一个大概的描述,尤其是关联到驱动程序核心中的模型和接口的共享,建议从事驱动程序相关领域的人通过本文档可以了解相关的背景知识。
设备电源管理的两种模型===================================驱动程序可以使用其中一种模型来使设备进入低功耗状态:1. 系统睡眠模型:驱动程序作为一部分,跟随系统级别的低功耗状态,就像”suspend”(也叫做”suspend-to-RAM”),或者对于有硬盘的系统,可以进入”hibernation”(也叫做”suspend-to-disk”)。
这种情况下,驱动程序,总线,设备类驱动一起,通过各种特定于设备的suspend和resume 方法,清晰地关闭硬件设备和各个软件子系统,然后在数据不被丢失的情况下重新激活硬件设备。
有些驱动程序可以管理硬件的唤醒事件,这些事件可以让系统离开低功耗状态。
这一特性可以通过相应的/sys/devices/…/power /wakeup文件来开启和关闭(对于Ethernet驱动程序,ethtool通过ioctl接口达到同样的目的);使能该功能可能会导致额外的功耗,但他让整个系统有更多的机会进入低功耗状态。
2. Runtime 电源管理模型:这种模型允许设备在系统运行阶段进入低功耗状态,原则上,他可以独立于其他的电源管理活动。
不过,通常设备之间不能单独进行控制(例如,父设备不能进入suspend,除非他的所有子设备已经进入suspend状态)。
此外,依据不同的总线类型,可能必须做出一些特别的操作来达到目的。
如果设备在系统运行阶段进入了低功耗状态,在系统级别的电源状态迁移时(suspend或hibernation)就必须做出特别的处理。
正因为这个原因,不仅仅设备驱动程序本身,相应的子系统(bus type,device type,device class)驱动程序和电源管理核心也会被卷入到rumtime电源管理的工作中来。
比如当系统睡眠时,以上的各模块必须互相合作来实现各种多样的suspend和resume方法,以便让硬件进入低功耗状态,唤醒后继续提供服务而不丢失数据。
对于低功耗状态的定义,我们没有太多可以说的,因为他们通常特定于系统,甚至特定于某个设备。
如果在系统运行状态,足够多的设备进入了低功耗状态,这时的效果其实和进入了系统级别的低功耗状态非常相像。
这样一些驱动程序可以利用rumtime电源管理让系统进入一种类似深度省电的状态。
大多数进入suspend状态的设备会停止所有的I/O操作:不会有DMA或者IRQ请求(需要唤醒系统的除外),不会有数据的读写,不再接受上层驱动的请求。
这对于不同的总线和平台会有不同的要求。
关于硬件唤醒事件的一些例子:由RTC发起的闹钟,网络数据包的到达,键盘或者鼠标的活动,媒体的插入或移除(PCMCIA,MMC/SD,USB,等等)。
进入系统睡眠状态的接口=================================================== 内核为各个子系统(bus type,device type, device class)和驱动程序提供了相应的编程接口,以便它们参与它们所关心的设备的电源管理。
这些接口覆盖了系统级别的睡眠和runtime级别的管理。
设备电源管理操作=================================================== 子系统和驱动程序的设备电源管理操作,都定义在dev_pm_ops结构中:1 2 3 4 5 6 7 8 9101112 struct dev_pm_ops {int(*prepare)(struct device *dev); void(*complete)(struct device *dev); int(*suspend)(struct device *dev); int(*resume)(struct device *dev);int(*freeze)(struct device *dev);13141516171819202122232425262728293031323334353637int(*thaw)(struct device *dev);int(*poweroff)(struct device *dev);int(*restore)(struct device *dev);int(*suspend_noirq)(struct device *dev); int(*resume_noirq)(struct device *dev);int(*freeze_noirq)(struct device *dev);int(*thaw_noirq)(struct device *dev);int(*poweroff_noirq)(struct device *dev); int(*restore_noirq)(struct device *dev); int(*runtime_suspend)(struct device *dev); int(*runtime_resume)(struct device *dev); int(*runtime_idle)(struct device *dev); };这个结构在include/linux/pm.h中定义,它们的作用将会在接下来进行描述。
现在,我们只要记住,最后三个方法是专门用于rumtime pm的,其他的则用于系统级别的电源状态迁移。
某些子系统中,依然存在所谓“过时的”或“传统的”电源管理操作接口,这种方式不会使用到dev_pm_ops结构,而且只适用于系统级别的电源管理方法,这边文章里将不会对它进行说明,如果要了解的话请直接查看内核的源代码。
子系统级别(Subsystem-Level)方法————————————————设备进入suspend和resume的关键方法在bus_type结构、device_type结构和class 结构的pm成员中,他是一个dev_pm_ops结构的指针。
多数情况下,这些都是那些具体总线的体系结构(例如PCI或USB或某个设备类别和设备类)的维护者们来关注的部分。
总线驱动会适当地实现这些方法以供硬件和驱动程序使用它们;因为PCI和USB有不同的工作方式。
只有少数人会编写subsystem-level的驱动程序;大多数的设备驱动程序是建立在各种特定总线架构的代码之上。
有关这些调用,稍后会进行更详尽的描述;它们将会顺着父子形式的设备模型树,一个设备一个设备地被调用。
/sys/devices/…/power/wakeup files————————————————-设备模型中的所有设备都有两个标志来控制唤醒事件(可使得设备或系统退出低功耗状态)。
设两个标志位由总线或者设备驱动用device_set_wakeup_capable()和device_set_wakeup_enable()来初始化,它们在include/linux/pm_wakeup.h中定义。
“can_wakeup”标志表示设备(或驱动)物理上支持唤醒事件,device_set_wakeup_capable()函数会影响该标志。
”should_wakeup”标志控制设备是否应该尝试启用他的唤醒机制。
device_set_wakeup_enable()会影响该标志。
大部分的驱动程序不会主动修改它们的值。
大多数设备的should_wakeup的初始值都被设为false,也有例外,比如电源键、键盘和由ethtool设置了wake-on-LAN功能的网卡。
设备是否有能力发出唤醒事件是一个硬件的问题,内核只是负责持续地跟踪这些事件的发生。
另外一方面,一个有唤醒能力的设备是否应该发起唤醒事件则是一个策略问题,它是由用户空间通过sysfs的属性文件(power/wakeup)进行管理的。
用户空间可以写入”enabled”,或”disabled”来设置或清除shoule_wakeup标志,相应地,读取该文件时,如果can_wakeup标志是true则返回对应的字符串,如果can_wakeup是false,则返回一个空字符串,以此来表明设备不支持唤醒事件。
(需要注意的是,尽管返回空字符串,该文件的写入依然会影响should_wakeup标志)只有当这两个标志都为true时,device_may_wakeup()函数才会返回true。
当系统迁移到睡眠状态时,驱动程序应该在让设备进入低功耗状态前通过这一函数检查,确定是否启用唤醒机制。
不过,在rumtime电源管理模式下,不管设备和驱动程序是否都支持,也不管should_wakeup标志是否设置,唤醒事件都会被使能。
/sys/devices/…/power/control files————————————————设备模型中的每个设备都有一个标志位来控制它是否属于runtime电源管理模式。
这个叫runtime_auto的标志由bus type(或其他子系统)用pm_rumtime_allow()或者是pm_rumtime_forbid()来初始化。
默认值是允许rumtimepm的。
用户空间可以通过向设备的sysfs文件power/control写入”on”或者”auto”来修改该标志位。
写入”auto”相当于调用了pm_rumtime_allow(),允许设备由驱动程序进行rumtimepm。
写入”on”相当于调用pm_rumtime_forbid(),标志位被清除,设备将会从低功耗状态返回全功率状态,并且阻止设备进行runtime电源管理。
用户空间也可以读取该文件来检查runtime_auto的当前值。
设备的runtime_auto标志不会影响系统级别电源状态的迁移。
特别注意的是,尽管runtime_auto标志被清除,当系统级别的电源状态迁移到睡眠状态时,设备也会被带入低功耗状态。
关于runtime电源管理架构的更多信息,请参看Documentation/power/runtime_pm.txt。
调用驱动程序进入或退出系统睡眠状态==================================当系统进入睡眠状态,系统会要求设备驱动程序让设备进入兼容于目标系统的一种状态来挂起(suspend)设备。