#!/bin/sh
#
# Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of The Linux Foundation nor the names of its
#       contributors may be used to endorse or promote products derived from
#       this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED.  IN NO
# EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# DESCRIPTION: DIAG + ADB + MODEM + NMEA + QMI_RMNET + Mass Storage (Android)

echo "Switching to composition number 0x9025"

if [ "$1" = "y" ]; then
	num="1"
else
	num="0"
fi

if [ "$#" -ge 2 ]; then
	delay=$2
else
	delay="0"
fi

if [ "$#" -ge 3 ]; then
	from_adb=$3
else
	from_adb="n"
fi

if [ "$#" -ge 4 ]; then
	quec_force_usb_enable=$4
else
	quec_force_usb_enable=0
fi

if [ "$#" -ge 5 ]; then
	disable_delay=$5
else
	disable_delay=0
fi

echo -e "[usbnet] num=$num,delay=$delay,from_adb=$from_adb,force_enable=$quec_force_usb_enable, disable_delay=$disable_delay\n" > /dev/kmsg


run_9x15() {
	echo 0 > /sys/class/android_usb/android$num/enable
	echo 0x9025 > /sys/class/android_usb/android$num/idProduct
	echo 0x05C6 > /sys/class/android_usb/android$num/idVendor
	echo diag > /sys/class/android_usb/android0/f_diag/clients
	echo smd,tty > /sys/class/android_usb/android0/f_serial/transports
	echo SMD,BAM2BAM > /sys/class/android_usb/android0/f_rmnet/transports
	echo diag,adb,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
	sleep $delay
	echo 1 > /sys/class/android_usb/android$num/enable
}

run_9x25() {
	echo 0 > /sys/class/android_usb/android$num/enable
	echo 0x9025 > /sys/class/android_usb/android$num/idProduct
	echo 0x05C6 > /sys/class/android_usb/android$num/idVendor
	echo diag > /sys/class/android_usb/android0/f_diag/clients
	echo smd,tty > /sys/class/android_usb/android0/f_serial/transports
	echo SMD,BAM2BAM_IPA > /sys/class/android_usb/android0/f_rmnet/transports
	echo diag,adb,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
	sleep $delay
	echo 1 > /sys/class/android_usb/android$num/enable
}

run_9x25_v2() {
	echo 0 > /sys/class/android_usb/android$num/enable
	echo 0x9025 > /sys/class/android_usb/android$num/idProduct
	echo 0x05C6 > /sys/class/android_usb/android$num/idVendor
	echo diag > /sys/class/android_usb/android0/f_diag/clients
	echo smd,tty > /sys/class/android_usb/android0/f_serial/transports
	echo QTI,BAM2BAM_IPA > /sys/class/android_usb/android0/f_rmnet/transports
	echo diag,adb,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
	sleep $delay
	echo 1 > /sys/class/android_usb/android$num/enable
}

run_9x35() {
	if [ $from_adb = "n" ]
	then
		pkill adbd
	fi
	echo 0 > /sys/class/android_usb/android$num/enable
	echo 9025 > /sys/class/android_usb/android$num/idProduct
	echo 05C6 > /sys/class/android_usb/android$num/idVendor
	echo diag > /sys/class/android_usb/android0/f_diag/clients
	echo smd,tty > /sys/class/android_usb/android0/f_serial/transports
	echo QTI,BAM2BAM_IPA > /sys/class/android_usb/android0/f_rmnet/transports
	echo diag,ffs,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
	sleep $delay
	echo 1 > /sys/class/android_usb/android$num/enable
	if [ $from_adb = "n" ]
	then
		/etc/init.d/adbd start
	fi
}

run_9607() {
	QUEC_USB_PID=0125
	QUEC_USB_VID=2C7C
	QUEC_ENABLE_USB=1
	QUEC_USB_NET_TYPE="rmnet"
	USB_TTYGS1=0	# add usb channel if USB_TTYGS1=1, gale 2018-3-5
	QUEC_MANUFCTURE="Android"
	QUEC_PRODUCTINFO="Android"
	
	if [ -f /sbin/usb/compositions/usb_net_type ]
	then 
	QUEC_USB_NET_TYPE=`cat /sbin/usb/compositions/usb_net_type`
	else
	echo "[Max][USB_NET_TYPE_CHECK] usb_net_type NOT exists!" > /dev/kmsg
	fi
	
	if [ -f /sbin/usb/compositions/quec_usb_pid ]
	then 
	QUEC_USB_PID=`cat /sbin/usb/compositions/quec_usb_pid`
	else
	echo "[Max][USB_DEF_ID_CHECK] quec_usb_pid NOT exists!" > /dev/kmsg
        echo $QUEC_USB_PID > /sbin/usb/compositions/quec_usb_pid
        chmod 777 /sbin/usb/compositions/quec_usb_pid
        sync
	fi

	if [ -f /sbin/usb/compositions/quec_usb_vid ]
	then 
	QUEC_USB_VID=`cat /sbin/usb/compositions/quec_usb_vid`
	else
	echo "[Max][USB_DEF_ID_CHECK] quec_usb_vid NOT exists!" > /dev/kmsg
        echo $QUEC_USB_VID > /sbin/usb/compositions/quec_usb_vid
        chmod 777 /sbin/usb/compositions/quec_usb_vid
        sync
	fi

	if [ -f /sbin/usb/compositions/quec_manufcture ]
	then 
	QUEC_MANUFCTURE=`cat /sbin/usb/compositions/quec_manufcture`
	else
	echo "[MANUFCTURE_CHECK]  quec_manufcture NOT exists!" > /dev/kmsg
        echo $QUEC_MANUFCTURE > /sbin/usb/compositions/quec_manufcture
        chmod 777 /sbin/usb/compositions/quec_manufcture
        sync
	fi

	if [ -f /sbin/usb/compositions/quec_product_info ]
	then 
	QUEC_PRODUCTINFO=`cat /sbin/usb/compositions/quec_product_info`
	else
	echo "[PRODUCT_INFO_CHECK] quec_product_info NOT exists!" > /dev/kmsg
        echo $QUEC_PRODUCTINFO > /sbin/usb/compositions/quec_product_info
        chmod 777 > /sbin/usb/compositions/quec_product_info
        sync
	fi

	echo "[Max][USB_DEF_ID_CHECK] USB ID in fs: pid is $QUEC_USB_PID && vid is $QUEC_USB_VID" > /dev/kmsg

	echo "[PAD_CHECK]fs:MANUFCTURE is $QUEC_MANUFCTURE && PRODUCTINFO is $QUEC_PRODUCTINFO" > /dev/kmsg

	if [ -f /sbin/usb/quec_enable_usb ]
	then
		QUEC_ENABLE_USB=`cat /sbin/usb/quec_enable_usb`
	fi

	SERIAL_FUNC="tty,smd,smd"
	USB_FUNC="diag,serial,rmnet"
	if [ -f /sbin/usb/compositions/quec_serial_func ]
	then
		SERIAL_FUNC=`cat /sbin/usb/compositions/quec_serial_func`
        else
                echo $SERIAL_FUNC > /sbin/usb/compositions/quec_serial_func
                chmod 777 /sbin/usb/compositions/quec_serial_func
                sync
	fi

	if [ -f /sbin/usb/compositions/quec_usb_func ]                                     
	then                                                                     
		USB_FUNC=`cat /sbin/usb/compositions/quec_usb_func`                     
	else
                echo $USB_FUNC > /sbin/usb/compositions/quec_usb_func
                chmod 777 /sbin/usb/compositions/quec_usb_func
                sync
        fi 
	
	if [ $QUEC_USB_NET_TYPE == "rndis" ]
	then
		USB_FUNC=${USB_FUNC//,rmnet/""}
		if [ "$USB_FUNC" != "" ]
		then
			USB_FUNC="rndis,$USB_FUNC"
		else
			USB_FUNC="rndis"
		fi
	else
		USB_FUNC=${USB_FUNC//rmnet/$QUEC_USB_NET_TYPE}
	fi
	
	echo "[Max][USB_FUNC_CHECK] QUEC_USB_NET_TYPE=$QUEC_USB_NET_TYPE, USB_FUNC=$USB_FUNC, USB_ENABLE=$QUEC_ENABLE_USB" > /dev/kmsg

	if [ $quec_force_usb_enable -eq 1 ]
	then
	    echo -e "[usbnet] delay $disable_delay to disable usb and then force enable it!\n" > /dev/kmsg
	    sleep $disable_delay
	    QUEC_ENABLE_USB=1
	fi

	if [ $from_adb = "n" ]
	then
		pkill adbd
	fi
	echo 0 > /sys/class/android_usb/android$num/enable
	echo $QUEC_USB_PID > /sys/class/android_usb/android$num/idProduct
	echo $QUEC_USB_VID > /sys/class/android_usb/android$num/idVendor
	echo diag > /sys/class/android_usb/android0/f_diag/clients
	echo 239 > /sys/class/android_usb/android$num/bDeviceClass
	echo 2 > /sys/class/android_usb/android$num/bDeviceSubClass
	echo 1 > /sys/class/android_usb/android$num/bDeviceProtocol
	if [ $USB_TTYGS1 -eq 0 ];then
		echo $SERIAL_FUNC > /sys/class/android_usb/android0/f_serial/transports
	else
		echo $SERIAL_FUNC,tty > /sys/class/android_usb/android0/f_serial/transports
	fi
	echo QTI,BAM_DMUX > /sys/class/android_usb/android0/f_rmnet/transports
	echo BAM_DMUX > /sys/class/android_usb/android0/f_usb_mbim/mbim_transports
	echo $USB_FUNC,ffs > /sys/class/android_usb/android$num/functions
	echo 1 > /sys/class/android_usb/android$num/remote_wakeup
	echo 1 > /sys/class/android_usb/android$num/f_rndis/wceis
	sleep $delay
	#echo 1 > /sys/class/android_usb/android$num/enable

	if [ -f /sbin/usb/compositions/quec_manufcture ]
	then 
	echo $QUEC_MANUFCTURE > /sys/class/android_usb/android$num/iManufacturer
	else
	echo "[MANUFCTURE_CHECK]  quec_manufcture NOT exists!" > /dev/kmsg
	fi

	if [ -f /sbin/usb/compositions/quec_product_info ]
	then 
	echo $QUEC_PRODUCTINFO > /sys/class/android_usb/android$num/iProduct
	else
	echo "[PRODUCT_INFO_CHECK] quec_product_info NOT exists!" > /dev/kmsg
	fi

	if [ "$USB_FUNC" != "" ]
	then
		found_mbim=`echo "$USB_FUNC" | grep "mbim"`
		if [ "$found_mbim" != "" ]
		then
		{
			echo "usb net is mbim! create mbim_ready_state and echo 0" > /dev/kmsg
			echo 0 > /sbin/usb/mbim_ready_state
			chmod 777 /sbin/usb/mbim_ready_state
		}
		else
		{
			echo "usb net is NOT mbim! del mbim_ready_state" > /dev/kmsg
			rm -rf /sbin/usb/mbim_ready_state
		}
		fi
	fi

	
	if [ -f /sbin/usb/compositions/ftm_mbim ]
	then
	    rm -rf /sbin/usb/compositions/ftm_mbim
	    echo  "ftm_mbim is deleted" > /dev/kmsg
	fi

	
	if [ $QUEC_ENABLE_USB = 1 ] && [ "$USB_FUNC" != "" ]
	then
		echo 1 > /sys/class/android_usb/android$num/enable
		echo "[usbnet] enable usb" > /dev/kmsg
	fi
	
	if [ $from_adb = "n" ]
	then
		/etc/init.d/adbd start
	fi
}

	
run_californium() {
	if [ $from_adb = "n" ]
	then
		pkill adbd
	fi
	echo 0 > /sys/class/android_usb/android$num/enable
	echo 9025 > /sys/class/android_usb/android$num/idProduct
	echo 05C6 > /sys/class/android_usb/android$num/idVendor
	echo diag > /sys/class/android_usb/android0/f_diag/clients
	echo smd,tty > /sys/class/android_usb/android0/f_serial/transports
	echo diag,ffs,serial,rmnet_gsi,mass_storage > /sys/class/android_usb/android$num/functions
	echo 1 > /sys/class/android_usb/android$num/remote_wakeup
	sleep $delay
	echo 1 > /sys/class/android_usb/android$num/enable
	if [ $from_adb = "n" ]
	then
		/etc/init.d/adbd start
	fi
}

case `source /sbin/usb/target` in
	*9x15* )
		run_9x15 &
		;;
	*9x25* )
		case `cat /sys/devices/soc0/revision` in
			*1.0* )
				run_9x25 &
				;;
			*2.* )
				run_9x25_v2 &
				;;
			* )
				run_9x25 &
				;;
		esac
		;;
	*9x35* )
		run_9x35 &
		;;
	*9607* )
		run_9607 &
		;;
	*8909* )
		echo "This composition can't be supported on 8909"
		;;
	*9640* )
		run_9x35 &
		;;
	*californium* )
		run_californium &
		;;
	* )
		run_9x15 &
		;;
esac
