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


# ar0130 mn34031 imx104 icx692 ov9715
SNS_A=ar0130

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

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

insert_audio()
{
   insmod acodec.ko
   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
        ar0130)
            #himm 0x20030040 0x0001bfd8;      # VIU port A clock inverse
            himm 0x20030030 0x5;              # Sensor clock 27 MHz
            ;;
        icx692)
            himm 0x200f000c 0x1; #pinmux SPI0
            himm 0x200f0010 0x1; #pinmux SPI0
            himm 0x200f0014 0x1; #pinmux SPI0
            insmod extdrv/ssp_ad9020.ko;;
        mn34031)
            insmod extdrv/ssp_pana.ko;;
        imx104)
            insmod extdrv/ssp.ko;;        
        ov9715)
            insmod extdrv/hi_i2c.ko;;
        *)
            echo "xxxx Invalid sensor type $SNS_A xxxx"
            report_error;;
    esac
}

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

insert_ko()
{
    # low power control
    source ./lowpower.sh > /dev/null

    # pinmux configuration
    source ./pinmux_hi3518.sh mii i2c > /dev/null

    # clock configuration
    source ./clkcfg_hi3518.sh > /dev/null

    # driver load
    insmod mmz.ko mmz=anonymous,0,0x84000000,40M:ddr2,0,0x86800000,24M anony=1 || report_error
    insmod hi3518_base.ko
    insmod hi3518_sys.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 wdt.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/higpio.ko
    #insmod extdrv/gpioi2c.ko
    #insmod extdrv/gpioi2c_ex.ko
    insmod extdrv/pwm.ko
    #insmod extdrv/sil9024.ko norm=5   #720P@60fps

    insert_sns
    insert_audio

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

remove_ko()
{
    remove_audio
    remove_sns

    rmmod sil9024
    rmmod hi_i2c.ko
    rmmod pwm
  #  rmmod gpioi2c

    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 higpio
    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
