电源管理是SoC中比较重要的一个部分特别是在bringup阶段芯片的供电、复位、时钟等如果配置不对系统就会启动失败并且在流片失败的例子中电源管理会占一大部分如果出问题对系统是致命的。在AI SoC中耗电量最大的就是NPU需要针对其使用独立的电源芯片供电保障稳定性。另外对于执行AI功能的芯片对功耗要求较高特别的费电电力成本甚至比芯片贵很多。PMUPower Management Unit有两种实现方法一种就是传统的基础在A核附属的一个硬件模块**另外一种就是独立核和固件的SCP在大规模AI SoC中一般采用的是独立固件**的控制。其区别如下表所示独立固件的实现就是SCP之前关于SCP介绍过几篇文章ARM SCP入门-简介和代码下载编译ARM SCP入门-framework框架代码分析ARM SCP入门-AP与SCP通信本文进行一些汇总并从芯片设计角度继续阐述下一下设计要点。1. PMU介绍1.1 PMU概念PMU电源管理芯片是一种高度集成化的电源管理方案它集成多路的LDO和DC-DC以及相应的检测和控制电路其核心结构通常是PWM控制器和MOSFET。高集成度的PMU器件可以有效减小电路板占用面积和器件数量因此特别适合应用在便携电子产品中。而且随着PMU对电源组控制的细分程度越高PMU对系统各模块的供电控制更加精准能够有效地降低电路系统的整体功耗。在现代的SoC中更是集成了PMU。其组成如下Buck结构DC-DC电源降压型稳压器LDO低压差线性稳压电源控制电路和过压、欠压、过温等有额外的保护电路电流检测和电池管理电路所需要的电阻、小容量电容、电感等。PMU能有效担负起电子设备所需的电能变换、分配、检测等管理功能是电子设备中的关键器件其性能优劣对电子产品的性能和可靠性有着直接影响。一个有效的电源管理系统可以延长电池寿命、提高设备效率并确保设备在各种复杂工作条件下都能够保持稳定可靠运行。1.2 LDO及DC-DCLDO线性降压电路通过电阻分压实现降压工作过程中会将降下的电压转化为热量因此当输入输出压差和负载电流越大芯片发热会越明显造成较大的能量损耗。目前高性能LDO通常采用电压驱动型P沟道MOSFET作为调整管不仅可以将静态电流能做到微安级输入输出电压降也可以做到100mV水平。在大电流或输入/输出压降较大以及需要进行升压的应用场景时LDO无法满足电路要求此时就需要选择更高效率的DC-DC转换器。DC-DC转换器包括升压、降压、升/降压和反相等类型电路采用PWM数字控制方式。其优点很多包括高效率、大电流输出、低静态电流、低发热量、封装小巧等。Buck输入和输出极性相同降压型Boost升压型Buck-Boost降升压型Sepic相当于是Boost和Flyback组合转化效率高具备升降压同极性输出输入电流脉动小输出易于扩展成本高Cuk显著减小输入和输出电流脉动转化效率更高输入输出电压更灵活Zeta输入和输出极性相同可升降压应用少1.3 PMU使用及趋势PMU上电后系统进入待机状态用户触发开机键后系统首先按照开机顺序将对应的LDO、DC-DC电源打开。系统进入正常工作状态在CPU电源供应正常后输出复位信号给CPU让CPU开始启动和工作CPU会返回一个保持信号让PMU处于持续工作状态。关机时CPU会给PMU信号让PMU关闭进入关机状态。系统正常工作时CPU还可以通过I2C接口对PMU的各个子模块进行控制PMU也可以将异常事件产生中断信息反馈给系统处理。目前PMU的技术发展方向是朝着提升转换效率降低待机功耗方向持续发展。同时为了降低简化设计和降低综合成本也会继续提升PMU的集成度和应用更小巧的封装。在性能方面需要承载各种大电流负载应用提高电压调节精度满足高负载瞬态要求也不可或缺。同时为了适应各类智能化新应用场景带来的多样化需求PMU与处理器进行实时通讯灵活配置也是重要的发展趋势。举例使用RT1052芯片电源管理系统的第一个组成部分称为集成PMU集成电源管理单元。是为了简化外部电源接口而设计的。它由一组辅助电源组成可通过两个或三个主电源实现SoC操作。使用集成PMU的电源树的高级框图如图所示。电源管理单元PMU旨在简化外部电源接口。电源系统可分为输入电源及其特性集成电源变换和控制元件以及最终负载互连和要求。典型的电源系统使用PMU如下图所示。RT1052使用四个LDO稳压器这样大大减少了外部电源的数量。在纽扣电池和USB输入不算在内的情况下外部电源的数量可以减少到两个。缺少这种外部电源总数是因为所需要的存储器接口供电所需的外部电源数量该数量取决于所选的外部存储器的类型。如果其I/O的电压必须与上面提供的不同则可能还需要其他电源来为这种I/O电源端提供电压。在PMU中可以集成硬件基本的电源模式。RT1052的电源模式主要分为两大块分别是运行和低功耗两种其中运行模式包括超载运行、满载运行、低速运行和低功耗运行低功耗模式包括系统空闲模式、低功耗空闲模式、暂停模式和SNVS模式。上电复位后RT1052处于运行状态具体要切换到什么运行模式可以通过串口来修改当前的运行模式。在低功耗的四种模式中具有电源消耗不同、唤醒时间可设置、唤醒源可选的的特性用户可以根据自己的应用需求选择最佳的低功耗模式或者运行模式。|运行模式|说明|| — | — || 超载运行(Overdrive Run) | •CPU运行速度为600 MHz过驱动电压为1.275 V.•全速总线频率•启用所有外设并以目标频率运行•所有PLL均已启用 || 满载运行(Full-Speed Run) | •CPU运行速度为528 MHz满载低电压为1.15 V. •全速总线频率 •启用所有外设并以目标频率运行 •所有PLL均已启用 || 低速运行(Low-Speed Run) | •CPU运行频率为132 MHz电压降至1.15 V. •半速内部总线频率 •某些PLL断电 •20外设处于活动状态其他外设处于低功耗模式 || 低功耗运行(Low-Power Run) | •CPU以24 MHz运行较低电压为0.95 V. •内部总线频率为12 MHz •所有PLL均断电OSC24M断电RCOSC24使能 •高速外围设备断电 |参考https://doc.embedfire.com/mcu/i.mxrt/i.mxrt1052/zh/latest/doc/chapter38/chapter38.html1.4 底板PMIC芯片PMICPower Management Integrated Circuit芯片是一种集成电路主要用于电源管理和功耗管理。它在电子设备中起着关键的作用。PMIC芯片在电子设备中的作用是管理电源供电、监测和控制电池充电状态和电量、管理温度并执行一些系统控制功能以确保设备的稳定运行和有效管理功耗。电源管理通过一定的电路拓扑将不同的电源输入转换成满足系统工作需要的输出电压。PMIC跟PMU功能基本一致很容易混淆使用时有侧重点。SoC内部的是PMU跟CPU总线通信SoC外部的是PMIC跟CPU用I2C/SPI等通信便携设备内部的是PMU给便携设备外部供电的电源是PMIC对于外部和内部电源管理的功能那些放外部那些放内部可以通过设计来规划你强我弱的关系其实放哪里都可以只是有侧重点。外部侧重供电基础电压供给内部侧重管理。这里我们介绍的AI SoC是一个芯片其要放在一个底板上那底板就有PMIC芯片负责供电、clock等。底板如果是开发板一般是220V家用电的一个变压器或者像电脑一样的一个交流转直流带风扇的电源进行供电这里只涉及电压。关于底板上电源电路的一些注意点底板上的电源芯片主要是DCDC和LDO提供电源需要规定好给芯片供电的上电和下电顺序。底板上的OCS有源晶振芯片提供时钟给芯片然后芯片内部PLL再进行频率细调对应芯片的功耗测量也需要电压电量的监控芯片以及电流采用板。底板上会有按钮控制整体的供电及复位参考https://www.sohu.com/a/770027860_1210977352. 芯片内部PMU之前也提到芯片内部PMU的实现有分为是否有独立固件两种形式但是其功能基本是一致的。如果没有固件在ATF里面集成PMU驱动去控制Linux中通过smc陷入到ATF里面进行处理就可以如果有固件那么就使用ARM的SCPLinux直接通过scmi协议跟SCP进行通信2.1 无固件PMU这里以地平线J5 PMU为例进行一些说明。首先PMU从供电来说位于AONAlways on Domain电源常开。主要用于上下电顺序、芯片引导、子系统电源开关控制、电源模式转换休眠唤醒等。还可以控制测试模拟、功率测试等。对于PMU的设计首先要划分电压域和电源域。PD就是一个电源域其中包括时钟、复位、隔离控制信号、电源开关和供电都是由PMU控制。VD就是电压域几个PD可以共享一个VD。PMU的主要功能控制PLL上下电控制外部振荡器上下电控制电源域的根时钟门控避免PLL在通电期间的高频传播IO电源管理控制设备进入超深睡眠时候保留IO控制IO唤醒能力每个电源域的电源管理包括时钟对齐上下电的时候的时钟管理和顺序隔离电源域的启用/禁用序列LBIST自检的隔离控制和时钟控制电源域内的电源开关链顺序内存修复控制电源域上下电重置控制A55CPU电源管理包括CPU核心电源模式的转换如ON、OFF、OFF_EMU、DB_RECOV等集群电源模式转换如FULL_ON 和OFF整个CPU子系统断电并中断唤醒芯片正常和深度睡眠的进入和退出芯片超深睡眠的退出分级依赖功率域的安全功率控制机制控制Noc电源接口虚拟电源关闭关于电源控制电源域的断开和连接PMU中针对各个power domain都会有独立的一个或者多个LPC用于控制各个Power Domain而每个Power Domain内部都会包含一个或者多个与LPC对应的Power Controller用于接收 LPC的控制命令对内部的NIU、NOC、NSP单元进行控制各个Power Domain与PMU是通过P-Channel进行连接的。一个模块化的通用桥接电源接口如上图所示。举个下电的例子IdleReq 0-1.向启动器niu传播请求。IdleAck0-1表示成功分发到启动器niu。在启动器中SlvRdy 1-0。插座箱1-在所有转会完成后的0。启动器向电源控制器报告空闲状态0-1。向目标niu传播空闲请求。在目标上在所有转移完成后的插座1-0独立于SlvRdy。目标目标向电源控制器报告。电源控制器报告怠速0-1已完成。关于系统电源状态Run就是运行态IDLE没有线程运行。CPU进入WFI等待中断。外设都还保持活动。Normal deep sleepCPU和所有PLL关闭。高速外设进入门控低速外设以低频率运行DRAM进入自刷新子系统断电。Ultra deep sleep除VDD_AON外都断电。RTC/PMU/STCU/EFUSE/OSC_TRIM/WAKEUPIO可以工作。关于上下电流程上电流程BIGAON-PERISYS-CPUSYS-SRAMSYS-DDRSYS0/1-BPUSYS0/1-CVSYS-VideoSYS and CAMSYS下电流程与上电流程相反其中PERISYS有所不同VideoSYS and CAMSYS -CVSYS -BPUSYS0/1-PERISYS-DDRSYS0/1-SRAMSYS-CPUSYS-BIGAON关于DDR休眠唤醒休眠的时候DDR中的数据需要保持所以处于供电进入自刷新状态。确保没有DDR数据访问DDR连接的brideg进入idleDDR PHY进入保留模式DDR进行入自刷新使能DDR隔离使能软复位禁止时钟 唤醒的时候打开相关电源域电压运行DDR LBIST解复位DDR使能时钟禁止隔离DDR状态退出休眠brideg进入正常访问模式**关于测试**出于安全考虑在电源域打开的时候需要运行LBIST和MBIST。STCU触发PD_BIGAON, PD_PERI,PD_CPUTOP,PD_CPU_C0CPU A55触发其他的功率域和LBISTMBIST测试。基于软件的LBISTMBIST测试必须在虚拟断电模式下运行。数据流图如下CPU A55从系统闪存中加载模式并把模式和命令写入电源域。电源域反馈数据到CPU A55让其对比。2.2 有固件PMU2.2.1 ARM PCSA规范这里的实现可以用ARM的PCSA规范来说明。什么是PCSA随着SOC的复杂性增加例如多种异构核上又运行了不同的OS不同的子系统间例如Linux、ISP、NPU、FSI、eSecure等相互独立为了满足功耗的控制管理这些子系统间需要进行协调难度增大。为了更好的功耗管理需要从系统中其他的控制器和应用处理器中抽象出来各种电源或其他系统管理任务进行集中管理利用一个独立的控制器核心实现。因此ARM提出了功耗控制系统架构power control system architecture简称PCSA用来规范芯片功耗控制的逻辑实现。注PCSA参考ARM规范文档《DEN0050D_Power_Control_System_Architecture.pdf》可以去ARM官网下载。PCSA描述了一种使用标准基础设施组件、低功耗接口和相关方法进行功率控制集成的方法。PCSA基于ARM的组件实现规范包括电压、电源和时钟的划分电源的状态和模式ARM电源控制框架和集成规范ARM特定组件的电源和时钟集成带有低功耗Q-channel和P-channel接口的IP。什么是ARM主推的SCPPCSA 定义了系统控制处理器 (SCP) 的概念一般是一个硬件模块例如cortex-M0微处理器再加上一些外围逻辑电路做成的功耗控制单元。SCP用于从应用程序处理器中抽象出电源和系统管理任务配合操作系统的功耗管理软件或驱动来完成顶层的功耗控制。AP软件是SCP服务的请求者。系统中的其他Agent也可以请求SCP的服务。代理例如一个modem子系统或者其他的硬件模块。SCP基于处理器有自己的固件控制自己的一组硬件资源例如本地私有内存、计时器、中断控制以及系统配置、控制和状态的寄存器。最底层是SCP控制的硬件资源例如时钟源、电源域门控、电压电压和传感器等SCP****提供的服务系统初始化SCP负责通电复位系统初始化任务从主系统和AP核心电源域的通电顺序到AP启动。OSPM定向操作SCP在OSPM指导下执行电压供应变化、电源控制操作和时钟源管理。这些服务也可以被其他请求的Agent使用。对系统事件的响应计时器事件SCP有本地计时器资源可用于触发系统唤醒和任何周期性动作如监控。唤醒事件响应唤醒请求包括由路由到断电核心的中断引起的GIC唤醒请求以及来自其他代理的系统访问请求。调试访问电源控制响应来自调试访问端口的请求和相关控件的请求包括调试基础设施的电源管理。看门狗事件和系统恢复操作在本地看门狗超时时SCP可以执行一个重置和重新初始化序列。系统感知功能SCP可以协调来自OSPM和其他代理对共享资源的请求。例如它可以控制到主存的路径或进入SoC睡眠模式和退出而不需要AP核心活动。SCP可负责监测传感器和测量功能。监控任务可能包括过程和温度传感器的数据收集和相关的操作如操作点优化和报警条件。SCP在操作点选择中的作用可以扩展到必要时覆盖OSPM方向以确保系统的电气和热保护。SCP的硬件实现举例PPU的实现电压域划分举例2.2.2 imx8q实现有固件的实现这里以imx8q为例。除了处理器组件外Cortex-M4子系统还具有几个平台外组件。这些平台外组件和子系统功能包括WDOG看门狗定时器LPI****T低功率定期中断定时器定期定时器服务定时器PWM模块和PWM服务LPCG低功耗时钟门控本地时钟管理ASMC辅助系统模式控制辅助系统模式控制TSTMR定时器全球定时器服务接收系统时间总线系统计数器驱动的计数器电源模式控制编程模型电源模式请求低功率总线连接到SC来支持电源模式转换重置控制和状态MU消息传递单元跨处理器通信的两个实例 MU0在GP CM4域MU1内有1个通道在DSC内。后者将通过异步总线进行通信。此MU专用于CM4子系统。LPI2C低功耗I2C串行通信标准功能从模式逻辑启用TX FIFO大小4条目的RX FIFO大小4条目LPUART低功耗UART串行通信和调试标准功能与MODEM/IrDATXFIFO大小32条目RX FIFO大小32条目RGPIO快速通用输入/输出快速销I/O能力双访问-本地访问和远程访问能力。本地访问Cortex M4本地到子系统远程子系统设备中的任何其他处理器。INTMUX中断Mux来选择在子系统SEMA42硬件信号量之外路由的本地中断以便将HMP同步到共享资源电源模式clockRESET唤醒源内存访问3. 软件部分这部分就是之前关于SCP的一系列文章这里摘抄出来一些3.1 ARM SCP入门-简介和代码下载编译SoC诞生后一个问题愈发的严重就像“一个和尚挑水吃两个和尚抬水吃三个和尚没水吃”模块多了就会有资源的争夺。CPU上的OS软件之前一直是皇帝般的存在硬件之上都自己掌控现在不同了出现了藩王像GPU各种人工智能专属的NPU地平线自己还命名了一个BPU总之各种PU一堆CPU还是皇帝但是其他PU拥有自己独立的硬件和OS就像藩王有点不受控啊。争夺最厉害的就是电源这可是大奶妈然后就是存储、时钟、传感器等。这时候CPU皇帝很头大了需要搬出来太上皇了就是我们本篇介绍的SCPsystem controlprocessor。那么CPU可以代理太上皇吗答案是不能有的情况下比如休眠关机CPU都得关了但是还有的NPU还在运行CPU还没那个资格统领全局。上面图里面根据网络小说的名字看来作者知道太上皇才是权利巅峰从而意淫夺舍夺舍在计算机里面算是黑客入侵控制了但是SoC里面这个太上皇可不好夺舍是极度安全的幕后人物拥有自己的全套基础设施而又让你甚至感觉不到他的存在。但是当你一直沿着软件OS-》ATF往下分析发现还有这个幕后黑手SCP。可以在ARM官网下载PCSA规范文档https://developer.arm.com/documentation/den0050/d/?langen官方开源代码路径https://github.com/ARM-software/SCP-firmware代码下载gitclone https://github.com/ARM-software/SCP-firmware.gitgit submodule update--init实时功能runtime servicesPower domain management电源域管理System power management系统电源管理涉及开关机Performance domain management (Dynamic voltage and frequency scaling)性能管理这个主要就是ddr的调频了调频对应电压。Clock management时钟管理Linux中也有这里只提供重要的时钟管理Sensor management传感器管理Reset domain management域重置管理Voltage domain management电压域管理系统相关功能system services系统初始化启用应用核心引导系统控制和管理接口(SCMI平台端)支持GNU Arm嵌入式和Arm Compiler 6工具链支持具有多个控制处理器的平台3.2 ARM SCP入门-framework框架代码分析SCP的每个功能都实现为一个单独的modulemodule间耦合性尽量低确保安全特性通常固件所需的整体功能应来自模块之间的交互。module间隔离就像上图中的狗咬架一旦伸手产生交互就祸福不能预测了所以加上栏杆规定好那些module间可以交互伸手这都是通过API函数实现的在系统初始化的时候设定死下面模块间绑定章节会讲到。SCP中的module分为两部分在代码根目录module文件夹下共77个公共模块另外每个产品下面还有module小100个可真不少。软件分层bind3.3 ARM SCP入门-AP与SCP通信电源管理相关软件协议栈当Linux想要关机或者休眠的时候这涉及到整个系统电源状态的变化为了安全性Linux内核没有权利去直接执行了需要陷入到EL3等级去执行可以参考之前文章ARM ATF入门-安全固件软件介绍和代码运行在EL3中处理的程序是BL31把SMC系统调用的参数转化为PSCI协议去执行这时如果有SCP那A核就憋屈了自己没权利执行需要通过SCMI协议上报给SCP了。这就是整个过程的软件协议栈如上图中用户层首先用户发起的一些操作通过用户空间的各service处理会经过内核提供的sysfs操作cpu hotplug、device pm、EAS、IPA等。内核层在linux内核中EASenergy aware scheduling通过感知到当前的负载及相应的功耗经过cpu idle、cpu dvfs及调度选择idle等级、cpu频率及大核或者小核上运行。IPAintrlligent power allocation经过与EAS的交互做热相关的管理。ATF层Linux kernel中发起的操作会经过电源状态协调接口Power State Coordination Interface简称PSCI由操作系统无关的frameworkARM Trusted Firmware简称ATF做相关的处理后通过系统控制与管理接口System Control and Management Interface简称SCMI向系统控制处理器system control processor简称SCP发起低功耗操作。SCP****层SCP系统控制处理器system control processor最终会控制芯片上的sensor、clock、power domain、及板级的pmic做低功耗相关的处理。**总结**用户进程 --sysfs– 内核EAS、IPA–PSCI– ATF --SCMI–SCP --LPI– 功耗输出器件SCMI协议*设计时一些要点电源域和电压域划分电源轨及上下电时序明确电源模式根据需求确定并明确某种模式那些关闭和打开及模式转换条件图确定好PMU跟其他子系统的Mailbox通信通路中断、GPIO等的资源分配安全世界内存和寄存器的访问如果M核32bit访问64bit地址的需要转换SRAM和共享内存的分配使用PPU负责电源域的管理需要根据power domain确定好使用多少个及连线决定电源模式的灵活性clock、reset控制全SoC的方法梳理及是否一些分散在各个子系统内部一般全局的放SCP使用reset的时候需要对子系统的总线进行清空特别是NoC总线CRU和PLL的分配对于比较重要的子系统例如FSI需要有独立的CRU对于DDR也需要独立的CRU。CRU内部需要有若干个PLL提供频率并提供clock gating功能。时钟树和复位树的梳理并制定对应的寄存器控制IST及STL测试程序的集成对于供电NPU耗电多且要求文档需要独立的外部电压芯片提供电压电流AON区域也需要独立的供电另外DDR也耗电多。测试功耗需要去供电电源芯片里面拿到电压电流或者SoC内部的PVT里可以监测电压温度等信息。后记又是一篇概念很大的文章其中一段话就能独立展开写一篇。感兴趣的可以留言可以独立展开一篇。“啥都懂一点啥都不精通干啥都能干干啥啥不是专业入门劝退堪称程序员杂家”。欢迎各位有自己公众号的留言申请转载纯干货持续更新欢迎分享给朋友、点赞、收藏、在看、划线和评论交流公众号“那路谈OS与SoC嵌入式软件”欢迎关注个人文章汇总https://thatway1989.github.io