#!/bin/sh
# Useage: ./load3518 [ -r|-i|-a ] [ sensor ]
#         -r : rmmod all modules
#         -i : insmod all modules
#    default : rmmod all moules and then insmod them
#


# 0:ar0130_720p 1:9m034 2:icx692 3:imx104 4:ov9712 5:mn34031 6:ar0130_960p 7:soih22  8:ov2710 9:imx122
SNS_A=4

#0:none 1:rt3070 2:mt7601
WIFI=1

MODEL="FI9805W"

MODELVERSION=11

MODELNUM=1

if [ $# -ge 2 ]; then
    SNS_A=$2
fi

if [ $# -ge 3 ]; then
    WIFI=$3
fi

if [ $# -ge 4 ]; then
    MODEL="$4"
fi

if [ $# -ge 5 ]; then
    MODELVERSION=$5
fi

if [ $# -ge 6 ]; then
    MODELNUM=$6
fi

report_error()
{
    echo "******* Error: There's something wrong, please check! *****"
    exit 1
}

insert_audio()
{
   insmod acodec.ko init_delay_time=8000
   insmod hidmac.ko
   insmod hi3518_sio.ko
   insmod hi3518_ai.ko
   insmod hi3518_ao.ko
   insmod hi3518_aenc.ko
   insmod hi3518_adec.ko
    echo "insert audio"
}

remove_audio()
{
    rmmod hi3518_adec
    rmmod hi3518_aenc
    rmmod hi3518_ao
    rmmod hi3518_ai
    rmmod hi3518_sio
    rmmod acodec
    rmmod hidmac
    echo "remove audio"
}

insert_sns()
{
    echo "==== Your input Sensor type is $SNS_A ===="

    case $SNS_A in
        0|6)
            himm 0x20030030 0x5;              #Sensor clock 27 MHz
            ;;
        1)
            himm 0x20030030 0x5;              #Sensor clock 27 MHz
            ;;
        2)
            himm 0x200f000c 0x1;              #pinmux SPI0
            himm 0x200f0010 0x1;              #pinmux SPI0
            himm 0x200f0014 0x1;              #pinmux SPI0
            insmod extdrv/ssp_ad9020.ko;;
        5)
            insmod extdrv/ssp_pana.ko;;
        3|9)
            himm 0x200f000c 0x1;              #pinmux SPI0
            himm 0x200f0010 0x1;              #pinmux SPI0
            himm 0x200f0014 0x1;              #pinmux SPI0
            himm 0x20030030 0x6;              #Sensor clock 37.125 MHz
            insmod extdrv/ssp_sony.ko;;        
        4|7|8)
            himm 0x20030030 0x1;              #Sensor clock 24 MHz
            insmod extdrv/ssp_ad9020.ko;;
        *)
            echo "xxxx Invalid sensor type $SNS_A xxxx"
            report_error;;
    esac
}

remove_sns()
{
    rmmod hi_i2c &> /dev/null
    rmmod ssp &> /dev/null
    rmmod ssp_sony &> /dev/null
}

insert_wifi()
{
    echo "==== Your input Wifi type is $WIFI ===="

    case $WIFI in
    	0)
    		echo "xxxx Not support wifi xxxx"
    		;;
        1)
            insmod extdrv/rtutil3070sta.ko
	    	insmod extdrv/rt3070sta.ko
            insmod extdrv/rtnet3070sta.ko
            ;;
        2)
            insmod extdrv/mtutil7601Usta.ko
	    	insmod extdrv/mt7601Usta.ko
            insmod extdrv/mtnet7601Usta.ko
	    ;;
        *)
            echo "xxxx Invalid wifi type $WIFI xxxx"
            report_error;;
    esac
}

remove_wifi()
{
    echo "==== Your input Wifi type is $WIFI ===="

    case $WIFI in
    	0)
    		echo "xxxx Not support wifi xxxx"
    		;;
        1)
            rmmod rtnet3070sta
	    	rmmod mt7601Usta
	    	rmmod mtutil7601Usta
            ;;
        2)
            rmmod mtnet7601Usta
	    	rmmod rt3070sta
	    	rmmod rtutil3070sta
            ;;
        *)
            echo "xxxx Invalid wifi type $WIFI xxxx"
            report_error;;
    esac
}

insert_ko()
{
	echo "==== Your input model name is $MODEL ===="
    # low power control
    source ./lowpower.sh > /dev/null

    # pinmux configuration
	case $MODELVERSION in
		11|12|13|14)
			case $MODELNUM in
				10|11|17|44)  #"FI9808W"|"FI9808P"|"HD801P"|FC1403P
					source ./pinmux_hi3518.sh mii i2c fi9808w > /dev/null
					;;
				*)
					source ./pinmux_hi3518.sh mii i2c fi9805e > /dev/null
					;;
			esac
			;;
		21|22|23|24)
			case $MODELNUM in
				1001|1002|1003|1004|1005|1006|1007|1008|1009|1010|1011|1045|1012|1013|1014|1015|1029|1025|1026|1042)
				#"FI9803"|"FI9803W"|"FI9803EP"|"HD950"|"HD950W"|"HD950E"|"EH9501"|"EH9502"|"EH9503"|"HD933"|"HD933E"|"FI9853"|"FI9853EP"|"FC6413EP"|"EH9331"|"EH9333"|"FI9851"|"FC5412P"|"FC5413P"|"FC6413"
					source ./pinmux_hi3518.sh mii i2c hd950 > /dev/null
					;;
					1030|1048|1031|1032|1050|1043|1044|1046|1047|1049|1051)
					#"HD931"|"FC6411"|"FI9851W"|"HD931W"|"EH9312"|"FC6411W"|"FC5410EP"|"FI9851P"|"FI9803P"|"EH9311"|"FC5410P"
					source ./pinmux_hi3518.sh mii i2c hd950 > /dev/null
					;;
				1111)
				#"FosBaby"
					source ./pinmux_hi3518.sh mii i2c fosbaby > /dev/null
					;;
				1112|1113)
				#"FosBaby P1""FosBaoPlus"
					source ./pinmux_hi3518.sh rmii i2c fosbabyp1 > /dev/null
					;;	
				1054|1055)
				#"FC2501P"|"FC2501PA"
					source ./pinmux_hi3518.sh rmii i2c fc2501p > /dev/null
					;;
				*)
					source ./pinmux_hi3518.sh rmii i2c fc2403p > /dev/null
					;;
			esac
			;;
		41|42|43|44)
			source ./pinmux_hi3518.sh mii i2c fi9903 > /dev/null
			;;
		*)
			;;
	esac
    # clock configuration
    source ./clkcfg_hi3518.sh > /dev/null

    # driver load
    s=`free |grep "Mem" | awk '{print $2}'`
    if [ $s -gt 102400 ]
    then
    	echo "mem=$s"
    	insmod mmz.ko mmz=anonymous,0,0x8C000000,64M anony=1 || report_error
    else
    	echo "mem=$s"
		case $MODELVERSION in
			21|22|23|24)
				insmod mmz.ko mmz=anonymous,0,0x85C00000,36M anony=1 || report_error
				;;
			*)
				insmod mmz.ko mmz=anonymous,0,0x84000000,64M anony=1 || report_error
				;;
		esac
    fi
    insmod hi3518_base.ko
    insmod hi3518_sys.ko
    insmod hiuser.ko		#must insmod this ko

    insmod hi3518_tde.ko
    insmod hi3518_dsu.ko

    insmod hi3518_viu.ko
    insmod hi3518_isp.ko
    insmod hi3518_vpss.ko
    #insmod hi3518_vou.ko
    #insmod hi3518_vou.ko detectCycle=0 #close dac detect
    #insmod hifb.ko video="hifb:vram0_size:1620"
    
    insmod hi3518_venc.ko
    insmod hi3518_group.ko
    insmod hi3518_chnl.ko
    insmod hi3518_h264e.ko
    insmod hi3518_jpege.ko
    insmod hi3518_rc.ko
    insmod hi3518_region.ko
    
    insmod hi3518_vda.ko
    insmod hi3518_ive.ko

    #insmod extdrv/hi_i2c.ko
    insmod extdrv/hi_i2c_ex.ko	# sensor and shtc1 use it
    insmod extdrv/higpio.ko
    #insmod extdrv/gpioi2c.ko
	case $MODELNUM in
		10|11|17|44) #"FI9808W"|"FI9808P"|"HD801P"|FC1403P
			insmod extdrv/gpioi2c_ex_9808.ko
			;;
		*)
			insmod extdrv/gpioi2c_ex.ko
			;;
	esac
	case $MODELVERSION in
		11|12|13|14)
			insmod extdrv/sha_204.ko
			;;
		*)
			;;
	esac
    insmod extdrv/pwm.ko
    #insmod extdrv/sil9024.ko norm=5   #720P@60fps
	case $MODELVERSION in
		21|22|23|24)
			case $MODELNUM in
				1001|1002|1004|1005|1007|1008|1010|1012|1029|1025|1026)
				#"FI9803"|"FI9803W"|"HD950"|"HD950W"|"EH9501"|"EH9502"|"HD933"|"FI9853"|"FI9851"|"FC5412P"|"FC5413P"
					insmod extdrv/adc.ko ir_set=5223	# GPIO5_2 & GPIO2_3
					;;
					1030|1049|1048|1031|1032|1050|1043)
					#"HD931"|"EH9311"|"FC6411"|"FI9851W"|"HD931W"|"EH9312"|"FC6411W"
					insmod extdrv/adc.ko ir_set=5223	# GPIO5_2 & GPIO2_3
					;;
					1046|1047|1051)
					#"FI9851P"|"FI9803P"|"FC5410P"
					insmod extdrv/adc.ko ir_set=5223	# GPIO5_2 & GPIO2_3
					;;
					1003|1009|1006|1044|1011|1015|1013|1045|1014|1042)
					#"FI9803EP"|"EH9503"|"HD950E"|"FC5410EP"|"FI9853EP"|"EH9333"|"HD933E"|"FC6413EP"|"EH9331"|"FC6413"
					insmod extdrv/adc.ko ir_set=5253	# GPIO5_2 & GPIO5_3
					;;
				1020|1021|1035|1036|1037|1041|1016|1017|1018|1019|1054|1055|1056)
				#"FI9831P V2"|"EH8165"|"FI9826P V2"|"HD818P V2"|"EH8155 V2"|"FI9831E"|"FI9821EP"|"HD816E"|"FI9821P V2"
				#"HD816P V2"|"FC2501P"|"FC2501PA"|"MODEL_FB816")
					insmod extdrv/adc.ko ir_set=5253	# GPIO5_2 & GPIO5_3
					insmod extdrv/gpioi2c_shi.ko
					insmod extdrv/fm1188.ko audio_set=1	# 1:GPIO0_1(18C) 4:GPIO0_4(FOSBABY) 10:GPIO0_1(FOSBABYP1)
				;;
				1111) #"FosBaby"
					insmod extdrv/adc.ko ir_set=5323	# GPIO5_3 & GPIO2_3
					insmod extdrv/gpioi2c_shi.ko
					insmod extdrv/fm1188.ko audio_set=4	# 1:GPIO0_1(18C) 4:GPIO0_4(FOSBABY) 10:GPIO0_1(FOSBABYP1)
					insmod extdrv/ds18b20.ko
				;;
				1112|1113)
				#"FosBaby P1""FosBaoPlus"
					insmod extdrv/adc.ko ir_set=5253	# GPIO5_2 & GPIO5_3
					insmod extdrv/gpioi2c_shi.ko
					insmod extdrv/fm1188.ko audio_set=10 	 # 1:GPIO0_1(18C) 4:GPIO0_4(FOSBABY) 10:GPIO0_1(FOSBABYP1)
					#insmod extdrv/gpioi2c_shtc1.ko		# shtc1 use hi_i2c_ex
					;;
				*)
					insmod extdrv/adc.ko ir_set=5253	# GPIO5_2 & GPIO5_3
					;;
			esac
			;;
		41|42|43|44)
			insmod extdrv/adc.ko ir_set=5253	# GPIO5_2 & GPIO5_3
			;;
		*)
			;;
	esac
    insert_sns
    insert_audio

    insert_wifi

    # system configuration
    source ./sysctl_hi3518.sh > /dev/null
}

remove_ko()
{
    remove_audio
    remove_sns
    rmmod sha_204

    rmmove_wifi

    rmmod sil9024 &> /dev/null
    rmmod hi_i2c.ko &> /dev/null
    rmmod pwm
    rmmod gpioi2c_ex
    rmmod higpio

    rmmod hi3518_ive
    rmmod hi3518_vda

    rmmod hi3518_region
    rmmod hi3518_rc
    rmmod hi3518_jpege
    rmmod hi3518_h264e
    rmmod hi3518_chnl
    rmmod hi3518_group
    rmmod hi3518_venc
  
    #rmmod hifb
    #rmmod hi3518_vou
    rmmod hi3518_vpss
    rmmod hi3518_isp
    rmmod hi3518_viu

    rmmod hi3518_dsu
    rmmod hi3518_tde
  
    rmmod hi3518_sys
    rmmod hi3518_base
    rmmod mmz
}

# load module.
if [ "$1" = "-i" ]
then
    insert_ko
fi

if [ "$1" = "-r" ]
then
    remove_ko
fi

if [ $# -eq 0 ] || [ "$1" = "-a" ]
then
    remove_ko
    insert_ko
fi
