本文转载自: OpenFPGA微信公众号
AMD-Xilinx MPSoC 和 Versal ACAP 系列均具有复杂的内部电源结构,其中包括全功率域 (FPD) 、低功耗域 (LPD) 、单个处理器电源域、外设等节点以及存储器电源域。

这些域可以通过通、断电,优化整个解决方案的功耗。并且允许在运行时进行动态电源管理,为当前用例实现最低功耗。在 MPSoC 和 Versal 器件中,系统电源管理均由专用 MicroBlaze 处理器控制。它由 MPSoC 器件中的平台管理单元 (PMU) 和 Versal 器件中的平台管理控制器 (PMC) 执行。
PMU 在 MPSoC 的运行中扮演着多种角色。这些角色可以概括为平台管理:
电源管理角色很有趣,因为处理器中断允许 APU、RPU 或 PL MicroBlaze 等电源主设备管理电源从设备。
首先,我们需要创建 PMU 固件,该固件是在 Vitis 中的新应用程序向导中针对 PMU 处理器创建的。框图非常简单,只使用 PS即可。


如果我们需要对 PMU 固件进行更改确保调试可见性,可以使用多个标志指示。这些在Zynq UltraScale+ MPSoC 软件开发人员指南 UG1137 的第 139 页上进行了定义,并且可以作为符号添加到 PMU 固件的 C/C++ 设置中。

构建 PMU 固件后,我们需要在板支持设置中启用 XilPM 库。

在我们的应用程序 BSP 中启用该库时就允许应用程序与 PMU 及其电源管理软件进行通信。运行该软件使我们能够观察电源域和岛的状态,并根据需要关闭和打开域/岛的电源。API 调用的完整列表在UG643中的操作系统和库文档集中有详细说明。
https://docs.xilinx.com/r/en-US/oslib_rm/BSP-and-Libraries-Overview
对于这个简单的示例,创建一个应用程序,该应用程序将循环检查所有电源岛和域,并输出节点状态报告。
以下是上面使用的术语的一些定义
该应用程序查看 Zynq MPSoC 中的所有 70 个电源岛、节点和域,并通过XilPM 客户端的源代码pm_defs.h(https://github.com/Xilinx/embeddedsw/blob/master/lib/sw_services/xilpm/s...)进行到节点的映射。

在加载 PMU 固件时,配置内存有两个选项。
这些选择引导 ROM 或 FSBL 加载由引导文件创建(bif 文件)中 PMU elf 的标记方式控制。如果 PMU elf 分区被定义为发往 PMU 的数据文件,它将由 FSBL 加载。

如果我们将分区类型设置为由引导ROM加载的PMU,它将由引导ROM加载。

如果我们想要调试应用程序,我们首先需要确保 PMU 在 FSBL 等之前加载并运行。这是因为如果不删除安全门,PU MicroBlaze 在 XSDB 中不可见。
为此,我们可以使用 XSCT 并创建一个简单的 TCL 脚本,如下所示。请注意,需要在应用程序中编辑软件的名称和路径。
#Disable Security gates to view PMU MB target
targets -set -filter {name =~ "PSU"}
mwr 0xffca0038 0x1ff
after 500
#Load and run PMU FW
targets -set -filter {name =~ "MicroBlaze PMU"}
dow xpfw.elf
con
after 500
#Reset A53, load and run FSBL
targets -set -filter {name =~ "Cortex-A53 #0"}
rst -processor
dow fsbl_a53.elf
con
#Give FSBL time to run
after 5000
stop
今天关于 PMU 就介绍到这里,后续我们会更详细的介绍其功能。