更改ZCU104评估板FMC接口的I/O核心供电电压


一、前言

本文的环境均为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的电源上。

Bank 67供电
查询到该电源是由IRPS5401这块PMIC2 输出的。同时也可以看到,该输出有一个测试点J172供我们测试。隔壁有个J33接地的测试点。

PMIC输出

测试点

理论上是可以通过配置PMIC来调整输出电压,开发板上也刚好留有PMIC的I2C接口供调试使用。图中的排针接口(J175),从左到右分别是 SCL SDA GND
I2C调试接口
接上示波器后在启动的时候发现有I2C输出,猜测在上电的时候对PMIC进行了配置。但是查询了PMIC的数据手册之后,发现这一段其实只是在对其中一个输出端口进行配置,也就是FMC的输出电压VADJ_FMC。而PMIC的内部带有EEPROM,并不需要每次上电都需要配置,这里通过观察示波器,也发现只有这一段I2C波形。

I2C输出
推测应该是Petalinux里面对这个进行了配置,可是在config找了一圈都没有找到这个的选项,也没有找到对这个PMIC的驱动。

在搜索了一堆回答之后,有这样几个解决的办法:

  1. 第一种是使用英飞凌的官方编程器对PMIC编程。不过如果只是为了这样去买一个编程器,不太划算,而且感觉在再次启动Petalinux的时候又会重新刷新掉。
  2. 使用官方SCUI工具,对开发板进行配置。有一定效果,但是和推测的一样启动Petalinux的时候又会重新刷新掉,具体操作见下文。
  3. 既然关于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://www.xilinx.com/member/forms/download/design-license.html?cid=2acea54e-e9d3-40ea-aa65-ee986d08cdd6&filename=rdf0456-zcu104-system-controller-c-2019-1.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

希望能有所帮助

https://forums.xilinx.com/t5/Xilinx-Evaluation-Boards/How-can-I-adjust-VADJ-value-to-2-5-V-on-zcu102-Rev1-0-board/td-p/789311

该方法主要是通过向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)


  1. 原理图是受管控文件,读者可到Xilinx官网自行下载,本文只截取部分少量原理图。 ↩︎

  2. Power Management IC 集成电源管理电路 ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值