电源/新能源
1. 电源状态介绍
进行电源管理的原则就是不能“占着茅坑不拉屎”,或者“用力过猛”。我们做一件事情的时候,生手往往使用蛮力,一会就累趴下了,老油条又不用力,光占着位置不出活,我们需要的是愿意干活的熟练工,不该用力的时候不用力,该用力的时候用大力,这样才能上工时间长,效益高。就像上面图中的电源状态名字,该偷懒的时候就偷懒磨洋工(Power Save),该甩开膀子加油干的时候就不保留(Power on),该小睡(Standly)或者大睡(Sleep)就去睡觉。 嵌入式设备运行的时候也是同样的道理,CPU等各种元器件并不是每时每刻都有活干,比如我们的手机,打游戏(超级大活)的时候就费电,网络视频电话(大活)也费电,看个电子书(小活)能省电一点,关闭屏幕放口袋(没活眯一会)里面就更省电了。
各种电源状态也是可以相互转化的,比如掏出手机,按键解锁就从节能模式到正常模式了,或者手机长时间不用就自动进入休眠模式了。上图作为一个例子,在我们自己设计的系统里面可以定义电源模式和编写转换方式。这里的电源模式有两种类型一种是系统电源状态,例如系统关机、重启休眠等,一种是每个外设的电源状态,例如网口、WiFi、I2C控制器等的关闭打开休眠等。
2. Linux 电源管理的组成
Linux内核电源管理的整体架构组成,大体可以归纳为如下几类:
CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq。
CPU在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle。
多核系统下CPU的热插拔支持。
系统和设备针对延迟的特别需求而提出申请的PM QoS,它会作用于CPUIdle的具体策略。
设备驱动针对系统挂起到RAM/硬盘的一系列入口函数。
SoC进入挂起状态、SDRAM自刷新的入口。
设备的运行时动态电源管理,根据使用情况动态开关设备。
底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用到。
下面就Linux电源管理相关的一些名词解释,你也可以用ChatGPT来寻找解释,很多时候是我们不知道搜什么,就是你不知道你自己不知道,这里告诉你搜什么。
Linux电源管理框架
对于Linux中的电源管理框架,首先就是分层和抽象,可以看到有三层:
APILayer,用于向用户空间提供接口,屏蔽底层内核和硬件具体的实现细节,这样方便上层软件的开发和维护。例如关机和重启的接口形式是系统调用,Hibernate和Suspend的接口形式是sysfs。
PMCore,是尽可能的抽象公共逻辑,并在Framework内实现,以提高重用性、减少开发量,位于kernel/power/目录下,主要处理和硬件无关的核心逻辑。
PM Driver,分为两个部分,一是体系结构无关的Driver,提供Driver框架(Framework),向下层提供一系列的回调函数(callback function),下层软件可能面对差别较大的现实,但只要填充这些回调函数,即可完成所有逻辑,减小了开发的难度。另一部分是具体的体系结构相关的Driver,这也是电源管理驱动开发需要涉及到的内容(图中红色边框的模块)。
Linux中电源管理有关的源码分别位于:
kernel/power/ * drivers/power/ drivers/base/power/* drivers/cpuidle/* drivers/cpufreq/* drivers/devfreq/* include/linux/power_supply.h include/linux/cpuidle.h include/linux/cpufreq.h include/linux/cpu_pm.h include/linux/device.h include/linux/pm.h include/linux/pm domain.h include/linux/pm runtime.h include/linux/pm wakeup.h include/linux/suspend.h Documentation/power/*.txt3. ARM SoC中PCSA与SCP
静态功耗又叫做泄漏功耗,是指电路处于等待或不激活状态时泄漏电流所产生的功耗,跟硬件相关,系统都不运行了软件就不用关系了。
动态功耗就是在系统运行时的功耗,直接看公式:
式中C 代表负载电容的容值,V 是工作电压,A 是当前频率下电路的平均翻转率,f 为工作频率,IShort 和ILeakage 分别为短路电流和漏电流。从公式中可知,C、V 、A、f 决定了整个CMOS 电路的功耗:CMOS芯片的能量消耗正比于电压的平方和时钟频率。对于硬件器件的功耗控制技术,在软硬件上万变不离其宗,基本就是通过控制电压和频率进行的。
对于电压的提供,引入电压域和电源域的概念,梳理出来相同电压需求的器件可以加入一个电压域。梳理出来一个功能模块的电压供应放到一块是一个电源域。可以使用PMIC进行供电。另外引入电源轨的概念,涉及到上下电的顺序,因为功能硬件可能有依赖,需要设计先后顺序。
对于频率和复位,可以使用PLL产生clock,用CRU对器件的频率和复位进行管理。需要设计PLL对应的时钟树,复位也需要设计某个复位信号的作用范围。复位还牵扯watchdog的软硬件喂狗失败导致的复位。
对于电源域的控制,可以使用一个独立的MCU运行SCP固件,上面放PPU对电压和频率一块控制,如上图。另一种方案:也可以使用一个PMU硬件对电源域进行管理,PMU的控制可以放到BL31的安全世界。PMU和SCP的区别就是SCP是一个OS有独立的软硬件可以有决策能力,PMU只是一个硬件执行者,一般依附于A核Linux软件进行决策。
还有一个clock gating的概念,就是把clock频率降为0,但是电压还有,从而来降低功耗,这个可以在CRU或者PPU中,某些器件不使用需要关闭降低功耗的时候不下电,只进行clock gating。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !