#!/bin/sh

program_ifboard () {
   if [ -e /sys/class/ifboard/sim_sdid ]
   then
      RES=`cat /sys/class/ifboard/sim_sdid`
      case $RES in
         4660007 )
            logger "hwinit: ST printer firmware version check" && sync
         fbv -f -r -c -d 200  /etc/platform/sys/programming-if-board-griffin.png &
         usleep 100000
            cat /sys/class/ifboard/fw_version > /sys/kernel/secure/programPrinter
         pidof fbv | xargs kill &> /dev/null
            sleep 2 && rmmod griffin_interface_board
            sleep 1 && modprobe griffin_interface_board
         ;;
         14142484 )
            logger "hwinit: printer firmware version check" && sync
         fbv -f -r -c -d 200  /etc/platform/sys/programming-if-board-griffin.png &
         usleep 100000
            cat /sys/class/ifboard/fw_version > /sys/kernel/secure/programPrinter
         pidof fbv | xargs kill &> /dev/null
            sleep 2 && rmmod griffin_interface_board
            sleep 1 && modprobe griffin_interface_board
         ;;
         3121680 )
            logger "hwinit: charger board firmware version check" && sync
         fbv -f -r -c -d 200  /etc/platform/sys/programming-if-board-griffin.png &
         usleep 100000
            cat /sys/class/ifboard/fw_version > /sys/kernel/secure/programCharger
         pidof fbv | xargs kill &> /dev/null
            sleep 2 && rmmod griffin_interface_board
            sleep 1 && modprobe griffin_interface_board
         ;;
         * )
            logger "hwinit: sim_sdid=$RES ... trying jtagCPUId"
            JTG=`cat /sys/class/ifboard/jtagCPUId`
            case $JTG in
               4660007 )
                  logger "hwinit: ST printer firmware force programming" && sync
                fbv -f -r -c -d 200  /etc/platform/sys/programming-if-board-griffin.png &
                usleep 100000
                  echo 0 > /sys/kernel/secure/programPrinter
                pidof fbv | xargs kill &> /dev/null
                  sleep 2 && rmmod griffin_interface_board
                  sleep 1 && modprobe griffin_interface_board
               ;;
               14142484 )
                  logger "hwinit: printer firmware force programming" && sync
                fbv -f -r -c -d 200  /etc/platform/sys/programming-if-board-griffin.png &
                usleep 100000
                  echo 0 > /sys/kernel/secure/programPrinter
                pidof fbv | xargs kill &> /dev/null
                  sleep 2 && rmmod griffin_interface_board
                  sleep 1 && modprobe griffin_interface_board
               ;;
               3121680 )
                  logger "hwinit: charger board firmware programming " && sync
                fbv -f -r -c -d 200  /etc/platform/sys/programming-if-board-griffin.png &
                usleep 100000
                  echo 0 > /sys/kernel/secure/programCharger
                pidof fbv | xargs kill &> /dev/null
                  sleep 2 && rmmod griffin_interface_board
                  sleep 1 && modprobe griffin_interface_board
               ;;
               ffffffff )
                    logger "hwinit: ffffff -> No interface board detected"
               ;;
               * )
                    logger "hwinit: [$JTG] No interface board detected?"
               ;;
            esac
         ;;
      esac
   fi
}

# All device-specific hardware initialization should go here
# rather then in /etc/rc.d/rc.local
#
if [ "$1" = "start" ]
then
    MACHINE=`cat /proc/cpuinfo  | grep Vybrid | cut -d \  -f3`
    logger "hwinit: machine type $MACHINE"
   DEVICE=`cat /proc/device-tree/model`

    if [ "$MACHINE" = "Vybrid" ]
    then
        logger "hwinit: Luxe-series hardware init."
        logger "hwinit: Checking interface board state"

      if [ "$DEVICE" == "griffin" ]
      then
         program_ifboard
         /etc/rc.d/init.d/splashscreen start
      fi

      # Adjust FS flush parameters: flush every 5 seconds anything older than 1 seconds
      echo 100 > /proc/sys/vm/dirty_writeback_centisecs
      echo 500 > /proc/sys/vm/dirty_expire_centisecs

        # RFID driver disables disabling of touch screen while polling
        if [ -e /sys/devices/platform/nbs_rfid_as3911/disable_ts ]
        then
            echo 0 >/sys/devices/platform/nbs_rfid_as3911/disable_ts
        fi

        if ! [ -s /etc/platform/sys/README ] || ! [ -s /var/lib/installer/swpack/com.nbsps.090800-500E ] || ! [ -s /etc/platform/sys/SERIAL ] || ! [ -s /etc/platform/sys/identity.x509 ] || ! [ -s /etc/platform/sys/signing.x509 ]
        then
            mode=`cat /sys/kernel/secure/state`
            LOOPDEV=$(losetup -f)
            nanddump -f  /root/MTD1.dump /dev/mtd1
            losetup ${LOOPDEV}  /root/MTD1.dump
            mount ${LOOPDEV} /mnt
            cp /mnt/activation/serial /etc/platform/sys/SERIAL
            cp /mnt/activation/readme /etc/platform/sys/README
            if [ "$mode" == 3 ]; then
                cp /mnt/activation/identity.x509 /etc/platform/sys/identity.x509
                cp /mnt/activation/signing.x509 /etc/platform/sys/signing.x509
                chmod 444 /etc/platform/sys/identity.x509 /etc/platform/sys/signing.x509
            fi
            if ! [ -s /var/lib/installer/swpack/com.nbsps.090800-500E ]; then
                mkdir -p /var/lib/installer/swpack/
                cp /mnt/activation/manifest.xml /var/lib/installer/swpack/com.nbsps.090800-500E
                chmod 444 /var/lib/installer/swpack/com.nbsps.090800-500E
            fi
            chmod 444 /etc/platform/sys/README /etc/platform/sys/SERIAL
            sync
            losetup -d ${LOOPDEV}
            umount /mnt
            if [ -s /etc/platform/sys/README ]
            then
                chattr +i /etc/platform/sys/README
            fi
            if [ -s /etc/platform/sys/SERIAL ]
            then
                chattr +i /etc/platform/sys/SERIAL
            fi
            if [ -s /etc/platform/sys/identity.x509 ]
            then
                chattr +i /etc/platform/sys/identity.x509
            fi
            if [ -s /etc/platform/sys/signing.x509 ]
            then
                chattr +i /etc/platform/sys/signing.x509
            fi
            logger "hwinit: terminal info extracted."
            rm /root/MTD1.dump
            name=$( grep ENCLOSURE /etc/platform/sys/SERIAL | awk -F '#' '{ print $2 }' )
            hostname $name
            if [ -e /run/avahi-daemon/pid ]
            then
                avahi-set-host-name $name
            fi
        fi

        # Remove lock files left on hard reboot
        rm -f /var/lib/rpm/.rpm.lock /var/lib/rpm/__db.00*
        rm -f /var/lib/installer/database/.rpm.lock /var/lib/installer/database/__db.00*
        rm -rf /var/lib/rpmrebuilddb.* /var/lib/installer/databaserebuilddb.*
        # Rebuild database if corrupted
        (
        rpm --verifydb --dbpath /var/lib/rpm &>/dev/null
        if [[ $? -ne 0 ]]; then
            echo "System db issue `date`" >> /var/log/rpmdb.log
            rpm --verifydb --dbpath /var/lib/rpm -vv 2>&1 | tee -a /var/log/rpmdb.log | logger
            rpm --rebuilddb --dbpath /var/lib/rpm
            # remove old logs (if any). leave only 2048 lines
            sed -i -e :a -e  '$q;N;2049,$D;ba' /var/log/rpmdb.log
        fi
        rpm --verifydb --dbpath /var/lib/installer/database &>/dev/null
        if [[ $? -ne 0 ]]; then
            echo "Application db issue `date`" >> /var/log/rpmdb.log
            rpm --verifydb --dbpath /var/lib/installer/database -vv 2>&1 | tee -a /var/log/rpmdb.log | logger
            rpm --rebuilddb --dbpath /var/lib/installer/database
            # remove old logs (if any). leave only 2048 lines
            sed -i -e :a -e  '$q;N;2049,$D;ba' /var/log/rpmdb.log
        fi
        ) &

    fi

    # Recover root password after platform update if terminal is in development mode
    if [ "`cat /sys/kernel/secure/state`" == "2" ]; then
        # Check if root has password ?
        grep "^root:" /etc/shadow
        if [ $? -ne 0 ]; then
            # root doesn't have password and the terminal is in development mode
            # set password equal to CPUID
            /usr/bin/passwd -d root
            echo "root:x:17373:0:999999:0:0:999999:0" >> /etc/shadow
            /bin/cat /proc/cpuid /proc/cpuid | /usr/bin/passwd root
        fi

        core_dump_dir="/opt/core_dumps"
        if [ ! -d "$core_dump_dir" ]; then
            mkdir "$core_dump_dir"
            chmod 777 "$core_dump_dir"
        fi
        # enable core dumps in development mode
        echo "$core_dump_dir/core.%e.%t.%s.%p" > /proc/sys/kernel/core_pattern
    else
        # disable core dumps in production mode
        echo "" > /proc/sys/kernel/core_pattern
    fi
   if [ -e /etc/platform/usbphy0/host ]
   then
      VAL=`cat /etc/platform/usbphy0/host`
      if [ "$VAL" == "0424-9e00" ]
      then
         ifconfig eth1 up
         /usr/sbin/ethtool -s eth1 phyad 255
         upid=$( ps | grep udhcpc | grep eth1 )
         if [ -z "$upid" ]; then
             nohup /sbin/udhcpc -b -i eth1 & &> /dev/null
         fi
      fi
   fi

    # Printer driver bandage;
    echo 1 > /sys/class/capd245/reset

    # Adjust initial brightness to 50% display brightness and 10% keypad 
    # brightness for battery powered devices.
    #
    # NOTE: 03-hwtest is marked as executable only the first time system boots.
    if [ -f /sys/kernel/ifboard/pmic_events/ch_state ] && [ -x /etc/platform/03-hwtest ]; then
        echo 128 > /etc/platform/settings/brightness 
        echo  26 > /etc/platform/settings/brightness_keypad
    fi
    
    cat /etc/platform/settings/brightness > /sys/class/backlight/lcd/brightness
    cat /etc/platform/settings/brightness_keypad > /sys/class/backlight/keypad/brightness
    logger "hwinit: setup DONE"

   # Check if eudev is completed -> cry if udev failed to notify user
   udevadm settle --timeout=0 || /usr/bin/beep -f 2000 -l 250 -r 4 -d 100

   # Beep once ...
   VOL=`amixer sget 'Speaker'| grep Mono:| awk '{ print $3 }'`
   amixer -q sset 'Speaker' 12 on
   beep 
   amixer -q sset 'Speaker' $VOL on
fi
