#!/bin/bash
# This shell script used to control GPIO port on RzBoard

direction=out
sysdir=/sys/class/gpio/
pinbase=120
groupin=8

pinnum=
pindir=
action=

set -u
set -e

# RedLed: P8_1  GreenLed: P17_2 BlueLed: P19_1
# UserKey: P39_0
function usage()
{
   echo "Show pinmap Usage: $0 [-v]"
   echo "Output set  Usage: $0 P9_1 [1/0]"
   echo "Input read  Usage: $0 [-i] P9_1"
   echo "Unexport    Usage: $0 [-u] P9_1"
   exit;
}

function show_pinmap()
{
   echo "
 +--------------------+--RzBoard--+--------------------+
 |      Name/GPIO     |  Physical |      Name/GPIO     |
 +--------------------+-----++----+--------------------+
 |        3.3v        |   1 ||  2 |         5v         |
 |      SDA2(P3_0)    |   3 ||  4 |         5v         |
 |      SCL2(P3_1)    |   5 ||  6 |        GND         |
 |     GPIO(P12_0)    |   7 ||  8 |     TXD2(P48_0)    |
 |        GND         |   9 || 10 |     RXD2(P48_1)    |
 |     SCL3(P48_3)    |  11 || 12 |     GPIO(P17_1)    |
 |     SDA3(P48_2)    |  13 || 14 |        GND         |
 |     GPIO(P17_0)    |  15 || 16 |     GPIO(P13_2)    |
 |        3.3v        |  17 || 18 |     GPIO(P14_0)    |
 |  SPI1_MOSI(P44_1)  |  19 || 20 |        GND         |
 |  SPI1_MISO(P44_2)  |  21 || 22 |     GPIO(P39_1)    |
 |  SPI1_CLK(P44_0)   |  23 || 24 |    SPI1_SS(P44_3)  |
 |        GND         |  25 || 26 |     GPIO(P0_1)     |
 |     GPIO(P14_1)    |  27 || 28 |     GPIO(P46_3)    |
 |     GPIO(P42_3)    |  29 || 30 |        GND         |
 |     GPIO(P42_4)    |  31 || 32 |     GPIO(P15_1)    |
 |     GPIO(P10_0)    |  33 || 34 |        GND         |
 |     GPIO(P9_1)     |  35 || 36 |     RTS2(P48_4)    |
 |     GPIO(P13_1)    |  37 || 38 |   CAN0_RX(P11_0)   |
 |        GND         |  39 || 40 |   CAN0_TX(P10_1)   |
 +--------------------+-----++----+--------------------+
 |      Name/GPIO     |  Physical |      Name/GPIO     |
 +--------------------+--RzBoard--+--------------------+
 "
   exit 0;
}

function calc_pinum()
{
   pinstr=$1

   group=`echo $pinstr | cut -d_ -f1 | tr -cd "[0-9]"`
   pin=`echo $pinstr | cut -d_ -f2 | tr -cd "[0-9]"`
   
   pinum=`expr $group \* $groupin + $pin + $pinbase`
   pindir=$sysdir/gpio$pinum

   #echo "INFO: GPIO $pinstr map to pinum[$pinum]"
}

function export_gpio()
{
    if [ -e $pindir ] ; then
       return ;
    fi

    echo $pinum > $sysdir/export
}

function unexport_gpio()
{
    if [ ! -e $pindir ] ; then
       return ;
    fi

    echo $pinum > $sysdir/unexport
}

function set_gpio()
{
    echo out > $pindir/direction
    echo $1 > $pindir/value
}

function read_gpio()
{
    echo in > $pindir/direction
    cat $pindir/value
}

if [ $# -lt 1 ] ; then
   usage;
fi

while getopts "iuvh" OPTNAME
do
    case "${OPTNAME}" in
        "i")
           direction=in
           shift
           ;;

        "u")
           action=unexport;
           shift
           ;;

        "v")
           show_pinmap;
           shift
           ;;

        "h")
           usage;
           ;;
    esac
done

calc_pinum $1

if [[ $action == unexport ]] ; then
   unexport_gpio
   exit;
fi

export_gpio

if [ $direction == in ] ; then
   read_gpio
else
   set_gpio $2
fi
