#!/usr/bin/env bash

wait_writeable() {
   while [ ! -w "/sys/class/gpio/gpio$1/direction" ]; do
      sleep .01
   done
}

KERNEL_VER=$(uname -r | cut -f1 -d.)

#Files are in same directory as script
dir="$(dirname "$BASH_SOURCE")"
if [ "$(basename "$BASH_SOURCE")" == "setup_mfm_write" ]; then
   DTBOAB="mfm_write-00A0"
   BBIOAB="mfm_w_revab.bbio"
   DTBOC="mfm_write-00C0"
   BBIOC="mfm_w_revc.bbio"
else
   DTBOAB="mfm_read-00A0"
   BBIOAB="mfm_r_revab.bbio"
   DTBOC="mfm_read-00C0"
   BBIOC="mfm_r_revc.bbio"
fi
   
if [ "$KERNEL_VER" -lt "4" ]; then
   # Use legacy cape manager loading functionality
   if [ -e /sys/devices/platform/bone_capemgr/slots ]
   then
      CAPE=/sys/devices/platform/bone_capemgr/slots
   else
      CAPE=/sys/devices/bone_capemgr.*/slots
      # Enable A/D
      echo cape-bone-iio > $CAPE
   fi
fi

pin='61'
if [ ! -d /sys/class/gpio/gpio$pin ]; then
   # Depending on default pullup since we haven't loaded the overlay
   echo $pin > /sys/class/gpio/export
   wait_writeable "$pin"
fi
echo in > /sys/class/gpio/gpio$pin/direction
REV=$(cat /sys/class/gpio/gpio$pin/value)

if [ "$REV" == "0" ]; then
   echo Rev C or D Board
   if [ "$KERNEL_VER" -lt "4" ]; then
      /usr/bin/dtc -O dtb -o $dir/$DTBOC.dtbo -b 0 -@ $dir/$DTBOC.dts
      cp $dir/$DTBOC.dtbo /lib/firmware
      echo ${DTBOC/-/:} > $CAPE
   else
      # Batch configure all pins for mfm_rw
      # Shouldn't need sudo but sometimes get 
      # ERROR: open() for /sys/devices/platform/ocp/ocp:P9_13_pinmux/state failed, Permission denied
      sudo config-pin -c $dir/$BBIOC
   fi
   # Set inactive 31 recovery 46,15,26,27 Drive select, 110 write
   # 50 read transceiver enable, low enabled
   # 8-11 rev B head, all low is head 0 after inversion
   pins_low="8 9 10 11 31 46 15 26 27 110 50"
   # 113 TRACK 0
   pins_in="113"
   # 44 emu second driver emulation, disable
   # 60 MFM emulation tranceiver enable, high is disabled
   # 14,30(C) drive selected LEDS
   # 60 emulation xcvr en 48 testing(C)
   pins_high="14 30 44 60"
else
   if [ "$KERNEL_VER" -lt "4" ]; then
      /usr/bin/dtc -O dtb -o $dir/$DTBOAB.dtbo -b 0 -@ $dir/$DTBOAB.dts
      cp $dir/$DTBOAB.dtbo /lib/firmware
      echo ${DTBOAB/-/:} > $CAPE
   else
      # Shouldn't need sudo but sometimes get 
      # ERROR: open() for /sys/devices/platform/ocp/ocp:P9_13_pinmux/state failed, Permission denied
      sudo config-pin -c $dir/$BBIOAB 
   fi
   # Detect A/B PIN with P8_16
   pin='46'
   if [ ! -d /sys/class/gpio/gpio$pin ]; then
      # Depending on default pullup since we haven't loaded the overlay
      echo $pin > /sys/class/gpio/export
      wait_writeable "$pin"
   fi
   echo in > /sys/class/gpio/gpio$pin/direction
   REV=$(cat /sys/class/gpio/gpio$pin/value)
   if [ "$REV" == "0" ]; then
      echo Rev B Board
   else
      echo Rev A Board
   fi
   # Set inactive 22,23,26,27 Drive select, 31 recovery, 110 write
   # 50 read transceiver enable, low enabled
   # 2-5 rev A head, 8-11 rev B head, all low is head 0 after inversion
   pins_low="2 3 4 5 8 9 10 11 22 23 26 27 31 110 50"
   # 14,15 drive selected LEDS
   # 44 emu second driver emulation, disable
   # 60 MFM emulation tranceiver enable, high is disabled
   pins_high="14 15 44 60"
   # 30 TRACK 0
   pins_in="30"
fi

# With universal cape header, all pins are exported and set to in by default.
# However, we now support reboot-less operation, so set them all anyway.
for pin in $pins_in $pins_low $pins_high; do
   if [ ! -d /sys/class/gpio/gpio$pin ]; then
      echo $pin > /sys/class/gpio/export
   fi
   wait_writeable "$pin"
   echo in > /sys/class/gpio/gpio$pin/direction
done

for pin in $pins_low; do
   echo out > /sys/class/gpio/gpio$pin/direction
   echo 0 > /sys/class/gpio/gpio$pin/value
done

for pin in $pins_high; do
   echo out > /sys/class/gpio/gpio$pin/direction
   echo 1 > /sys/class/gpio/gpio$pin/value
done

