CONFIG_DIR=/sys/kernel/config
GADGET_DIR=$CONFIG_DIR/usb_gadget
GADGET_DIR=$CONFIG_DIR/g1
CONFIG_NAME="c.1"
SERIALNUMBER=`getprop ro.serialno`
MANUFACTURER=`getprop ro.product.vendor.manufacturer`
PRODUCT=`getprop ro.product.vendor.model`
PRODUCT_ID_SUFFIX=`getprop ro.usb.pid_suffix`
CONTROLLER=`getprop sys.usb.controller`

write() {
    if [ ! -e "$1" ]; then
        return
    fi
    echo "writing to: $1"
    echo -n "$2" >"$1"
}

symlink() {
    ln -s "$1" "$2"
}

reset_usb() {
    rm $GADGET_DIR/g1/configs/c.1/mtp.mtp
    rm $GADGET_DIR/g1/configs/c.1/ffs.adb
    rm $GADGET_DIR/g1/configs/c.1/rndis_bam.rndis
}

setup_mtp() {
    reset_usb
    write $GADGET_DIR/g1/functions/mtp.mtp/os_desc/interface.MTP/compatible_id "mtp"
    write $GADGET_DIR/g1/configs/c.1/strings/0x409/configuration "mtp"
    symlink $GADGET_DIR/g1/functions/mtp.mtp $GADGET_DIR/g1/configs/c.1
    write $GADGET_DIR/g1/os_desc/use 1
    write $GADGET_DIR/g1/idProduct 0x5${PRODUCT_ID_SUFFIX}
    write $GADGET_DIR/g1/UDC ${CONTROLLER}
    setprop sys.usb.state mtp
}

setup_mtp_adb() {
    reset_usb
    write $GADGET_DIR/g1/functions/mtp.mtp/os_desc/interface.MTP/compatible_id "mtp_adb"
    write $GADGET_DIR/g1/configs/c.1/strings/0x409/configuration "mtp_adb"
    symlink $GADGET_DIR/g1/functions/mtp.gs0 $GADGET_DIR/g1/configs/c.1
    symlink $GADGET_DIR/g1/functions/ffs.adb $GADGET_DIR/g1/configs/c.1
    start android-tools-adbd
    sleep 2
    write $GADGET_DIR/g1/os_desc/use 1
    write $GADGET_DIR/g1/idProduct 0x5${PRODUCT_ID_SUFFIX}
    write $GADGET_DIR/g1/UDC ${CONTROLLER}
    setprop sys.usb.state mtp,adb
}

setup_rndis() {
    write $GADGET_DIR/g1/configs/c.1/strings/0x409/configuration "rndis"
    symlink $GADGET_DIR/g1/functions/rndis_bam.rndis $GADGET_DIR/g1/configs/c.1
    write $GADGET_DIR/g1/UDC ${CONTROLLER}
    setprop sys.usb.state rndis
}

setup_boot() {
    if [ -e /dev/.usb_setup_done ]; then
        echo "Boot setup done"
        return
    fi
    write /sys/class/android_usb/android0/iManufacturer ${MANUFACTURER}
    write /sys/class/android_usb/android0/f_rndis/manufacturer ${MANUFACTURER}
    write /sys/class/android_usb/android0/iProduct ${PRODUCT}
    mkdir /dev/usb-ffs
    mkdir /dev/usb-ffs/adb
    mkdir -p $CONFIG_DIR
    mount -t configfs none $CONFIG_DIR
    mkdir -p $GADGET_DIR/g1
    mkdir -p $GADGET_DIR/g1/strings/0x409
    write $GADGET_DIR/g1/idVendor 0x18D1
    write $GADGET_DIR/g1/bcdDevice 0x0223
    write $GADGET_DIR/g1/bcdUSB 0x0200
    write $GADGET_DIR/g1/os_desc/use 1
    write $GADGET_DIR/g1/strings/0x409/serialnumber ${SERIALNUMBER}
    write $GADGET_DIR/g1/strings/0x409/manufacturer ${MANUFACTURER}
    write $GADGET_DIR/g1/strings/0x409/product ${PRODUCT}
    mkdir -p $GADGET_DIR/g1/functions/mtp.mtp
    mkdir -p $GADGET_DIR/g1/functions/ptp.gs1
    mkdir -p $GADGET_DIR/g1/functions/accessory.gs2
    mkdir -p $GADGET_DIR/g1/functions/audio_source.gs2
    mkdir -p $GADGET_DIR/g1/functions/audio_source.gs3
    mkdir -p $GADGET_DIR/g1/functions/midi.gs5
    mkdir -p $GADGET_DIR/g1/functions/ffs.adb
    mkdir -p $GADGET_DIR/g1/functions/cser.dun.0
    mkdir -p $GADGET_DIR/g1/functions/cser.nmea.1
    mkdir -p $GADGET_DIR/g1/functions/gsi.rmnet
    mkdir -p $GADGET_DIR/g1/functions/gsi.rndis
    mkdir -p $GADGET_DIR/g1/functions/gsi.dpl
    mkdir -p $GADGET_DIR/g1/functions/rndis_bam.rndis
    mkdir -p $GADGET_DIR/g1/functions/rmnet_bam.rmnet
    mkdir -p $GADGET_DIR/g1/functions/rmnet_bam.dpl
    mkdir -p $GADGET_DIR/g1/functions/ncm.0
    mkdir -p $GADGET_DIR/g1/configs/c.1
    mkdir -p $GADGET_DIR/g1/configs/c.1/strings/0x409
    write $GADGET_DIR/g1/os_desc/b_vendor_code 0x1
    write $GADGET_DIR/g1/os_desc/qw_sign "MSFT100"
    write $GADGET_DIR/g1/configs/c.1/MaxPower 500
    write $GADGET_DIR/g1/idProduct 0x0${PRODUCT_ID_SUFFIX}
    symlink $GADGET_DIR/g1/configs/c.1 $GADGET_DIR/g1/os_desc/c.1

    chown root:plugdev $GADGET_DIR
	chown root:plugdev $GADGET_DIR/configs
	chown root:plugdev $GADGET_DIR/configs/c.1

    mkdir -p /dev/usb-ffs/adb
    mount -t functionfs -o uid=32011,gid=32011 adb /dev/usb-ffs/adb
    chown root:plugdev /dev/usb-ffs
    chmod 775 /dev/usb-ffs
    chown root:plugdev /dev/usb-ffs/adb
    chmod 775 /dev/usb-ffs/adb
    chown root:plugdev /dev/mtp_usb
    chmod 660 /dev/mtp_usb
    write /sys/class/android_usb/android0/f_ffs/aliases adb
    touch /dev/.usb_setup_done
}

setup_boot

if [ "$1" = "mtp" ]; then
	setup_mtp
elif [ "$1" = "mtp_adb" ]; then
	setup_mtp_adb
else
	echo "No configuration selected."
fi

exit 0
