单独对于一款芯片,无论是哪家厂商,低功耗设计都要分为电路设计和系统软件设计两部分。本书不涉及电路级的设计(可单独参考《低功耗设计详解》这本书),仅做系统软件的设计与实现。在系统软件设计中,如果系统比较复杂,则需要一个低功耗主控核来负责对各个子系统进行低功耗的控制。功耗控制分层结构如图1-2所示。
如图1-2所示,自底向上,每个上级系统负责对其子系统进行上下电控制,因为任何一个子系统都没有办法自己对自己进行上下电。比如低功耗主控核(通常为LPMCU),负责其控制芯片平台上的所有其他子系统的上下电控制(比如应用处理器、基带处理器、HIFI等),而每个二级子系统又负责其自身的三级子系统的上下电控制。
对于每一个子系统,通用的低功耗软件栈如图1-3所示(参考Linux软件栈),低功耗相关框架实现主要集中在操作系统(OS)层。
图1-2 功耗控制分层结构
图1-3 通用的低功耗软件栈
其中各个模块的功能如下。
❏wakeup source:该模块为系统中其他模块或应用提供睡眠锁功能,当允许系统睡眠时,释放自己持有的睡眠锁,否则保持持有。
❏autosleep:系统进入睡眠的入口,当系统没有任何组件持有睡眠锁时,会触发autosleep的工作队列进入睡眠流程中。
❏PM Core:系统睡眠主流程,负责对低功耗各个组成模块的调用,并最终使系统进入睡眠状态,唤醒流程为睡眠流程的逆流程,都在PM Core中实现。
❏PM notifier:低功耗模块基于notifier封装的通知链,用于通知对suspend/resume(睡眠/唤醒)流程敏感的模块,但模块需要注册到PM notifier中才能被通知到。
❏DPM:设备电源管理(Device Power Management),即内核提供给各个设备注册低功耗处理的机制,睡眠和唤醒流程都有4个优先级的回调函数供设备注册,供PM Core在睡眠和唤醒流程中调用。
❏syscore:与DPM不同,syscore工作在锁中断的环境中,只提供一个级别的回调函数,且与设备注册DPM的机制一样,也需要在该阶段做低功耗处理的模块注册,供PM Core在睡眠和唤醒流程中调用。
❏PSCI:电源状态协调接口(Power State Coordination Interface),聚焦安全和非安全世界电源管理的交互,它提供处理电源管理请求的一些方法,包括CPU_ON、CPU_OFF等,是Linux内核中一个比较大的特性,在第16章中会做详细介绍。
❏ATF:ARM Trusted Firmware,与PSCI配合使用,支撑安全世界的低功耗操作(此功能仅为ATF功能之一),更多的介绍会在第17章中展开。
❏Runtime PM:运行时电源管理。对于某些模块或者功能,因为其隔离性比较好,比如单独供电或者单独供时钟,我们无须等到系统睡眠时关掉,在系统运行时也可以动态做关闭和打开动作,Runtime PM就为这类模块提供了一套处理机制。
❏CLK:负责对时钟的管理,支持对特定模块时钟的开关操作。
❏regulator:负责对供电的管理,支持对特定模块供电的开关操作。
❏thermal:负责对温度的控制,当对应设备的温度升高时,做相应的降压、降频、开风扇、复位等动作。
❏DVFS:动态电压频率调整(Dynamic Voltage and Frequency Scaling),动态技术是根据芯片所运行的应用程序对计算能力的不同需要,动态调节芯片的运行频率和电压(对于同一枚芯片,运行频率越高,它需要的电压越高),从而达到节能的目的。
❏AVS:自适应电压缩放(Adaptive Voltage Scaling),目的是通过调节芯片整体或者部分电源域的电源电压来降低功耗。AVS可以更精确地在一定范围内自由调节电压值。
❏Hotplug:支持对CPU的动态插拔,当系统负载比较小时,可以把功耗大的CPU动态拔除来达到节省功耗的目的,当负载超过一定阈值时可以动态地把CPU再加入系统调度中。
❏CPUIdle:当系统不满足睡眠条件,同时又无任务可调度时,系统会进入CPUIdle状态(通常最终会进入wfi状态),从而在一定程度上达到节省功耗的目的。
在后文中,我们会分别对涉及模块的设计与实现进行详细介绍。