How to change the FMC voltage rail (V_ADJ/VADJ) on the ZCU104 from 1.2V (default) to 1.8V directly from Linux running on the board
Credits to out to @guilhermegog who figured out how to make this work!
First, find out where your channel id 2 is (chan_id 2, this is where the PMIC that controls the voltage will be listening):
i2cdetect -lExample output:
i2c-0 i2c Cadence I2C at ff020000 I2C adapter
i2c-1 i2c i2c-0-mux (chan_id 0) I2C adapter
i2c-2 i2c i2c-0-mux (chan_id 1) I2C adapter
i2c-3 i2c i2c-0-mux (chan_id 2) I2C adapter <-- THIS IS THE ONE
...Select the correct ID, i2c-3 (id 3), in this case, corresponding to chan_id 2.
Then run the following commands, where you replace 3 by the obtained id number:
# Select Page 3 on the PMIC
i2cset -y -f 3 0x44 0x00 0x03
# Set Vout Mode (Linear)
# 0x14 = 000 for linear mode and 10100 for the scale (=-12 in 2s complement)
# and results in a scale of 2**-12. Check the manual for more information.
i2cset -y -f 3 0x44 0x20 0x14
# Set voltage to 1.8V (word write)
# 0x1CCC = 0d7373, 7372/2**12 = 1.80V
i2cset -y -f 3 0x44 0x21 0x1CCD wWhen we tested this, our id was i2c-4 therefore our commands had -y 4 instead. If you then measure the output voltage, it should have been correctly set to 1.8V!
Links:
- Post on the Xilinx forums about programming the PMIC via external I2C: https://adaptivesupport.amd.com/s/question/0D52E00006hphaLSAQ/enabling-vadj-on-zcu104?language=en_US
- Infineon IRPS5401 register mapping docs: https://www.infineon.com/assets/row/public/documents/24/57/infineon-dc-dc-pol-irps5401-register-map-additionaltechnicalinformation-en.pdf?fileId=5546d46262b31d2e01632da262953416&utm_source=chatgpt.com#page=19.13