一、前言
本文的环境均为2020.2版本,版本之间有一定差异,请读者自行鉴别。
本文的方法不仅只适用于ZCU104开发板,对其他如ZCU102、ZCU106开发板一样适用。
本文涉及到如何使用补丁文件对FSBL进行修改的操作,需要读者熟悉Petalinux和Git的操作方式。
若出现问题建议读者上Xilinx官方论坛进行搜索。
二、原因分析
最近在用ZCU104这块Xilinx官方的开发板配合Petalinux进行开发,但是却发现FMC接口的电平不对。本来是设置了LVCMOS18(因为FMC用的是高性能接口,所以电压只能到1V8),但是测试的时候高电平只有1.16V。赶紧去查了一下数据手册(DS925),并在手册的第19页找到电平标准的描述。
理论上高电平最低电压也是1.4V,但是我的明显低于这个电压,更像是LVCMOS12的标准。再重新对工程检查后,意识到极有可能是Vcco的问题。Vcco是核心供电电压,直接打开ZCU104的原理图1 进行查询。
FMC所连接的区块是Bank 67/68 ,可以看到这个两个Bank连接到的是一个叫做VADJ_FMC的电源上。
查询到该电源是由IRPS5401这块PMIC2 输出的。同时也可以看到,该输出有一个测试点J172供我们测试。隔壁有个J33接地的测试点。
理论上是可以通过配置PMIC来调整输出电压,开发板上也刚好留有PMIC的I2C接口供调试使用。图中的排针接口(J175),从左到右分别是 SCL SDA GND
接上示波器后在启动的时候发现有I2C输出,猜测在上电的时候对PMIC进行了配置。但是查询了PMIC的数据手册之后,发现这一段其实只是在对其中一个输出端口进行配置,也就是FMC的输出电压VADJ_FMC。而PMIC的内部带有EEPROM,并不需要每次上电都需要配置,这里通过观察示波器,也发现只有这一段I2C波形。
推测应该是Petalinux里面对这个进行了配置,可是在config找了一圈都没有找到这个的选项,也没有找到对这个PMIC的驱动。
在搜索了一堆回答之后,有这样几个解决的办法:
- 第一种是使用英飞凌的官方编程器对PMIC编程。不过如果只是为了这样去买一个编程器,不太划算,而且感觉在再次启动Petalinux的时候又会重新刷新掉。
- 使用官方SCUI工具,对开发板进行配置。有一定效果,但是和推测的一样启动Petalinux的时候又会重新刷新掉,具体操作见下文。
- 既然关于PMIC的启动不在内核,那就极有可能在FSBL里面。关于怎么修改官方开发板的FSBL,也是有点麻烦的。这个是最终能够真正修改在Petalinux下FMC电压的办法。
三、解决方案
1. 裸机系统或纯FPGA修改电压
这里直接复制官方论坛的回答:
请查看本回答记录,它应该有助于您调整ZCU104评估板上的VADJ_FMC电压:
https://www.xilinx.com/support/answers/67308.html
ZCU104 SCUI使用说明:
https://www.xilinx.com/support/documentation/boards_and_kits/zcu104/2019_1/xtp502-zcu104-system-controller-c-2019-1.pdf
这是ZCU104系统控制器的.zip文件:
另外,你也可以看看这些类似的论坛帖子是否能帮助你解决你的疑问:
https://forums.xilinx.com/t5/Xilinx-Evaluation-Boards/Enabling-VADJ-on-ZCU104/td-p/861259
https://forums.xilinx.com/t5/Xilinx-Evaluation-Boards/FMC-VAdj-Set-to-3-3v/td-p/860226
https://forums.xilinx.com/t5/Xilinx-Evaluation-Boards/FMC-VADJ/td-p/911056
希望能有所帮助
该方法主要是通过向ZYNQ里面写入官方的开发板控制程序,然后通过软件设置电压。但是由于Petalinux的FSBL会重新写入PMIC的电压信息,所以无法用这个进行更改。
2.Petalinux下修改FMC电压
在2020.2中,官方向FSBL中添加了一些代码,可以读取FMC卡的EEPROM,然后根据EEPROM里面的电压信息,来配置VADJ电压。
但是代码中有个小问题。可能是考虑到不是所有的FMC上都有EEPROM。所以它实际上是从ZCU104的板载EEPROM读取的,而不是从FMC卡的EEPROM读取的。所以必须对FSBL的代码打补丁,重新编译新的FSBL。
先克隆官方的FSBL源码 https://github.com/Xilinx/embeddedsw,记得在分支里面选择自己的Petalinux版本。
git clone https://github.com/Xilinx/embeddedsw.git
cd embeddedsw/
git checkout tags/xilinx-v2020.2
git branch my
git checkout my
找到如下文件 lib\sw_apps\zynqmp_fsbl\src\xfsbl_board.c
,在文件的大约290行找到如下代码。
#if defined(XPS_BOARD_ZCU104) || defined(XPS_BOARD_ZCU216) || \
defined(XPS_BOARD_ZCU208)
#if defined(XPS_BOARD_ZCU104)
UStatus = XFsbl_ReadMinMaxEepromVadj(I2c0InstancePtr, &LpcMin, &LpcMax);
#else
UStatus = XFsbl_ReadMinMaxEepromVadj(I2c1InstancePtr, &LpcMin, &LpcMax);
#endif
if(UStatus != XFSBL_SUCCESS)
{
goto END;
}
VadjSetting = XFsbl_CalVadj(LpcMin, LpcMax);
#endif
将其修改成你所需要的电压
#if defined(XPS_BOARD_ZCU104) || defined(XPS_BOARD_ZCU216) || \
defined(XPS_BOARD_ZCU208)
#if defined(XPS_BOARD_ZCU104)
UStatus = XFsbl_ReadMinMaxEepromVadj(I2c0InstancePtr, &LpcMin, &LpcMax);
#else
UStatus = XFsbl_ReadMinMaxEepromVadj(I2c1InstancePtr, &LpcMin, &LpcMax);
#endif
if(UStatus != XFSBL_SUCCESS)
{
goto END;
}
VadjSetting = SET_VADJ_1V8; /* 改动部分 */
#endif
保存文件,提交修改,生成补丁文件
git commit -s
git format-patch -1
在Petalinux工程下创建一个fsbl和files目录
mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl/files
拷贝刚刚生成的FSBL补丁文件到files目录
cp 0001-FSBL.patch <plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl/files
创建一个名为 fsbl_%.bbappend
的文件,然后添加到如下文件夹<plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl
vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl/fsbl_%.bbappend
现在你工程的文件结构应该如下图所示:
在文件fsbl_%.bbappend
中添加如下内容
# Patch for FSBL
# Note: do_configure_prepend task section is required only for 2017.1 release
# Refer https://github.com/Xilinx/meta-xilinx-tools/blob/rel-v2017.2/classes/xsctbase.bbclass#L29-L35
do_configure_prepend() {
if [ -d "${S}/patches" ]; then
rm -rf ${S}/patches
fi
if [ -d "${S}/.pc" ]; then
rm -rf ${S}/.pc
fi
}
SRC_URI_append = " \
file://0001-FSBL.patch \
"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
#Add debug for FSBL(optional)
XSCTH_BUILD_DEBUG = "1"
#Enable appropriate FSBL debug or compiler flags
YAML_COMPILER_FLAGS_append = " -DXPS_BOARD_ZCU104"
# Note: This is not required if you are using Yocto
# CAUTION!: EXTERNALXSCTSRC and EXTERNALXSCTSRC_BUILD is required only for 2018.2 and below petalinux releases
EXTERNALXSCTSRC = ""
EXTERNALXSCTSRC_BUILD = ""
移除<plnx-proj-root>/components/plnx_workspace
,并在重建FSBL组件之前清理您的项目工作空间。
petalinux-build -x mrproper
重新编译FSBL
petalinux-build -c bootloader
编译结束后,重新打包放到SD卡中,再次启动就可以看到FMC的电压发生改变了。
其实也可以修改读取的EEPROM地址,或是直接修改EEPROM的内容,这里不进行详细讨论,读者查阅其源码后能够很好理解。
四、参考资料
网页
[1] QA: Enabling VADJ on ZCU104
[2] QA: How to modify FMC default voltage
[3] QA: ZCU104 VADJ programming
[4] QA: How to enable FSBL customization in petalinux
[5] Blog: Customizing FSBL in PetaLinux 2018.3
[6] Wiki: How to Patch the FSBL in a PetaLinux Project
文档
[1] DS925: Zynq UltraScale+ MPSoC Data Sheet: DC and AC Switching Characteristics
[2] UG1267: ZCU104 Evaluation Board User Guide
[3] XTP484 - ZCU104 Schematics (v1.0)