基于linux内核驱动的Android电源管理浅谈

合集下载

浅谈Android(安卓)

浅谈Android(安卓)

浅谈Android--嵌入式操作系统Android(读音:[ˈændrɔid],中文俗称安卓)是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google成立的Open Handset Alliance (OHA,开放手持设备联盟)持续领导与开发中。

--题记.维基百科说起嵌入式系统,曾经在保罗大叔的著作《黑客与画家》里看到多次,然后不明所以,就去查了嵌入式系统。

如果说嵌入式系统给我的第一印象是硬件,那么是我还不知道嵌入式在我生活里已经出现了很多年了。

大到冰箱,自动存款机(ATM),小到电子手表,遥控器。

在维基百科解答后,我对嵌入式直观的理解,是一种特定的植入硬件并极具针对性的计算机系统。

后来慢慢了解嵌入式的软件方面,就知道了嵌入式操作系统,而其中的佼佼者,就是如今已经超越ios,占据半壁江山的Android。

之所以会说Android,原因有二:一,因为Android如今炙手可热,在新一季度的日本手机软件营销额上,以Java等语言为Android系统开发的Apps,疯狂揽金,李开复断言在两年内,中国内地手机游戏软件市场,将会百花齐放;二,我虽并非研究Java也非致力于Android系统,但是Android系统的内核,却是我所熟悉的Linux内核。

而我将自己的开发平台转移到Linux系统,并以Python,Perl以及Lisp语言作为未来的生存工具,所以,就让我们谈一谈Android。

题记中套用维基百科对于Android的介绍,主要的目的,就是为了澄清一件事实“认知”——Android并没有真正的中文名。

Google并没有为Android命名,只有为其版本取名,且翻译成中文:4.2.x Jelly Bean 果冻豆,4.0.x Ice Cream Sandwich 冰激凌三明治,3.x.x HoneyComb 蜂巢,2.3.x Ginger Bread 姜饼。

而“安卓”一词,也是我们自己对其中文简称,就像Facebook并没有为其在中国大陆市场取名一样。

Linux的电源管理架构

Linux的电源管理架构

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)就必须做出特别的处理。

android系统电源管理流程

android系统电源管理流程

android系统电源管理流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!深入解析Android系统的电源管理流程在智能手机的日常使用中,电源管理是至关重要的一个环节,它直接影响到设备的续航能力和性能优化。

Linux下PowerManagement开发总结

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电源管理详解

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是互相冲突的两个模块,用户在同一时间内只能加载其中之一,如果当他们在加载的时候发现二者之一已经加载,就会自动退出。

Android是一种基于Linux的自由及开放源代码的操作系统

Android是一种基于Linux的自由及开放源代码的操作系统

Android是⼀种基于Linux的⾃由及开放源代码的操作系统Android是⼀种基于Linux的⾃由及开放源代码的操作系统,主要使⽤于移动设备,如智能⼿机和平板电脑,由Google公司和开放⼿机联盟领导及开发。

尚未有统⼀中⽂名称,中国⼤陆地区较多⼈使⽤“安卓”或“安致”。

Android操作系统最初由Andy Rubin开发,主要⽀持⼿机。

2005年8⽉由Google收购注资。

2007年11⽉,Google与84家硬件制造商、软件开发商及电信营运商组建开放⼿机联盟共同研发改良Android系统。

随后Google以Apache开源许可证的授权⽅式,发布了Android的源代码。

第⼀部Android智能⼿机发布于2008年10⽉。

Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。

2011年第⼀季度,Android在全球的市场份额⾸次超过塞班系统,跃居全球第⼀。

2012年11⽉数据显⽰,Android占据全球智能⼿机操作系统市场76%的份额,中国市场占有率为90%。

中⽂名:安卓外⽂名:Android开发商:Google、开放⼿持设备联盟发⾏商:Google发⾏时间:2008年9⽉23⽇编程语⾔:C/C++(底层)Java等(应⽤层)系统家族:类Unix,Linux源码模式:⾃由及开放源代码软件内核类型:宏内核(Linux内核)软件许可:Apache License, GPL等Android⼀词的本义指“机器⼈”,同时也是Google于2007年11⽉5⽇宣布的基于Linux平台的开源⼿机操作系统的名称,该平台由操作系统、中间件、⽤户界⾯和应⽤软件组成。

Android⼀词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻⼩说《未来夏娃》(L'ève future)中。

他将外表像⼈的机器起名为Android。

Linux下基于I2C的电源管理芯片驱动设计

Linux下基于I2C的电源管理芯片驱动设计

0 引 言
内部 集 成 电路 (ne—ne rtd crut 2 itritg ae i i c ,IC)
12 IC 总 线 信 号 时序 . 2
S DA 和 S L2条 信 号 线 都 处 于 高 电平 ,即 总 线 C 空 闲状 态 , 2条 信 号 线 各 自的 上 拉 电阻 把 电平 拉 高 ;
( tritgae i ut u d r iu . h 2 u miga dtese il rhtcueo eICb s nte n xk re ae i e— e rtdcr i n e n x T eICb s i n n p ca ac i tr fh 2 u u en l r n n c ) L t h e t i h Li
23 I C设 备 驱 动 . 2
CON Dn1 oN
图 1 IC总 线起 始 信 号 与结 束信 号【 2
定 义 描 述 具 体 设 备 的 IC cin 2 l t和 可 能 的私 有 e 数 据 结 构 、借 助 IC 框 架 的 IC pr be 函 数 实 现 注 2 2 o

‘ 、

源 转 换 输 出 的应 用 ,提 供 简 单 易 用 而 又 可 以灵 活 配 置 的完 整 电源 解 决 方 案 , 充 分 满 足 目前 日益 复 杂 的 应 用 处 理器 系 统 对 于 电源 相 对 复 杂 而 精 确 控 制 的要 求 。AXP 9 提 供 了一 个 与主 机 通 讯 的 两 线 串行 通 12
接 收 端 接 收 完 一 个 字 节 后 , 会 立 刻 在 AC 周 期 内 K
1 IC总线 概 述 与时序 2
11 IC 总 线 介 绍 . 2
将 S DA 由高 电平 翻 转 为低 电 平 ,这 便 产 生 了 一 个

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》19. Linux电源管理系统架构和驱动

《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,动态电压频率调整)。

linux内核电源管理

linux内核电源管理
1.如果设置了current进程的current.flags=PF_FREEZE,那么系统要suspend时,就会把所有设置了此标志位的thread_info.flagg设置成TIF_FREEZE,那么就可以让本进程freeze ;
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);

第十三章 Android内核驱动——电源管理

第十三章 Android内核驱动——电源管理

第十三章Android内核驱动——电源管理13.1 基本原理Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。

●earlysuspend是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如LCD可以降低亮度或灭掉;●suspend是指除电源管理以外的其他外围模块以及cpu均不工作,只有内存保持自刷新的状态;●hibernation是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到“关机”之前的状态。

13.2 电源管理机制的实现电源管理机制的源代码主要在kernel/power/文件夹下面。

main.c文件是整个框架的入口。

用户可以通过读写sys文件/sys/power/state实现控制系统进入低功耗状态。

用户对于/sys/power/state的读写会调用到main.c中的state_store(),用户可以写入const char * const pm_states[] 中定义的字符串,比如“on”,“mem”,“standby”,“disk”。

state_store()首先判断用户写入的是否是“disk”字符串,如果是则调用hibernate()函数命令系统进入hibernation状态。

如果是其他字符串则调用request_suspend_state()(如果未定义CONFIG_EARLYSUSPEND)或者调用enter_state()(如果未定义CONFIG_EARLYSUSPEND)。

request_suspend_state()函数是android相对标准linux改动的地方,它实现在earlysuspend.c 中。

在标准linux内核中,用户通过sysfs 写入“mem”和“standby”时,会直接调用enter_state()进入suspend模式,但在android中则会调用request_suspend_state()函数进入early suspend 状态。

android系统电源管理----regulator的使用

android系统电源管理----regulator的使用

android系统电源管理----regulator的使⽤android系统电源管理----regulator的使⽤例:触摸屏它使⽤了⼀路regulator,他在机器suspend的时候要求关电(或者说低电),在机器开屏的时候才要求上电使⽤.那么:使⽤过程是这样的:1.我们先注册⼀个全局的regulatorstatic struct regulator *nabi2_dsi_reg = NULL;2.然后get regulatornabi2_dsi_reg = regulator_get(NULL, "avdd_dsi_csi");这个我们应该有印象,在平台设备注册的时候我们有注册它.如:static struct regulator_consumer_supply max77663_ldo7_supply[] ={REGULATOR_SUPPLY("avdd_dsi_csi",NULL),REGULATOR_SUPPLY("pwrdet_mipi",NULL),};Ok,之前我们注册了它,现在我们得到它3.给它上电就使能它regulator_enable(nabi2_dsi_reg);4.我们不再需要的时候就禁⽌它,以及放回它的使⽤权.regulator_disable(nabi2_dsi_reg);regulator_put(nabi2_dsi_reg);还有⼀些操作函数如://通过此接⼝获取输出电压int regulator_get_voltage(struct regulator *regulator)//调节电压的最⼩和最⼤输出。

如果接下去调⽤regulator_enable ,那么这个值马上就⽣效,如果调⽤regulator_disable等其他的,要等到下⼀次调⽤regulator_enable时才能⽣效。

int regulator_set_voltage(regulator,min_uV,max_uV);//强制关闭电源int regulator_force_disable(regulator);//关闭电源输出。

arm,linux,电源管理解决方案

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驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)

linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)

linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(⼀)linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(⼀)1. Based on linux2.6.32, only for mem(SDR)2. 有兴趣请先参考阅读:电源管理⽅案APM和ACPI⽐较.docLinux系统的休眠与唤醒简介.doc3. 本⽂先研究标准linux的休眠与唤醒,android对这部分的增改在另⼀篇⽂章中讨论4. 基于⼿上的⼀个项⽬来讨论,这⾥只讨论共性的地⽅虽然linux⽀持三种省电模式:standby、suspend to ram、suspend to disk,但是在使⽤电池供电的⼿持设备上,⼏乎所有的⽅案都只⽀持STR模式(也有同时⽀持standby模式的),因为STD模式需要有交换分区的⽀持,但是像⼿机类的嵌⼊式设备,他们普遍使⽤nand来存储数据和代码,⽽且其上使⽤的⽂件系统yaffs⼀般都没有划分交换分区,所以⼿机类设备上的linux都没有⽀持STD省电模式。

⼀、项⽬power相关的配置⽬前我⼿上的项⽬的linux电源管理⽅案配置如下,.config⽂件的截图,当然也可以通过makemenuconfig使⽤图形化来配置:## CPU Power Management## CONFIG_CPU_IDLE is not set## Power management options#CONFIG_PM=y# CONFIG_PM_DEBUG is not setCONFIG_PM_SLEEP=yCONFIG_SUSPEND=yCONFIG_SUSPEND_FREEZER=yCONFIG_HAS_WAKELOCK=yCONFIG_HAS_EARLYSUSPEND=yCONFIG_WAKELOCK=yCONFIG_WAKELOCK_STAT=yCONFIG_USER_WAKELOCK=yCONFIG_EARLYSUSPEND=y# CONFIG_NO_USER_SPACE_SCREEN_ACCESS_CONTROL is not set# CONFIG_CONSOLE_EARLYSUSPEND is not setCONFIG_FB_EARLYSUSPEND=y# CONFIG_APM_EMULATION is not set# CONFIG_PM_RUNTIME is not setCONFIG_ARCH_SUSPEND_POSSIBLE=yCONFIG_NET=y上⾯的配置对应下图中的下半部分图形化配置。

Android_电源管理

Android_电源管理

Android电源管理总体上来说Android的电源管理还是比较简单的, 主要就是通过锁和定时器来切换系统的状态,使系统的功耗降至最低,整个系统的电源管理架构图如下: (注该图来自Steve Guo)接下来我们从Java应用层面, Android framework层面, Linux内核层面分别进行详细的讨论:应用层的使用:Android提供了现成android.os.PowerManager类,该类用于控制设备的电源状态的切换.该类对外有三个接口函数:void goToSleep(long time); //强制设备进入Sleep状态Note:尝试在应用层调用该函数,却不能成功,出现的错误好象是权限不够, 但在Framework下面的Service里调用是可以的.newWakeLock(int flags, String tag);//取得相应层次的锁flags参数说明:PARTIAL_WAKE_LOCK: Screen off, keyboard light offSCREEN_DIM_WAKE_LOCK: screen dim, keyboard light offSCREEN_BRIGHT_WAKE_LOCK: screen bright, keyboard light offFULL_WAKE_LOCK: screen bright, keyboard brightACQUIRE_CAUSES_WAKEUP: 一旦有请求锁时强制打开Screen和keyboardlightON_AFTER_RELEASE: 在释放锁时reset activity timerNote:如果申请了partial wakelock,那么即使按Power键,系统也不会进Sleep,如Music播放时如果申请了其它的wakelocks,按Power键,系统还是会进Sleep void userActivity(long when, boolean noChangeLights);//User activity事件发生,设备会被切换到Full on的状态,同时Reset Screen off timer.Sample code:PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);PowerManager.WakeLock wl = pm.newWakeLock (PowerManager.SCREEN_DIM_WAKE_LOCK, “My Tag”);wl.acquire();//在释放之前,屏幕一直亮着(有可能会变暗,但是还可以看到屏幕内容)wl.release();//释放掉正在运行的CPU和关闭屏幕这个例子首先通过getSystemService得到PowerManager,然后生成一个SCREEN_DIM_WAKE_LOCK锁,并且通过acquire()方法使用这个锁,通过release()方法释放这个锁,acquire和release必须成对使用,否则会造成系统电源管理的错误.(比如系统acquire了 partial_wake_lock而忘记释放了,那么系统永远无法进入掉电模式!)Note:1. 在使用以上函数的应用程序中,必须在其Manifest.xml文件中加入下面的权限: <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DEVICE_POWER" />2. 所有的锁必须成对的使用,如果申请了而没有及时释放会造成系统故障.如申请了partial wakelock,而没有及时释放,那系统就永远进不了Sleep模式.Android Framework层面:其主要代码文件如下:frameworks\base\core\java\android\os\PowerManager.javaframeworks\base\services\java\com\android\server\PowerManagerService.javaframeworks\base\core\java\android\os\Power.javaframeworks\base\core\jni\android_os_power.cpphardware\libhardware\power\power.c其中PowerManagerService.java是核心, Power.java提供底层的函数接口,与JNI层进行交互, JNI层的代码主要在文件android_os_Power.cpp中,与Linux kernel交互是通过Power.c来实现的, Andriod跟Kernel的交互主要是通过sys文件的方式来实现的,具体请参考Kernel层的介绍.这一层的功能相对比较复杂,比如系统状态的切换,背光的调节及开关,Wake Lock的申请和释放等等,但这一层跟硬件平台无关,而且由Google负责维护,问题相对会少一些,有兴趣的朋友可以自己查看相关的代码.Kernel层:其主要代码在下列位置:drivers/android/power.c其对Kernel提供的接口函数有EXPORT_SYMBOL(android_init_suspend_lock); //初始化Suspend lock,在使用前必须做初始化EXPORT_SYMBOL(android_uninit_suspend_lock); //释放suspend lock相关的资源EXPORT_SYMBOL(android_lock_suspend); //申请lock,必须调用相应的unlock来释放它EXPORT_SYMBOL(android_lock_suspend_auto_expire);//申请partial wakelock, 定时时间到后会自动释放EXPORT_SYMBOL(android_unlock_suspend); //释放lockEXPORT_SYMBOL(android_power_wakeup); //唤醒系统到onEXPORT_SYMBOL(android_register_early_suspend); //注册early suspend的驱动EXPORT_SYMBOL(android_unregister_early_suspend); //取消已经注册的early suspend的驱动提供给Android Framework层的proc文件如下:"/sys/android_power/acquire_partial_wake_lock" //申请partial wake lock"/sys/android_power/acquire_full_wake_lock" //申请full wake lock"/sys/android_power/release_wake_lock" //释放相应的wake lock"/sys/android_power/request_state" //请求改变系统状态,进standby和回到wakeup两种状态"/sys/android_power/state" //指示当前系统的状态Android的电源管理主要是通过Wake lock来实现的,在最底层主要是通过如下三个队列来实现其管理:static LIST_HEAD(g_inactive_locks);static LIST_HEAD(g_active_partial_wake_locks);static LIST_HEAD(g_active_full_wake_locks);所有初始化后的lock都会被插入到g_inactive_locks的队列中,而当前活动的partial wake lock都会被插入到g_active_partial_wake_locks队列中, 活动的full wake lock被插入到g_active_full_wake_locks队列中, 所有的partial wake lock 和full wake lock在过期后或unlock后都会被移到inactive的队列,等待下次的调用.在Kernel层使用wake lock步骤如下:1.调用函数android_init_suspend_lock初始化一个wake lock2.调用相关申请lock的函数android_lock_suspend 或android_lock_suspend_auto_expire 请求lock,这里只能申请partial wake lock, 如果要申请Full wake lock,则需要调用函数android_lock_partial_suspend_auto_expire(该函数没有EXPORT出来),这个命名有点奇怪,不要跟前面的android_lock_suspend_auto_expire搞混了.3.如果是auto expire的wake lock则可以忽略,不然则必须及时的把相关的wake lock释放掉,否则会造成系统长期运行在高功耗的状态.4.在驱动卸载或不再使用Wake lock时请记住及时的调用android_uninit_suspend_lock 释放资源.系统的状态:USER_AWAKE, //Full on statusUSER_NOTIFICATION, //Early suspended driver but CPU keep onUSER_SLEEP // CPU enter sleep mode其状态切换示意图如下:系统正常开机后进入到AWAKE状态, Backlight会从最亮慢慢调节到用户设定的亮度,系统screen off timer(settings->sound & display-> Display settings -> Screen timeout)开始计时,在计时时间到之前,如果有任何的activity事件发生,如Touch click, keyboard pressed等事件, 则将Reset screen off timer, 系统保持在AWAKE状态. 如果有应用程序在这段时间内申请了Full wake lock,那么系统也将保持在AWAKE状态, 除非用户按下power key. 在AWAKE状态下如果电池电量低或者是用AC供电screen off timer时间到并且选中Keep screen on while pluged in选项,backlight会被强制调节到DIM的状态.如果Screen off timer时间到并且没有Full wake lock或者用户按了power key,那么系统状态将被切换到NOTIFICATION,并且调用所有已经注册的g_early_suspend_handlers函数, 通常会把LCD和Backlight驱动注册成early suspend类型,如有需要也可以把别的驱动注册成early suspend, 这样就会在第一阶段被关闭. 接下来系统会判断是否有partial wake lock acquired, 如果有则等待其释放, 在等待的过程中如果有user activity事件发生,系统则马上回到AWAKE状态;如果没有partial wake lock acquired, 则系统会马上调用函数pm_suspend关闭其它相关的驱动, 让CPU进入休眠状态.系统在Sleep状态时如果检测到任何一个Wakeup source, 则CPU会从Sleep状态被唤醒,并且调用相关的驱动的resume函数,接下来马上调用前期注册的early suspend驱动的resume函数,最后系统状态回到AWAKE状态.这里有个问题就是所有注册过early suspend的函数在进Suspend的第一阶段被调用可以理解,但是在resume的时候, Linux会先调用所有驱动的resume函数,而此时再调用前期注册的early suspend驱动的resume函数有什么意义呢?个人觉得android的这个early suspend和late resume函数应该结合Linux下面的suspend和resume一起使用,而不是单独的使用一个队列来进行管理.Android的电源管理构架如下图所示(图中kernel部分代码的路径是老版本的android):Linux与Android休眠唤醒对比(二)Android休眠与唤醒(二)Android中定义了几种低功耗状态:earlysuspend,suspend,hibernation。

电源管理

电源管理

Android电源管理系统调研报告-(1)2011-02-17 09:18转载自carvencao最终编辑carvencao如今手持设备中出现的一对不可调和的矛盾就是越来越大的能量消耗与电池容量瓶颈之间的矛盾,就算没有这个瓶颈,相对更持久的续航能力也是众向所归。

Android系统一般应用于高端智能设备,能源消耗尤其突出,因此对Android 的电源管理系统的调研有很必要。

Android系统是基于标准Linux内核之上的,在Linux内核在原有的power manager系统之上增加了相应了文件,为Android系统的power manager提供底层服务支持。

因此,调研工作在两个层面展开:Linux内核层、Android系统层。

Linux内核层:针对Android系统而增添的power manager文件有如下五个:/Linux-2.6.29/kernel/power/|-consoleearlysuspend.c|-earlysuspend.c|-fbearlysuspend.c|-userwakelock.c|-wakelock.c这五个文件配合Linux层的power manager柜架和与功耗相关的设备驱动,向Android层提供了power manager的底层支持。

与功耗相关的设备主要包括LCD屏和键盘及其它设备的LED灯。

因些,在这类设备的驱动中应该增加相应的power manager功能。

在该调研报告中,仅简单地罗出列出各文件中定义的功能函数以及向上提供的接口,其具体的功能调用及整个power manager柜架地实现在后期的调研报告中阐述。

1)、consoleearlysuspend.c功能函数:static void console_early_suspend(struct early_suspend *h);static void console_late_resume(struct early_suspend *h);static int __init console_early_suspend_init(void);static void __exit console_early_suspend_exit(void);数据结构:static struct early_suspend console_early_suspend_desc = { .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING,.suspend = console_early_suspend,.resume = console_late_resume,};2、earlysuspend.c功能函数:void register_early_suspend(struct early_suspend *handler);void unregister_early_suspend(struct early_suspend *handler);static void early_suspend(struct work_struct *work);static void late_resume(struct work_struct *work);void request_suspend_state(suspend_state_t new_state); suspend_state_t get_suspend_state(void);供驱动使用的函数接口:EXPORT_SYMBOL(register_early_suspend);EXPORT_SYMBOL(unregister_early_suspend);在earlysuspend.h文件中定义了注册接口函数:#ifdef CONFIG_HAS_EARLYSUSPENDvoid register_early_suspend(struct early_suspend *handler);void unregister_early_suspend(struct early_suspend *handler);3、fbearlysuspend.c功能函数:static void stop_drawing_early_suspend(struct early_suspend *h);static void start_drawing_late_resume(struct early_suspend *h);static ssize_t wait_for_fb_sleep_show(struct kobject *kobj,struct kobj_attribute *attr, char *buf);static ssize_t wait_for_fb_wake_show(struct kobject *kobj,struct kobj_attribute *attr, char *buf);static int __init android_power_init(void);static void __exit android_power_exit(void)主要的数据结构:static struct early_suspend stop_drawing_early_suspend_desc = {.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING,.suspend = stop_drawing_early_suspend,.resume = start_drawing_late_resume,};在以上面的几个函数中,都调用了__wake_up:在sched.c中定义了这个函数/*** __wake_up - wake up threads blocked on a waitqueue.* @q: the waitqueue* @mode: which threads* @nr_exclusive: how many wake-one or wake-many threads to wake up* @key: is directly passed to the wakeup function*/void __wake_up(wait_queue_head_t *q, unsigned int mode,int nr_exclusive, void *key){unsigned long flags;spin_lock_irqsave(&q->lock, flags);__wake_up_common(q, mode, nr_exclusive, 0, key);spin_unlock_irqrestore(&q->lock, flags);}4、userwakelock.cstatic struct user_wake_lock *lookup_wake_lock_name(const char *buf, int allocate, long *timeoutptr);ssize_t wake_lock_show(struct kobject *kobj, structkobj_attribute *attr, char *buf);ssize_t ssixe_t wake_lock_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n);ssize_t wake_unlock_show(struct kobject *kobj, structkobj_attribute *attr, char *buf);ssize_t wake_unlock_store(struct kobject *kobj, structkobj_attribute *attr, const char *buf, size_t n);5、wakelock.c提供了接口函数有:EXPORT_SYMBOL(wake_lock_init);EXPORT_SYMBOL(wake_lock_destroy);EXPORT_SYMBOL(wake_lock);EXPORT_SYMBOL(wake_lock_timeout);EXPORT_SYMBOL(wake_unlock);EXPORT_SYMBOL(wake_lock_active);以上函数仅提供了一个android power manager实现的底层柜架,要使其很好的work起来,需要相关设备driver的支持和与Android层power manager 系统很好的配合。

嵌入式系统中的电源管理技术

嵌入式系统中的电源管理技术

嵌入式系统中的电源管理技术随着科技的不断发展,嵌入式系统在各个领域的应用越来越广泛。

嵌入式系统是一种特定功能的计算机系统,通常嵌入在其他设备中,用于控制、监测或者执行特定任务。

嵌入式系统的电源管理技术是确保系统稳定运行和节约能源的关键因素之一。

本文将探讨嵌入式系统中常用的电源管理技术及其应用。

一、电源管理的重要性在嵌入式系统中,电源管理是至关重要的。

首先,嵌入式系统通常需要在有限的电能供应条件下运行,因此必须对电能进行有效利用,延长系统的工作时间。

其次,电源管理可以极大地影响系统的稳定性和可靠性。

通过合理管理电源,可以避免电压抖动、电流波动等问题,提高系统的稳定性和可靠性。

此外,电源管理还可以降低系统的功耗,减少能源消耗,符合环保理念。

二、嵌入式系统常用的电源管理技术1. 低功耗睡眠模式低功耗睡眠模式是一种常用的电源管理技术。

当系统处于空闲或者待机状态时,可以将处理器、内存等关键组件进入低功耗模式,降低系统的功耗。

同时,可以设置唤醒机制,当有外部事件发生时,系统可以迅速恢复正常工作状态。

这种技术在电池供电的嵌入式系统中尤为重要,可以延长电池的使用寿命。

2. 动态电压调整技术动态电压调整技术是一种根据系统实际工作负载情况来调整电压的技术。

通过动态调整电压,可以使电压与功耗匹配,从而实现节能的目的。

这种技术在处理器和其他集成电路中广泛应用,可以根据负载的变化自动调整电压,提高系统的能效。

3. 电源管理芯片电源管理芯片是一种专用的芯片,用于管理嵌入式系统的电源供应和电路保护。

这种芯片通常具有多种功能,如电池充电管理、电源开关控制、供电稳压等。

通过集成电源管理芯片,可以实现对嵌入式系统电源的全面控制和管理,提高系统的稳定性和可靠性。

三、电源管理技术的应用1. 智能手机在智能手机等便携式设备中,电源管理技术尤为重要。

为了延长电池的使用寿命,智能手机中通常采用了低功耗睡眠模式和动态电压调整技术。

此外,电源管理芯片也起到了关键作用,保证了系统的供电稳定性。

Android和Linux的关系

Android和Linux的关系

Android和Linux的关系①、Android采⽤Linux作为内核②、Android对Linux内核做了相应的修改,使Linux适应在移动设备上使⽤③、Android⼀开始是Linux的⼀个分⽀,由于⽆法并⼊Linux的主开发树,被从开发树中移除⼀、Android是继承于Linux Android是在Linux内核基础之上运⾏,提供的核⼼系统服务包括安全、内存管理、进程管理、组⽹组和驱动模型等内容,内核部分相当于介于硬件层和系统中其他软件组之间的⼀个抽象层次。

所以,严格来说不算是Linux操作系统。

由于Android在很⼤程度上保留了Linux的基本框架,使Android的应⽤性和扩展性都很强。

⼆、Android和Linux区别 Android系统的系统层⾯的底层是Linux,中间加了⼀个叫Dalvik的Java虚拟机,表⾯层是Android运⾏库。

每个Android应⽤都运⾏在⾃⼰的进程上,享有Dalvik虚拟机分配的专有实例。

为了⽀持多个虚拟机在同⼀设备上⾼效运⾏,Dalvik也被修改过。

Dalvik虚拟机执⾏的是Dalvik格式的可执⾏⽂件.dex,该格式经过优化,将内存的消耗降到最低。

Java编译器将java源⽂件转为.class⽂件,.class⽂件⼜被内置的dx⼯具转为.dex格式⽂件,使得能够在Dalvik虚拟机上注册并运⾏。

Android系统的应⽤软件都是运⾏在Dalvik虚拟机之上的Java软件,⽽Dalvik虚拟机是运⾏在Linux之中,在⼀些底层功能(如线程和低内存管理),Dalvik虚拟机是依赖Linux内核的。

因此,Android是运⾏在Linux之上的操作系统。

Android内核和Linux内核主要体现在以下⼏个⽅⾯: ①、Android Binder :Android Binder是基于OpenBinder框架的⼀个驱动,⽤于提供Android平台的进程间通信(IPC,inter-process communication)。

g a d g e t 驱 动 详 解

g a d g e t 驱 动 详 解

《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新本博实时更新《Linux设备驱动开发详解(第3版)》的最新进展。

目前已经完成稿件。

2015年8月9日,china-pub开始上线预售:2015年8月20日,各路朋友报喜说已经拿到了书。

本书已经rebase到开发中的Linux 4.0内核,案例多数基于多核CORTEX-A9平台。

[F]是修正或升级;[N]是新增知识点;[D]是删除的内容第1章《Linux设备驱动概述及开发环境构建》[D]删除关于LDD6410开发板的介绍[F]更新新的Ubuntu虚拟机[N]添加关于QEMU模拟vexpress板的描述第2章《驱动设计的硬件基础》[N]增加关于SoC的介绍;[N]增加关于eFuse的内容;[D]删除ISA总线的内容了;[N]增加关于SPI总线的介绍;[N]增加USB 3.0的介绍;[F]修正USB同步传输方式英文名;[D]删除关于cPCI介绍;[N]增加关于PCI Express介绍;[N]增加关于Xilinx ZYNQ的介绍;[N]增加SD-SDIO-eMMC的章节;[D]删除“原理图分析的内容”一节;[N]增加通过逻辑分析仪看I2C 总线的例子;第3章《Linux内核及内核编程》[N]新增关于3.X内核版本和2015年2月23日 Linux 4.0-rc1[N]新增关于内核版本升级流程以及Linux社区开发模式讲解[N]新增关于Linux内核调度时间的图式讲解[N]新增关于Linux 3.0后ARM架构的变更的讲解[N]新增关于TASK_KILLABLE状态的简介[N]新增Linux内存管理图式讲解[F]修正Kconfig和Makefile中的一些表述[D]删除关于x86启动过程讲解[N]新增ARM Linux启动过程讲解[N]新增关于likely()和unlikely()讲解[N]新增toolchain的讲解,以及toolchain的几种浮点模式第4章《Linux内核模块》[F]改正关于模块使用非GPL license的问题;[F]修正关于__exit修饰函数的内存管理第5章《Linux文件系统与设备文件》[F]修正关于文件系统与块设备驱动关系图;[N]增加应用到驱动的file操作调用图;[N]增加通过netlink接受内核uevent的范例;[N]增加遍历sysfs的范例;[N]增加为kingston U盘编写udev规则的范例;[F]更新udev规则,以符合新版本;[N]增加udevadm的讲解;[N]高亮Android vold第6章《字符设备驱动》[F]更新file_operations的定义,升级ioctl()原型;[N]增加关于Linux access_ok()的讲解以及Linux内核安全漏洞的说明;[F]修正globalmem的编码风格;[F]在globalmem支持2个以上实例的时候,从直接2个实例,升级为支持N个实例;第7章《Linux设备驱动中的并发控制》[N]绘图深入讲解单核和多核下的各种竞态;[N]增加关于编译乱序,执行乱序,编译屏障和内存屏障的讲解;[N]增加关于ARM LDREX-STREX指令的讲解;[N]对spin_lock单核和多核的使用场景进行深入分析;[F]重新整理RCU的讲解方法和实例;[F]明确指明信号量已过时;[F]将globalmem中使用的信号量换为mutex。

linux驱动程序之电源管理之Run-time PM 详解(4)

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-&gt;bus &amp;&amp; dev-&gt;bus-&gt;pm&amp;&amp; dev-&gt;bus-&gt;pm-&gt;runtime_idle) {spin_unlock_irq(&amp;dev-&gt;power.lock);dev-&gt;bus-&gt;pm-&gt;runtime_idle(dev);spin_lock_irq(&amp;dev-&gt;power.lock);} else if (dev-&gt;type &amp;&amp; dev-&gt;type-&gt;pm &amp;&amp; dev-&gt;type-&gt;pm-&gt;runtime_idle) { spin_unlock_irq(&amp;dev-&gt;power.lock);dev-&gt;type-&gt;pm-&gt;runtime_idle(dev);spin_lock_irq(&amp;dev-&gt;power.lock);} else if (dev-&gt;class &amp;&amp; dev-&gt;class-&gt;pm &amp;&amp; dev-&gt;class-&gt;pm-&gt;runtime_idle) { spin_unlock_irq(&amp;dev-&gt;power.lock);dev-&gt;class-&gt;pm-&gt;runtime_idle(dev);spin_lock_irq(&amp;dev-&gt;power.lock);}按照dev-&gt;bus, dev-&gt;type, dev-&gt;class的顺序去调用。

Android内核和驱动篇-Android内核介绍

Android内核和驱动篇-Android内核介绍

Android内核和驱动篇-Android内核介绍已经有一些的文章介绍Android内核了,本系列篇将从Linux内核的角度来分析Android的内核,希望给初学者提够有用的信息。

本章将简单的介绍Android内核的全貌,起到一个抛砖引玉的作用。

从下一篇开始将详细介绍每一个Android内核驱动程序及其作用。

Android内核是基于Linux 2.6内核的(目前最新开发版本是2.6.31),它是一个增强内核版本,除了修改部分Bug外,它提供了用于支持Android平台的设备驱动,其核心驱动主要包括:Android Binder,基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通讯(IPC,inter-process communication)。

源代码位于drivers/staging/android/binder.cAndroid电源管理(PM),一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备做了很多优化。

源代码位于kernel/power/earlysuspend.ckernel/power/consoleearlysuspend.ckernel/power/fbearlysuspend.ckernel/power/wakelock.ckernel/power/userwakelock.c低内存管理器(Low Memory Killer),相对于Linux标准OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程来释放需要的内存。

源代码位于drivers/staging/android/lowmemorykiller.c匿名共享内存(ashmem),为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。

源代码位于mm/ashmem.cAndroid PMEM(Physical),PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何有效地管理嵌入式系统,尤其是移动终端的电源功耗,通过降低设备电压、频率,可以减少能量的消耗,达到省电的目的,电源管理历来为重要的研究课题之一。

动态电源管理DPM(Dynamic Power Management)技术提供一种操作系统级别的电源管理能力,包含CPU工作频率和电压,外部总线时钟频率,外部设备时钟、电源等方面的动态调节、管理功能。

通过用户层制定策略与内核提供管理功能交互,实时调整电源参数而同时满足系统实时应用的需求,允许电源管理参数在短时间的空闲或任务运行在低电源需求时,可以被频繁地、低延迟地调整,从而实现更精细、更智能的电源管理。

电源管理实际上是一个系统工程,从应用程序到内核框架,再到设备驱动和硬件设备,都要参与进来,才能达到电源管理的最优化。

硬件层:硬件设备CMOS电路的总功耗是活动功耗与静态功耗之和。

当电路工作或逻辑状态转换时会产生活动功耗——C L*V2dd*f,未发生转换时晶体管漏电流会造成静态功耗——V dd*I q。

其消耗功率如下:P=r*C L*V2dd*f+V dd*I q其中r为开关活动率(Switching Activity),C L为负载电容,V dd为电源电压,f为工作频率,I q 为漏电流。

在操作系统级的电源管理设计实现中,重点是活动功耗。

我们从中可以得出几种管理活动功耗的方法:1.电压、时钟调节。

通过降低电压和时钟来减少活动功耗和静态功耗。

2.时钟选通。

停止电路时钟,即设f为0,将时钟从不用的电路模块断开,减少活动功耗。

许多CPU都有“闲置”或“停止”指令,一些处理器还可通过门控关闭非CPU时钟模块,如高速缓存、DMA外设等。

3.电源供应选通。

断开电路中不使用的模块电源供应。

这种方法需要考虑重新恢复该模块的代价。

断开不使用的模块的时钟和电源供应可以减少电源消耗,但要能够正确预测硬件模块的空闲时期。

因为重新使能硬件模块时钟和电源会造成一定延迟,不正确的预测将导致性能下降。

从上分析可以知道降低电压对功耗的贡献是2次方的;降低时钟也可降低功耗,但它同时也降低性能,延长同一任务的执行时间。

所以,选择满足性能所需的最低时钟频率,在时钟频率和各种系统部件运行电压要求范围内,设定最低的电源电压,将会大量减少系统功耗。

通过调节电压、频率来减少系统活动功耗的动态电源管理需要硬件支持。

SoC系统一般有多个执行单元,如PM(电源管理)模块、OSC(片上晶振)模块、PLL(锁相环)模块、CPU核以及CPU核中的数据缓存和指令缓存,其他模块统称为外围模块(例如LCD控制器、UART、SDRAM控制器等)。

CPU 高频时钟主要由PLL提供,同时PLL也为外围模块和SoC总线提供其他频率时钟。

一般SoC系统都有一些分频器和乘法器可以控制这些时钟。

PM模块主要是管理系统的电源供应状态。

一般有自己的低频、高准确度晶振,用以维持一个RTC时钟、RTC定时器和中断控制单元。

其中中断控制单元使RTC定时器和外部设备能够唤醒挂起的SoC系统,数字相控锁环(DPLL)将外频或晶振输入转化为高频,供给CPU核以及其他片上设备。

操作DPLL控制寄存器就可以设置DPLL输出时钟,控制MPU和DSP、MMU单元的运行频率,MPU、DSP外设时钟,以及LCD刷新时钟。

内核层:Linux架构下实现电源管理内核模块需要实现一个应用层和操作系统的接口,一个为多个硬件平台提供通用电源管理逻辑控制框架的硬件无关层,以及一个管理特定硬件电源控制接口的平台相关电源控制层。

其代码路径文件在:/kernel/power/main.c/kernel/power/earlysuspend.c/kernel/power/wakelock.c/kernel/power/ fbearlysuspend.c/kernel/power/ consoleearlysuspend.crequest_suspend_state()函数是android 相对标准linux内核改动的地方,它实现在earlysuspend.c中。

在标准linux内核中,用户通过sys写入“mem”和“standby”时,会直接调用enter_state()进入suspend模式,但在android中则会调用request_suspend_state()函数进入early suspend状态。

该机制作用在关闭显示的时候,一些和显示有关的设备,比如LCD背光,重力感应器,触摸屏,这些设备都应该关掉, 但是系统可能还是在运行状态(这时候还有wake lock)进行任务的处理,例如在扫描SD卡上的文件,后台音乐/FM播放,文件传输/下载等。

在嵌入式设备中, 背光是一个很大的电源消耗,所以android加入这样一种机制。

接着分析内核代码具体实现流程,对于需要注册结构early_suspend的handler通过函数register_early_suspend注册,注册时将具体的结构early_suspend挂载在early_suspend_handlers链表上。

何时调用挂载在该链表上的handler呢?具体何时调用由内核调用机制决定,其内核调用流程如①式中的函数request_suspend_state所示,该函数会通过工作队列的推后执行机制调用,其中work结构early_suspend_work或late_resume_work挂载在工作队列suspend_work_queue上,推后执行的具体函数就是early_suspend或late_resume了。

在这2个函数中,就是从链表early_suspend_handlers上取下先前在函数register_early_suspend 中注册的结构early_suspend的handler。

注意其顺序,early_suspend中是从链表头开始取,与其相反的late_resume是从链表尾开始一个个的取,这个好理解。

其中的工作队列suspend_work_queue 是在wakelock.c中创建的。

md_init()--->md_probe()--->md_alloc()--->md_fops--->md_ioctl()--->add_new_disk()---> md_import_device()--->rdev_ktype--->rdev_default_attrs[]--->rdev_state--->state_store()--->request_suspend_state()--->early_suspend()、late_resume()--->early_suspend_handlers <---register_early_suspend()…①那么内核里面为什么要通过register_early_suspend这种复杂机制来进行动态电源的管理,而不是在驱动中对设备直接设置相应的状态?比如在开始要用时就打开设备,用完了就关掉设备。

这是因为电源管理的实时性毕竟不需要那么的高,不像触摸屏采样数据那样,点击下去就立即得有采样数据出来。

工作队列就是用来延迟时间不敏感的任务,以便更迅速处理那些高频率诸如中断事件,这样能够带来性能的优化。

其由内核工作线程events/X (每CPU 一个,X=1,2,3,4)来管理,内核线程就从工作队列(这里即是suspend_work_queue)中抽取任务并激活一个bottom-half 处理程序,这里就是上面的那个early_suspend()或late_resume()函数。

驱动层:在驱动中对early suspend要做的就相对较简单,固定模式,仅仅是调用上面讨论的接口函数register_early_suspend去挂载自己的handler到链表early_suspend_handlers上,然后主要任务就是根据电源管理芯片的SPEC去实自己的handler结构的suspend、resume成员函数,以便在函数early_suspend和late_resume中回调回来有具体函数可以调用。

驱动中的fbearlysuspend.c 和consoleearlysuspend.c 这两个文件实现了针对lcd framebuffer 的earlysuspend 和console 的earlysuspend 支持。

实际上这两个文件就是利用上面earlysuspend.c提供的接口注册了针对framebuffer 和console的early suspend handler,并提供相应的handler函数。

另外在MTK的驱动中诸如重力传感器、光感、距离传感器、键盘、触摸屏、LCD以及GPIO事件等等都用到了这种early suspend的机制。

Framework层:PowerManager.java提供给应用层调用,最终核心在PowerManagerService.java,其提供PowerManager的功能,以及整个电源管理状态机的运行。

WindowManagerService会把用户的操作作为user Activity事件来调用userActivity函数,PowerManagerService就会在user Activity 里面判断事件类型作出相应的反应。

核心PowerManagerService.java,Power.java提供底层的函数接口,与JNI层进行交互,JNI层的代码主要在文件android_os_Power.cpp中,与Linux kernel交互是通过Power.c来实现的,Android跟kernel的交互主要是通过sys文件的方式来实现的。

当用户通过sysfs写入mem 或者standby到/sys/power/state中的时候, state_store()会被调用,然后Android会在这里调用request_suspend_state() 而标准的Linux会在这里进入enter_state()这个函数。

如果请求的是休眠, 那么early_suspend这个workqueue[queue_work()]就会被调用,并且进入early_suspend状态。

APP层:上层应用暂时没分析,简要列出找到的相关的资料。

Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。

1,earlysuspend是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如LCD可以降低亮度或灭掉;2,suspend是指除电源管理以外的其他外围模块以及cpu均不工作,只有内存保持自刷新的状态; 3,hibernation是指所有内存镜像都被写入Flash中,然后系统关机,恢复后系统将能恢复到“关机”之前的状态.PAPER_DESCRIPTION("Linux Android PMU ARCH");PAPER _AUTHOR("yuanjianhua < yuanjianhua @>");PAPER _LICENSE("GPL");。

相关文档
最新文档