#!/bin/sh
#
# CHANGELOG
#========================================================
# 2010/07/29    crms00210650     Xiaodong YANG
#               add touch panel firmwre upgrade function
#
# 2010/08/13                     Michel SULYAN
#               do not update firmware during upgrade
#               - add new function upgrade_check called at into start only
#
# 2010/08/20                     Michel SULYAN
#               - use CLISettings to get touchpanel hardware version
#
# 2010/10/04                     Michel SULYAN
#               - crms00262667: too much defence log after reset
#
# 2010/11/30                     Xiaodong YANG
#               - crms00276704: touch panel firmware upgrade reboot in loop
#DO NOT EDIT THIS FILE
echo entering $0

TP_FIRMWARE_DIR=/firmware/touch_panel
TP_DESC_FILE=${TP_FIRMWARE_DIR}/touchpanel_firmware_desc
TP_ISSP_DRV=${TP_FIRMWARE_DIR}/issp_drv.ko
FW_UPGRADE_TOOL=/usr/bin/touchpanelfw

#TECOM_KEYPAD_MAJOR=$(awk '$2=="isspdrv" {print $1}' /proc/devices)
TECOM_TS_DEV=/dev/tcmdrv_sintek
TECOM_TS_DEV_MAJOR=239
TECOM_ISSP_DEV=/dev/isspdrv
TECOM_ISSP_MAJOR=168

error_quit(){
    
    echo "Touch Panel upgrade error : quit upgrade, check /log/Defence.log"
    exit 1;
}

install_driver(){
    #remove tecom i2c device drivers
    rmmod tcm_drv_ts >/dev/null 2>&1
    rmmod tcm_drv_keypad >/dev/null 2>&1
    rmmod tcm_drv_haptic >/dev/null 2>&1

    #remove linux i2c drivers
    modprobe -r i2c-bcm11xx-hw >/dev/null 2>&1
    modprobe -r i2c-core >/dev/null 2>&1
    modprobe -r i2c-dev >/dev/null 2>&1

    #install issp driver
    insmod $TP_ISSP_DRV >/dev/null 2>&1

    if [ ! -e $TECOM_ISSP_DEV ]; then
        mknod $TECOM_ISSP_DEV c $TECOM_ISSP_MAJOR 0
    fi 
}

recover_driver(){                                                               
                                                                                
    rmmod $TP_ISSP_DRV                                                          
    rm -f $TECOM_ISSP_DEV                                                       
                                                                                
    modprobe i2c-bcm11xx-hw >/dev/null 2>&1                                     
    modprobe i2c-core >/dev/null 2>&1                                           
    modprobe i2c-dev >/dev/null 2>&1
                                                                                    
    # I2C init before loading Tecom modules                                     
    dbg wl 0x80000034 0x10002                                                   
    dbg wl 0x8001402c 0                                                         
}  

fw_dwlforce(){

    if [[ ! -f $DWL_FORCE_FILE ]]; then
        echo "Touch Panel firmware $DWL_FORCE_FILE not exist, quit force upgrade!"
        error_quit
    fi

    if [[ -x $FW_UPGRADE_TOOL ]]; then
        install_driver

        $FW_UPGRADE_TOOL dwlforce $DWL_FORCE_FILE >/dev/null 2>&1
        RETVAL=$?

        if [ $RETVAL -eq 0 ]; then
            echo "Touch Panel force upgrading succeeded, reboot"
            reboot --hard --reason "touchpanel firmware force updated" --owner touchpanel
        else
            echo "Touch Panel force upgrading failed, reboot"
           reboot --hard --reason "touchpanel firmware force update failed" --owner touchpanel
        fi
    else
        echo "Touch Panel upgrade tool $FW_UPGRADE_TOOL error(exist? executable?)"
        error_quit
    fi

}

version_check(){

    #Read by i2c (former dirver not supported)
    $FW_UPGRADE_TOOL version_from_i2c
    RETVAL=$?
    VERSION=$RETVAL  
    CURRENT_VER=`printf %x $VERSION`

    echo "Touch Panel firmware version: chip 0x$CURRENT_VER ; host 0x$FIRMWARE_VER"
    logger -t touchpanel -p local1.info "Touch Panel firmware version: chip 0x$CURRENT_VER ; host 0x$FIRMWARE_VER"
    displaymsg "Touch Panel firmware version: chip 0x$CURRENT_VER ; host 0x$FIRMWARE_VER"    

    FIRMWARE_VER_FILE=`printf %d 0x$FIRMWARE_VER`
    #upgrade when error read firmware version from chip(=0) and FIRMWARE_VER(in flash) > VERSION(in chip)       
    if [ ! "$VERSION" -eq "0" ]; then
        if [ "$FIRMWARE_VER_FILE" -le "$VERSION" ]; then
           echo "Touch Panel firmware already latest, quit upgrade"
           exit 0;
        fi
    fi
}

version_from_driver(){

    #read by driver ioctl, only driver (after B.1.0 beta4) supported
    if [ ! -e $TECOM_TS_DEV ]; then
        mknod $TECOM_TS_DEV c $TECOM_TS_DEV_MAJOR 0
    fi

    $FW_UPGRADE_TOOL version
    RETVAL=$?
    VERSION_FROM_DRIVER=$RETVAL

    echo "Touch Panel firmware version: chip 0x`printf %x $VERSION_FROM_DRIVER`"
}

start(){

    TOUCH_PANEL_HW=`CLISettings get CURRENT FAB_HW_TOUCHPANEL 2>/dev/null`
    echo "Touch Panel hardware version: $TOUCH_PANEL_HW"

    if [[ -f $TP_DESC_FILE ]]; then
        cat $TP_DESC_FILE | while read HARDWARE FIRMWARE_VER FIRMWARE_PATH CHECKSUM
        do
            if [ "$TOUCH_PANEL_HW" == "$HARDWARE" ]; then
	        
	        if [[ ! -f $FIRMWARE_PATH ]]; then
	            logger -t touchpanel -p emerg "Touch Panel firmware $FIRMWARE_PATH not exist, quit upgrade!"
	            error_quit
	        fi

                if [[ -x $FW_UPGRADE_TOOL ]]; then
                    #quit if checksum check failure
                    $FW_UPGRADE_TOOL checksum $FIRMWARE_PATH $CHECKSUM >/dev/null 2>&1
                    RETVAL=$?

                    if [ ! $RETVAL -eq 0 ]; then
                        logger -t touchpanel -p emerg "Touch Panel firmware checksum error, quit upgrade!"
                        error_quit
                    fi
                    
                    #firmware version check
                    version_check
        
                    #remove other drivers only when issp driver exist
                    if [[ -f $TP_ISSP_DRV ]]; then
                        install_driver
                    else
                        logger -t touchpanel -p emerg "Touch panel No ISSP driver file, quit upgrade"
                        error_quit
                    fi

                    displaymsg "Touch Panel Firmware Upgrading to 0x$FIRMWARE_VER: Start"

                    #try 3 times if not successful
                    COUNTER=0
                    RES=1

                    while [ "$COUNTER" -lt 3 -a "$RES" -ne 0 ]; do
                        COUNTER=$(($COUNTER+1))                    
                        echo "Touch Panel firmware upgrade try $COUNTER"
                        $FW_UPGRADE_TOOL dwlforce $FIRMWARE_PATH >/dev/null 2>&1
                        RETVAL=$?
                        RES=$RETVAL
                    done
                    
                    if [ $RES -eq 0 ]; then
                        echo "Touch panel firmware upgrade: succeed"
                        displaymsg "Touch Panel Firmware Upgrading to 0x$FIRMWARE_VER: Succeed"
                        logger -t touchpanel -p emerg "Touch Panel firmware update from 0x$CURRENT_VER to 0x$FIRMWARE_VER: Succeed"
                        recover_driver
                        #reboot --hard --reason "touchpanel firmware update succeed" --owner touchpanel
                    else
                        echo "Touch panel firmware upgrade: failed"
                        displaymsg "Touch Panel Firmware Upgrading to 0x$FIRMWARE_VER: Failed"
                        logger -t touchpanel -p emerg "Touch Panel firmware update from 0x$CURRENT_VER to 0x$FIRMWARE_VER: Failed"
                        recover_driver
                        #reboot --hard --reason "touchpanel firmware update failed" --owner touchpanel
                    fi
	            
                else
                    logger -t touchpanel -p emerg "Touch Panel upgrade tool $FW_UPGRADE_TOOL error(exist? executable?)"
                    error_quit
                fi
	    else
                logger -t touchpanel -p emerg "$HARDWARE entry not matched in $TP_DESC_FILE" 
            fi
        done
    else
        #can be a normal case for a specific hardware
        logger -t touchpanel -p local1.info "Touch Panel firmware description file $TP_DESC_FILE not exist, quit upgrade"
        error_quit
    fi

}

#if isspdrv is installed, a hardware reboot is necessary
issp_drv_check(){
    lsmod | grep isspdrv 
    RETVAL=$? >/dev/null 2>&1

    if [ $RETVAL -eq 0 ]; then
        reboot --hard --reason "Touchpanel issp drv installed, need reboot" --owner touchpanel
    fi
}

#if upgrade in progress then exit 
upgrade_check(){
    STATUS=/usr/sbin/upgd_status
    if [ -x $STATUS ]; then
        $STATUS >/dev/null 2>&1
        if [ $? -eq 1 ]; then 
           echo "upgrade in progress : do not run touchpanel update"
           exit 0
        fi	
    fi
}

case "$1" in                                                          
    start)
        upgrade_check
        echo "Touch Panel firmware update check start"
        start
        #issp_drv_check
        exit 0
        ;;                                                            
    stop)
        echo "Touch Panel firmware update check stop"
	# Stop the modules
        if [ -x /etc/init.d/rc.modules.file ]; then
            if [  -f /etc/modules.touchpanel ]; then
                /etc/init.d/rc.modules.file /etc/modules.touchpanel unload /etc/modules.no-unload
            else
                echo "Cannot find the file /etc/modules.touchpanel containing modules"
            fi
        else
            echo "Cannot start modules.file script"
        fi
        ;;
    dwlforce)
        DWL_FORCE_FILE=$2
        if [ "x$DWL_FORCE_FILE" != "x" ]; then
           echo "Touch Panel firmware $DWL_FORCE_FILE download force"
           fw_dwlforce
        fi
        exit 0
        ;;
    fwversion)
        version_from_driver
        exit 0
        ;;
    *)                                                                                           
     echo "Usage $0 {start | stop | fwversion}"                                                               
     exit 1                                                                                       
     ;; 
esac

