#!/bin/sh
#usage: fd.sh <r|w> <type>
#AKIKAWA, Hisashi 2017.3.5

#GPIO number
index=4
drvsel=17
motor=18
dirsel=27
step=22
write=23
gate=24
trk0=25
read=8
side1=7

#read/write mode
case $1 in
    r)
	echo read floppy
	;;
    w)
	echo write floppy
	;;
    *)
	echo "usage: ***.sh <r|w> [type]"
	exit
	;;
esac

#media type
case $2 in
    1D | 1d)
	cylstep=2
	sidemax=0
    ;;
    1DD | 1dd)
	cylstep=1
	sidemax=0
    ;;
    2D | 2d)
	cylstep=2
	sidemax=1
    ;;
    *)
	cylstep=1
	sidemax=1
    ;;
esac
cylmax=81


devfile=/dev/gpiofd

#need cpufrequtils
governor=`cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor`

#need Wiring pi
echo set GPIO
gpio -g mode ${index} in
gpio -g mode ${index} up
gpio -g mode ${trk0} in
gpio -g mode ${trk0} up
gpio -g mode ${read} in
gpio -g mode ${read} up

gpio -g write ${drvsel} 1
gpio -g mode ${drvsel} out
gpio -g write ${motor} 1
gpio -g mode ${motor} out
gpio -g write ${dirsel} 1
gpio -g mode ${dirsel} out
gpio -g write ${step} 1
gpio -g mode ${step} out
gpio -g write ${write} 1
gpio -g mode ${write} out
gpio -g write ${gate} 1
gpio -g mode ${gate} out
gpio -g write ${side1} 1
gpio -g mode ${side1} out


echo insmod

sudo insmod gpiofd.ko
sudo chmod 666 ${devfile}


echo FDD motor on

trap "gpio -g write ${motor} 1; gpio -g write ${drvsel} 1; sudo rmmod gpiofd.ko; sudo cpufreq-set -g ${governor}; echo stop; exit" 1 2 3 15

sudo cpufreq-set -g performance

gpio -g write ${drvsel} 0
gpio -g write ${motor} 0

sleep 0.5

echo recalibrate

while [ `gpio -g read ${trk0}` = 1 ]
do
  gpio -g write ${step} 0
  sleep 0.000001
  gpio -g write ${step} 1
  sleep 0.003
done

gpio -g write ${dirsel} 0

for cylinder in `seq -f %02g 0 ${cylstep} ${cylmax}`
do
  for side in `seq 0 ${sidemax}`
  do
    echo cylinder=${cylinder}, side=${side}
    gpio -g write ${side1} `expr 1 - ${side}`
    sleep 0.0001
    fname=c${cylinder}h${side}.dat
    if [ $1 = "r" ]; then
      dd bs=524288 count=1 if=${devfile} > ${fname}
    elif [ $1 = "w" ]; then
      if [ -e ${fname} ]; then
        dd bs=524288 count=1 if=${fname} > ${devfile}
      fi
    fi
  done

  for i in `seq 1 ${cylstep}`
  do
    gpio -g write ${step} 0
    gpio -g write ${step} 1
    sleep 0.003
  done
  sleep 0.015
done


gpio -g write ${motor} 1
gpio -g write ${drvsel} 1
sudo rmmod gpiofd.ko
sudo cpufreq-set -g ${governor}
