基于linux内核驱动的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的源代码里,大部分都属于设备驱动程序的代码,因此,大多数电源管理(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系统电源管理流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!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开发总结本⽂作为⼀个提纲挈领的介绍性⽂档,后⾯会以此展开,逐渐丰富。
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电源管理详解作者:田冰超来源:《硅谷》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的⾃由及开放源代码的操作系统,主要使⽤于移动设备,如智能⼿机和平板电脑,由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的电源管理芯片驱动设计

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
S
‘ 、
.
源 转 换 输 出 的应 用 ,提 供 简 单 易 用 而 又 可 以灵 活 配 置 的完 整 电源 解 决 方 案 , 充 分 满 足 目前 日益 复 杂 的 应 用 处 理器 系 统 对 于 电源 相 对 复 杂 而 精 确 控 制 的要 求 。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设备树(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,动态电压频率调整)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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");。