#!/bin/sh

# 0x____41__ SYS A BOOTED
# 0x____42__ SYS B BOOTED
# 0x03______ SYS A INVALIDATED
# 0x__03____ SYS B INVALIDATED
# 0x0303____ SYS A+B INVALIDATED

SYS_A_INVALIDATE_A=0x03004100
SYS_A_INVALIDATE_B=0x00034100
SYS_B_INVALIDATE_A=0x03004200
SYS_B_INVALIDATE_B=0x00034200

SYS_A_INVALIDATE_BOTH=0x03034100
SYS_B_INVALIDATE_BOTH=0x03034200

IS_SYS_A_BOOTED=$(cat /proc/cmdline | grep mtdblock2 | wc -l)
IS_SYS_B_BOOTED=$(cat /proc/cmdline | grep mtdblock3 | wc -l)

if [ ${IS_SYS_A_BOOTED} -eq 0 ]
then
  if [ ${IS_SYS_B_BOOTED} -eq 0 ]
  then
    printf "Failed to determine the booted system.\\n"
    exit 1
  fi
fi

case ${1} in
current)
  if [ ${IS_SYS_A_BOOTED} -ne 0 ]
  then
    printf "%s\\n" "$((${SYS_A_INVALIDATE_A}))" > /dev/gpbr0
    printf "System A (current) invalidated.\\n"
  fi
  if [ ${IS_SYS_B_BOOTED} -ne 0 ]
  then
    printf "%s\\n" "$((${SYS_B_INVALIDATE_B}))" > /dev/gpbr0
    printf "System B (current) invalidated.\\n"
  fi
  ;;
fallback)
  if [ ${IS_SYS_A_BOOTED} -ne 0 ]
  then
    printf "%s\\n" "$((${SYS_A_INVALIDATE_B}))" > /dev/gpbr0
    printf "System B (fallback) invalidated.\\n"
  fi
  if [ ${IS_SYS_B_BOOTED} -ne 0 ]
  then
    printf "%s\\n" "$((${SYS_B_INVALIDATE_A}))" > /dev/gpbr0
    printf "System A (fallback) invalidated.\\n"
  fi
  ;;
both)
  if [ ${IS_SYS_A_BOOTED} -ne 0 ]
  then
    printf "%s\\n" "$((${SYS_A_INVALIDATE_BOTH}))" > /dev/gpbr0
    printf "System A (current) and B (fallback) invalidated.\\n"
  fi
  if [ ${IS_SYS_B_BOOTED} -ne 0 ]
  then
    printf "%s\\n" "$((${SYS_B_INVALIDATE_BOTH}))" > /dev/gpbr0
    printf "System B (current) and A (fallback) invalidated.\\n"
  fi
  ;;
*)
  printf "Error: Wrong or no parameter given.\\n"
  printf "Usage: invalidate-system <system>\\n"
  printf "Where <system> is one of the following.\\n"
  printf "  current  - Invalidates the 'current' system.\\n"
  printf "  fallback - Invalidates the 'fallback' system.\\n"
  printf "  both     - Invalidates both systems.\\n"
  printf "             Info: Error LED will blink fast until power cycle.\\n"
  ;;
esac

exit 0
