linux电源管理非常复杂,牵扯到系统级的待机,频率电压变换,系统空闲时的处理以及每个设备驱动对系统待机的支持和每个设备的运行时电源管理。
电源管理的整体框架,大体归纳为以下几类:
1.CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq。
2.CPU在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle。
3.多核系统下的CPU的热插拔支持。
4.系统和设备针对延迟的特别需求而提出申请的PM Qos,它会作用于CPUIdle的具体策略。
5.设备驱动针对系统挂起到RAM/硬盘的一系列入口函数。
6.Soc进入挂起状态,SDRAM自刷新的入口。
7.设备的运行时动态电源管理,根据使用情况动态开关设备。
8.底层的时钟,稳压器,频率/电压表(OPP模块完成)支撑。
CPUFreq驱动
CPUFreq子系统位于drivers/cpufreq目录下,负责进行运行过程中CPU频率和电压的动态调整,即DVFS。CPUFreq的核心层位于drivers/cpufreq/cpufreq.c下,它为各个Soc的CPUFreq驱动的实现提供了一套统一的接口,并实现了一套notifier机制,可以在CPUFreq的策略和频率改变的时候向其他模块发出通知。
用户空间一般可通过/sys/device/system/cpu/cpux/cpufreq节点来设置CPUFreq。
CPUIdle驱动
目前的ARM Soc大多支持几个不同的Idle级别。CPUIdle驱动子系统存在的目的就是对这些Idle状态进行管理,并根据系统的运行情况进入不同的Idle级别。具体Soc的底层CPUIdle驱动实现则提供一个类似于CPUFreq驱动频率表的Idle级别表,并实现各种不同Idle状态的进入和退出流程。
Regulator驱动
Regulator是linux系统中电源管理的基础设施之一,用于稳压电源的管理,是各种驱动子系统中设置电源的标准接口。CPUFreq驱动就经常使用它来设定电压。
Regulaotr可以管理系统中的供电单元,即稳压器LDO,并提供获取和设置这些供电单元电压的接口。一般在ARM电路板上,各个稳压器和设备会形成一个Regulator树形结构。
CPU热插拔
一般来讲,在用空间可以通过/sys/devices/system/cpu/cpun/online节点来操作一个CPU的在线和离线。
挂起到RAM
linux支持standby,挂起到ram,挂起到硬盘等形式的待机。
一般的嵌入式产品仅仅只实现了挂起到RAM,即将系统的状态保存于内存中,并将SDRAM至于自刷新状态,待用户按键等操作后再重新恢复系统。
linux下,这些行为通常是由用户空间触发的,通过向/sys/power/state写入mem可开始挂起到RAM的流程。
运行时的PM
dev_pm_ops结构中,有3个runtime开头的成员函数:runtime_suspend(),runtime_resume(),和runtime_idle(),它们辅助完成运行时的电源管理。
阅读(435) | 评论(0) | 转发(0) |