#!/bin/sh
# /etc/init.d/fpga
#
# Written by Russell Cumber<Russell.Cumber@daktronics.com>

set -e

#DAEMON=/usr/local/sbin/fpga
NAME=vip5060
#PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin

test -x $DAEMON || exit 0

checkIfProgrammed()
{
	if [ `cat /sys/class/gpio/gpio65/value` = "1" ]; then
		echo "WARNING: FPGA already programmed.  Possible Watchdog event"
		logger "WARNING: FPGA already programmed.  Possible Watchdog event"
		touch /var/run/wd_event
	fi
}

setupProgramGPIO()
{
	if [ ! -d /sys/class/gpio/gpio152 ]; then
		echo "Configuring GPIO 152 for FPGA Program"
		echo 152 > /sys/class/gpio/export
		echo out > /sys/class/gpio/gpio152/direction
		echo 1 > /sys/class/gpio/gpio152/value
	fi
}

setupProgramDoneGPIO()
{
	if [ ! -d /sys/class/gpio/gpio65 ]; then
		echo "Configuring GPIO 65 for FPGA Program Done"
		echo 65 > /sys/class/gpio/export
		echo in > /sys/class/gpio/gpio65/direction
		
		checkIfProgrammed
	fi
}

setupUSBResetGPIO()
{
	if [ ! -d /sys/class/gpio/gpio162 ]; then
		echo "Configuring GPIO 162 for USB Hub Reset"
		echo 162 > /sys/class/gpio/export
		echo out > /sys/class/gpio/gpio162/direction
		echo 0 > /sys/class/gpio/gpio162/value
	fi
}
unresetUSBHub()
{
    setupUSBResetGPIO
    echo 0 >/sys/class/gpio/gpio162/value
    echo 1 >/sys/class/gpio/gpio162/value
}


unprogramFPGA()
{
   echo "0" > /sys/class/gpio/gpio152/value
   echo "1" > /sys/class/gpio/gpio152/value
}
programIDTClocks()
{
	HWID=`cat /proc/driver/processor/hwid`

	if [ $HWID -gt 1 ]; then
   	 /usr/local/sbin/idt_prog /usr/local/src/bitstreams/idt/settings.hex
	fi
}

programFPGA()
{
	#already programmed... dont do it again
	if [ `cat /sys/class/gpio/gpio65/value` = "0" ]; then
		unprogramFPGA
       		programIDTClocks
        	unresetUSBHub
		cat /usr/local/src/bitstreams/vip5060/download.bit > /dev/spidev1.0;
		echo "11111111" > /dev/spidev1.0;

		if [ `cat /sys/class/gpio/gpio65/value` = "0" ]; then
			echo "Error Programming FPGA... Trying again."
			sleep 2
			unprogramFPGA
			cat /usr/local/src/bitstreams/vip5060/download.bit > /dev/spidev1.0;
			echo "11111111" > /dev/spidev1.0;
			
			if [ `cat /sys/class/gpio/gpio65/value` = "0" ]; then
				echo "Unable to program FPGA: Exiting"
			fi		
		fi		
	fi
}

sh /usr/local/src/mtd-utils/MTDCheckAndFix.sh
setupProgramDoneGPIO
setupProgramGPIO

case "$1" in
  start)
    echo -n "Programming FPGA: $NAME  "
	programFPGA   
    echo "."
    ;;
  stop)
    echo -n "Stopping FPGA: $NAME  "
	unprogramFPGA
    echo "."
    ;;
  restart)
    echo -n "Resetting FPGA: $NAME  "
    unprogramFPGA
	programFPGA
    echo "."
    ;;
  reload|force-reload)
    echo "Reloading FPGA: $NAME"
    unprogramFPGA
	programFPGA
    echo "."
    ;;
  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|restart|reload}"
    exit 1
    ;;
esac

exit 0
