Change FMC voltage rail (VADJ) in ZCU104


I want to use the pins available in the FMC socket to talk to another chip in a ZCU104 board. I notice that you can get the voltage levels of the rails with get_rails(). The FMC rail is at 1.2V, which I can confirm by probing the VADJ pin in an FMC breakout board.

Is there any way, through PYNQ or through something else, to change that rail to 1.8V so that my signals also work at 1.8V?

Thanks for your help!

We don’t have a way of doing this from PYNQ as it’s a bit risky to be poking the power regulators from a multi-process environment without dedicated driver support that we don’t have. It’s theoretically possible to bash the I2C bus from user-space but that risks frying the board without extreme care.

On the ZCU104 the PYNQ image should during the very early boot stage interrogate the FMC card and set VADJ appropriately. If you want to override this the best bet is probably to patch that part of the FSBL. This part of the boot process is built on top of Petalinux so you can follow the guides on patching the FSBL with xfsbl_board.c being the file of interest.

Hopefully this is sufficient to get started.


Thank you for your reply, especially during the long holiday weekend in the USA.

I ended up solving the issue in a different way. From this post, I found out that there is a bug in the FSBL. Instead of reading the EEPROM of the FMC card, it interrogates the EEPROM of the ZCU104 board. Since I have the Infineon USB005 dongle to write to the EEPROM on the ZCU104 through I2C, I used it to reprogram the value to 1.8 V and it worked.

Patching the FSBL is probably the more elegant solution, but I am a bit time constrained at the moment. Also, I am more confident messing with HW rather than SW or firmware.

Thanks for the help!

PS: unfortunately, I cannot mark both answers as a solution. So, I will mark this as a solution since it is the one I tested.