From 9a9163b7f0dba31d3ec713101f9eae25a8b44dfb Mon Sep 17 00:00:00 2001 From: Joris van Rantwijk Date: Sat, 5 Oct 2024 00:34:40 +0200 Subject: [PATCH] Reset FPGA via GPIO during boot --- sw/buildroot_overlay/etc/init.d/S90program_fpga.sh | 11 +++++++++++ sw/buildroot_overlay/etc/init.d/S91puzzlefw_driver.sh | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/sw/buildroot_overlay/etc/init.d/S90program_fpga.sh b/sw/buildroot_overlay/etc/init.d/S90program_fpga.sh index 0feae6f..b52e07e 100755 --- a/sw/buildroot_overlay/etc/init.d/S90program_fpga.sh +++ b/sw/buildroot_overlay/etc/init.d/S90program_fpga.sh @@ -30,6 +30,13 @@ start() { exit 1 fi + # Drive internal GPIO line 0 low to reset FPGA. + # Note: EMIO GPIO line n is gpio (n + 54) in Linux. + gpioset 0 54=0 + + # Drive internal GPIO line 2 high to enable ADC duty cycle stabilizer. + gpioset 0 56=0 + # Program FPGA. echo "Programming FPGA ..." echo 0 > /sys/class/fpga_manager/fpga0/flags @@ -37,6 +44,10 @@ start() { # Wait until FPGA programmed. sleep 5 + + # Drive internal GPIO line 0 high to release FPGA reset. + gpioset 0 54=1 + sleep 1 } case "$1" in diff --git a/sw/buildroot_overlay/etc/init.d/S91puzzlefw_driver.sh b/sw/buildroot_overlay/etc/init.d/S91puzzlefw_driver.sh index 163cfb1..7c181ae 100755 --- a/sw/buildroot_overlay/etc/init.d/S91puzzlefw_driver.sh +++ b/sw/buildroot_overlay/etc/init.d/S91puzzlefw_driver.sh @@ -14,6 +14,14 @@ start() { exit 1 fi + # Check that the FPGA has finished reset. + # If the FPGA is in reset, loading the driver will crash the system. + reset_done="$(gpioget 0 55)" + if [ "$reset_done" -ne 1 ]; then + echo "ERROR: FPGA in reset" >&2 + exit 1 + fi + # Load module. echo "Loading puzzlefw driver ..." insmod /opt/puzzlefw/driver/puzzlefw.ko