基于linux内核驱动的Android电源管理浅谈-_第1页
基于linux内核驱动的Android电源管理浅谈-_第2页
基于linux内核驱动的Android电源管理浅谈-_第3页
基于linux内核驱动的Android电源管理浅谈-_第4页
基于linux内核驱动的Android电源管理浅谈-_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如何有效地管理嵌入式系统,尤其是移动终端的电源功耗,通过降低设备电压、频率,可以减少能量的消耗,达到省电的目的,电源管理历来为重要的研究课题之一。动态电源管理DPM(Dynamic Power Management技术提供一种操作系统级别的电源管理能力,包含CPU工作频率和电压,外部总线时钟频率,外部设备时钟、电源等方面的动态调节、管理功能。通过用户层制定策略与内核提供管理功能交互,实时调整电源参数而同时满足系统实时应用的需求,允许电源管理参数在短时间的空闲或任务运行在低电源需求时,可以被频繁地、低延迟地调整,从而实现更精细、更智能的电源管理。电源管理实际上是一个系统工程,从应用程序到内核框架

2、,再到设备驱动和硬件设备,都要参与进来,才能达到电源管理的最优化。硬件层:硬件设备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.时钟

3、选通。停止电路时钟,即设f为0,将时钟从不用的电路模块断开,减少活动功耗。许多CPU都有“闲置”或“停止”指令,一些处理器还可通过门控关闭非CPU时钟模块,如高速缓存、DMA外设等。3.电源供应选通。断开电路中不使用的模块电源供应。这种方法需要考虑重新恢复该模块的代价。断开不使用的模块的时钟和电源供应可以减少电源消耗,但要能够正确预测硬件模块的空闲时期。因为重新使能硬件模块时钟和电源会造成一定延迟,不正确的预测将导致性能下降。从上分析可以知道降低电压对功耗的贡献是2次方的;降低时钟也可降低功耗,但它同时也降低性能,延长同一任务的执行时间。所以,选择满足性能所需的最低时钟频率,在时钟频率和各种系

4、统部件运行电压要求范围内,设定最低的电源电压,将会大量减少系统功耗。通过调节电压、频率来减少系统活动功耗的动态电源管理需要硬件支持。SoC系统一般有多个执行单元,如PM(电源管理模块、OSC(片上晶振模块、PLL(锁相环模块、CPU核以及CPU核中的数据缓存和指令缓存,其他模块统称为外围模块(例如LCD控制器、UART、SDRAM控制器等。CPU 高频时钟主要由PLL提供,同时PLL也为外围模块和SoC总线提供其他频率时钟。一般SoC系统都有一些分频器和乘法器可以控制这些时钟。PM模块主要是管理系统的电源供应状态。一般有自己的低频、高准确度晶振,用以维持一个RTC时钟、RTC定时器和中断控制单

5、元。其中中断控制单元使RTC定时器和外部设备能够唤醒挂起的SoC系统,数字相控锁环(DPLL将外频或晶振输入转化为高频,供给CPU核以及其他片上设备。操作DPLL控制寄存器就可以设置DPLL输出时钟,控制MPU和DSP、MMU单元的运行频率,MPU、DSP外设时钟,以及LCD刷新时钟。内核层:Linux架构下实现电源管理内核模块需要实现一个应用层和操作系统的接口,一个为多个硬件平台提供通用电源管理逻辑控制框架的硬件无关层,以及一个管理特定硬件电源控制接口的平台相关电源控制层。其代码路径文件在:/kernel/power/main.c/kernel/power/earlysuspend.c/ke

6、rnel/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状态。该机制作用在关闭显示的时候,一些和显示

7、有关的设备,比如LCD背光,重力感应器,触摸屏,这些设备都应该关掉, 但是系统可能还是在运行状态(这时候还有wake lock进行任务的处理,例如在扫描SD卡上的文件,后台音乐/FM播放,文件传输/下载等。在嵌入式设备中, 背光是一个很大的电源消耗,所以android加入这样一种机制。接着分析内核代码具体实现流程,对于需要注册结构early_suspend的handler通过函数register_early_suspend注册,注册时将具体的结构early_suspend挂载在early_suspend_handlers链表上。何时调用挂载在该链表上的handler呢?具体何时调用由内核调用机

8、制决定,其内核调用流程如式中的函数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中是从链表头开始取,与其相反的lat

9、e_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_resum

10、e(->early_suspend_handlers <-register_early_suspend(那么内核里面为什么要通过register_early_suspend这种复杂机制来进行动态电源的管理,而不是在驱动中对设备直接设置相应的状态?比如在开始要用时就打开设备,用完了就关掉设备。这是因为电源管理的实时性毕竟不需要那么的高,不像触摸屏采样数据那样,点击下去就立即得有采样数据出来。工作队列就是用来延迟时间不敏感的任务,以便更迅速处理那些高频率诸如中断事件,这样能够带来性能的优化。其由内核工作线程events/X (每CPU 一个,X=1,2,3,4来管理,内核线程就从工作队

11、列(这里即是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中回调回来有具体函数可以

12、调用。驱动中的fbearlysuspend.c 和consoleearlysuspend.c 这两个文件实现了针对lcd framebuffer 的earlysuspend 和console 的earlysuspend 支持。实际上这两个文件就是利用上面earlysuspend.c提供的接口注册了针对framebuffer 和console的early suspend handler,并提供相应的handler函数。另外在MTK的驱动中诸如重力传感器、光感、距离传感器、键盘、触摸屏、LCD以及GPIO事件等等都用到了这种early suspend的机制。Framework层:PowerMana

13、ger.java提供给应用层调用,最终核心在PowerManagerService.java,其提供PowerManager的功能,以及整个电源管理状态机的运行。WindowManagerService会把用户的操作作为user Activity事件来调用userActivity函数,PowerManagerService就会在user Activity 里面判断事件类型作出相应的反应。核心PowerManagerService.java,Power.java提供底层的函数接口,与JNI层进行交互,JNI层的代码主要在文件android_os_Power.cpp中,与Linux kernel交

14、互是通过Power.c来实现的, Android跟kernel的交互主要是通过sys文件的方式来实现的。当用户通过sysfs写入mem 或者standby到/sys/power/state中的时候, state_store(会被调用,然后Android会在这里调用request_suspend_state( 而标准的Linux会在这里进入enter_state(这个函数。如果请求的是休眠, 那么early_suspend这个workqueuequeue_work(就会被调用,并且进入early_suspend状态。APP层:上层应用暂时没分析,简要列出找到的相关的资料。Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。1,earlysuspend是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如LCD可以降低亮度或灭掉;2,suspend是指除电源管理以外的其他外

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论