硬件平台,zynqMP zcu111 Soc
需求
fpga反馈VADJ_FMC电压目前是1.2V,需要改成1.8V。
过程
1、查看原理图
查看该开发板原理图《0381811_ZCU111_REV1_0_07122018》,VADJ_FMC信号的相关原理图如下:
1是该信号,2是该芯片的通信方式(PMBUS),3是芯片(IRPS5401)。IRPS5401这个芯片,是个单路输入多路输出的稳压器,一拖多。还要找PMBUS接到哪,继续搜索原理图,会搜索出好多个PMBUS,因为这个总线使用的是地址区分设备,所以一根总线上可以挂多个设备,我需要的设备如下:
1是搜索的信号名,2是芯片(PCA9544ARGYR,通过i2c总线控制的四路双向转换开关),3是输入的信号,是I2C接口。这个芯片的作用说的直白点就是左侧的SDA输入可以输出到右边SD0-SD3的任意一条通路中。那接下来就是找I2C0_SDA信号是哪来的,继续在原理图中搜索,这个很好玩,搜索到了很多个I2C0_SDA作为输出的信号,如下:
1、MSP430F5342
这个Soc上有个MSP430F5342单片机,这个单片机的程序没有深入研究,MSP430F5342单片机就有I2C0_SDA作为输出的信号,原理图如下:
2、ARM端及FPGA端
之所以把ARM和FPGA放在一起,是因为道理是一样的。先上原理图:
左边是接到ARM端,右边是接到FPGA端。芯片是PCA9306DCTR,PCA9306器件是双向I2C和SMBus电压电平转换器,具有使能(EN)输入。当EN值高时,转换器开关ON, SCL1和SDA1的I/O分别连接到SCL2和SDA2的I/O上,实现端口间的双向数据流。当EN低时,转换器开关关闭,端口之间存在高阻抗状态。
所以I2C0_SDA接口有三个地方能控制,一个是MSP430单片机I2C接口控制,一个是ARM端的I2C接口控制,一个是FPGA端的I2C接口控制(FPGA端的I2C接口也可以ARM控制,FPGA把接口例化出来,ARM端也可以控制)。
以上就是分析原理图得到的信息。
2、Xilinx官网查找相关信息
这部分直接上链接https://support.xilinx.com/s/question/0D52E00006hpqK5SAI/adjusting-the-fmcbus-voltage-irps5401?language=en_US 链接里提到了一个上位机配置软件,可以配置VADJ_FMC电压。
下载配置工具,按照步骤配置电压,在板子上测量,果然随心所欲了。但是!!!!!!!!!还不能高兴太早,因为关机重启再次测量,电压值又变回之前的数值了。
3、修改源码
无从下手,百度了一番,看到说是在fsbl里配置的,并且使用配置工具配置完后,开机过程中电压开始是1.8V,随后变成1.2V,这就说明配置生效了,但是又被改了。我是用的petalinux编译的工程,找fsbl还挺费劲,所以我想试一下,开机过程中是在boot过程中电压变了,还是内核过程中电压变了,还是fsbl过程中电压变了。最简单的就是在进入个阶段加while(1)卡住,测电压。boot和内核都有源码,测试发现不是在这两个过程中变得,只能找fsbl了。找fsbl的代码很粗暴,开机第一行打印‘Xilinx Zynq MP First Stage Boot Loader’信息,我就在工程里搜索这个信息,
搜索出来这些结果,c文件中的行数都一样,都是同一个文件了估计,不同的路径有啥区别我也不知道,先进一个目录看看能不能编译吧。我就进的第一个搜索出来的目录,里边有makefile,有一个elf,查看下md5码,和使用petalinux-build编译出来的zynqmp_fsbl.elf一样,这就说明这个目录就是能编译出fsbl了。make clean再make all,可以编译。看代码吧。有个xfsbl_main.c,里边有个main函数,用户程序的入口函数,
main里执行了个状态机,第一个状态就是init,果断看下这个函数。搜索在xfsbl_initialization.c中:
这个函数看看看,有个板级初始化函数:
果断搞它,搜索在xfsbl_board.c中:
这个函数短,果断搜索config这个,在同一个文件里,看到config这个函数的最后,发现了XFsbl_FMCEnable这个函数,感觉这事能成,
搜他,在同一个文件里,就xfsbl_board.c文件。
当看到VadjSetting = SET_VADJ_0V0时,就认准了她,记住她。下边那数组就是实际写的东西,是1.2V,是1.8V。一看能明白就。改成1.8,下到板子上,VADJ_FMC就变成1.8V了。控制VADJ_FMC电平的过程应该是,430先配置VADJ_FMC,430比arm早启动,这个配置的值就是用配置工具配置的那个。然后fsbl启动又配置一遍,初始值就是VadjSetting = SET_VADJ_0V0。那是不是还又别的地方改变了这个值呢,必须有,也在XFsbl_FMCEnable函数里:
309行,通过一个范围值确定的应该用哪个电压,而这个范围是读eeprom读出来的。至于怎么改eeprom的数,没研究。但是!!!!!!,我用的是zcu111,根本没进这部分代码啊,所以我直接改的VadjSetting定义的位置就好使。
到这里应该就算结束了,但是同事老哥提醒了我一句,这种情况还是不能动态修改,还是麻烦,有道理,再粗暴一次,把XFsbl_FMCEnable函数屏蔽了,arm在fsbl阶段就别控制了,这样使用配置工具就可以动态配置了,经过测试,可以的。同时也要感谢同事老哥帮我一起看原理图,不然我一个人可能看不懂,哈哈哈