ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/target/linux/mmp/base-files/sbin/464xlat_cfg.sh b/target/linux/mmp/base-files/sbin/464xlat_cfg.sh
new file mode 100755
index 0000000..8b5e889
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/464xlat_cfg.sh
@@ -0,0 +1,90 @@
+#!/bin/sh
+# para 1 add/del/bypass   --- para 2&3&4 needed only in add
+# para 2 cid              --- translate specific skb from v4 to v6
+# para 3 local v4 addr    --- default is 192.0.0.1/32 if not assign
+# para 4 remote v6 prefix --- default is 64:ff9b::/96 if not assign
+
+network_cfg() {
+	if [ "$PIPE" == "1" ]; then
+		uci set network.lan.ipaddr=$gw
+		uci set network.lan.netmask=255.255.255.0
+		uci commit network
+		/etc/init.d/network reload
+		option=`uci get dhcp.lan.dhcp_option`
+		for i in $option
+			do
+			uci del_list dhcp.lan.dhcp_option="$i"
+			done
+		uci set dhcp.lan.start=$host
+		uci set dhcp.lan.limit=1
+		uci add_list dhcp.lan.dhcp_option=3,$gw
+		uci add_list dhcp.lan.dhcp_option=6,8.8.8.8,114.114.114.114
+		uci add_list dhcp.lan.dhcp_option=1,255.255.255.0
+		uci commit dhcp
+		/etc/init.d/dnsmasq reload
+	else
+		ifconfig $iface $ipaddr
+		ip route add default dev $iface
+	fi
+}
+
+if [ -d /sys/kernel/debug/tel/psd/data-pathv1 ]; then
+	psd_ver=data-pathv1
+elif [ -d /sys/kernel/debug/tel/psd/data-pathv3 ]; then
+	psd_ver=data-pathv3
+else
+	echo "464xlat:wrong datapath version" > /dev/kmsg
+	exit 0
+fi
+
+if [ $1 == "del" ]; then
+	echo del nat46 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control
+	exit 0
+fi
+
+if [ $1 == "bypass" ]; then
+	echo 1 > /sys/kernel/debug/tel/psd/$psd_ver/bypass_nat46
+	exit 0
+fi
+
+[ $1 == "add" ] || exit 0
+
+if [ -z $3 ]; then
+	ipaddr=192.0.0.1
+else
+	ipaddr=$3
+fi
+
+if [ -z $4 ]; then
+	remote=64:ff9b::/96
+else
+	remote=$4
+fi
+
+iface=ccinet$2
+
+PIPE=`uci get cmdline.PIPE 2> /dev/null`
+if [ "$PIPE" == "1" ]; then
+	host=`echo $ipaddr | awk -F "." '{print $4}'`
+	gw_host=$((255 - $((host)) ))
+	net=`echo $ipaddr | awk '{split($ipaddr, a, "."); print a[1]"."a[2]"."a[3]}'`
+	gw=$net.$gw_host
+	network_cfg
+	echo "464xlat:ver=$psd_ver,cid=$2,local.v4=$ipaddr,remote.v6=$remote,pipe=$PIPE" > /dev/kmsg
+	local_v6=`cat /sys/kernel/mpipe/devices/$iface/gb6addr`
+	echo $ipaddr > /sys/kernel/mpipe/devices/$iface/ipaddr
+	echo 1 > /sys/kernel/mpipe/devices/$iface/up
+else
+	PIPE=0
+	network_cfg
+	local_v6=`ifconfig ccinet0 | grep Global | awk '{print $3}' | awk -F "/" '{print $1}'`
+	echo "464xlat:ver=$psd_ver,cid=$2,local.v4=$ipaddr,remote.v6=$remote,pipe=$PIPE" > /dev/kmsg
+fi
+
+echo add nat46 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control
+echo config nat46 local.v4 $ipaddr/32 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control
+echo config nat46 local.v6 $local_v6/96 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control
+echo config nat46 local.style RFC6052 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control
+echo config nat46 remote.v6 $remote | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control
+echo config nat46 remote.style RFC6052 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control
+
diff --git a/target/linux/mmp/base-files/sbin/80_mount_root b/target/linux/mmp/base-files/sbin/80_mount_root
new file mode 100755
index 0000000..193fd6a
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/80_mount_root
@@ -0,0 +1,18 @@
+#!/bin/sh
+# Copyright (C) 2006 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+
+do_mount_root() {
+	#mount_root
+	boot_run_hook preinit_mount_root
+	[ -f /sysupgrade.tgz ] && {
+		echo "- config restore -"
+		cd /
+		mv sysupgrade.tgz /tmp
+		tar xzf /tmp/sysupgrade.tgz
+		rm -f /tmp/sysupgrade.tgz
+		sync
+	}
+}
+
+[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_mount_root
diff --git a/target/linux/mmp/base-files/sbin/cmdline2uci b/target/linux/mmp/base-files/sbin/cmdline2uci
new file mode 100755
index 0000000..60d7ad2
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/cmdline2uci
@@ -0,0 +1,24 @@
+#!/bin/sh
+#This script parse /proc/cmdline and set "cmdline" UCI
+
+UCI_TMP_DIR=/var/config
+UCI_FILE=cmdline
+mkdir -p $UCI_TMP_DIR
+touch $UCI_TMP_DIR/$UCI_FILE
+
+CMDLINE=/proc/cmdline
+CMDLINE="$(cat "$CMDLINE" | tr -s " ")"
+COUNTER=1
+CMD=`echo "$CMDLINE" | cut -d " " -f$COUNTER`
+
+while [ -n "$CMD" ]; do
+	KEY=`echo $CMD | cut -d "=" -f1`
+	VALUE=`echo $CMD | cut -d "=" -f2`
+	# If KEY contains "." the uci set will fail
+	uci -c $UCI_TMP_DIR set $UCI_FILE.$KEY=$VALUE 2> /dev/null
+	let COUNTER+=1
+	CMD=`echo "$CMDLINE" | cut -d " " -f$COUNTER`
+done
+
+uci -c $UCI_TMP_DIR commit $UCI_FILE
+mv $UCI_TMP_DIR/$UCI_FILE /etc/config/$UCI_FILE
diff --git a/target/linux/mmp/base-files/sbin/dvc_update_volt.sh b/target/linux/mmp/base-files/sbin/dvc_update_volt.sh
new file mode 100644
index 0000000..6df23de
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/dvc_update_volt.sh
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+volt_step=2
+
+soc_is_asr1901=0
+
+if cat /etc/mversion | grep asr1901 > /dev/null
+then
+	echo "asr1901" > /dev/kmsg
+	pmic_dvl0_reg=0x16
+	pmic_dvl1_reg=0x25
+	pmic_dvl2_reg=0x18
+	pmic_dvl3_reg=0x19
+	soc_is_asr1901=1
+else
+	pmic_ver=`i2cget -y -f 2 0x31 0x0`
+	if [ "$pmic_ver" == "0x12" -o "$pmic_ver" == "0x13" ]
+	then
+		echo "pmic is pm802" > /dev/kmsg
+		pmic_dvl0_reg=0x29
+		pmic_dvl1_reg=0x2a
+		pmic_dvl2_reg=0x2b
+		pmic_dvl3_reg=0x2c
+	else
+		echo "pmic is pm802s or pm803 " > /dev/kmsg
+		pmic_dvl0_reg=0x2b
+		pmic_dvl1_reg=0x2c
+		pmic_dvl2_reg=0x2d
+		pmic_dvl3_reg=0x2e
+	fi
+fi
+
+for reg in $pmic_dvl0_reg $pmic_dvl1_reg $pmic_dvl2_reg $pmic_dvl3_reg
+do
+	if [ "$soc_is_asr1901" == "1" ]
+	then
+		if [ "$reg" == "0x25" ]
+		then
+			old_volt=`i2cget -y -f 3 0x68 $reg`
+		else
+			old_volt=`i2cget -y -f 3 0x21 $reg`
+		fi
+	else
+		old_volt=`i2cget -y -f 2 0x31 $reg`
+	fi
+
+	echo "old reg-$reg volt is: $old_volt" > /dev/kmsg
+	decimal_number=`printf %d $old_volt`
+	if [ "$1" == "sub" ]
+	then
+		new_decimal_number=$((decimal_number - 2))
+	else
+		new_decimal_number=$((decimal_number + 2))
+	fi
+	new_hex_number=$(printf '%x' "$new_decimal_number")
+	echo "new reg-$reg volt is: 0x$new_hex_number" > /dev/kmsg
+
+	if [ "$soc_is_asr1901" == "1" ]
+	then
+		if [ "$reg" == "0x25" ]
+		then
+			i2cset -y -f 3 0x68 $reg 0x$new_hex_number
+		else
+			i2cset -y -f 3 0x21 $reg 0x$new_hex_number
+		fi
+	else
+		i2cset -y -f 2 0x31 $reg 0x$new_hex_number
+	fi
+done
diff --git a/target/linux/mmp/base-files/sbin/flash_crawler b/target/linux/mmp/base-files/sbin/flash_crawler
new file mode 100755
index 0000000..95ad722
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/flash_crawler
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+echo "Scan all mtd partitions to handle bit-flip:"
+mtdX=$(cat /proc/mtd | sed '1d;s/: .*//')
+for mtd in $mtdX; do
+	name="$(awk '/^'$mtd':/{print gensub(/"/,"","g",$4)}' /proc/mtd)"
+	if [ "$name" = "OTA" ]; then
+		continue
+	fi
+
+	echo "Read $name" > /dev/console
+	dd if=/dev/$mtd of=/dev/null bs=4096 2>/dev/null
+	sleep 1
+done
+
diff --git a/target/linux/mmp/base-files/sbin/jffs2reset_mmp b/target/linux/mmp/base-files/sbin/jffs2reset_mmp
new file mode 100755
index 0000000..c6d4975
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/jffs2reset_mmp
@@ -0,0 +1,124 @@
+#!/bin/sh
+SYSCFG_UBIFS_MNT=/tmp/syscfg
+. /lib/functions.sh
+
+# mtdpart: the ubifs syscfg partition
+# overlay: the overlay upper directory
+pre_check() {
+	# return 1 on failed
+	grep -qs ubifs /proc/filesystems ||  return 1
+	grep -qs overlay /proc/filesystems ||  return 1
+	[ ! -e $SYSCFG_UBIFS_MNT ] && mkdir -p $SYSCFG_UBIFS_MNT
+
+	mtdpart="$(find_mtd_part rootfs_data)"
+	[ -z "$mtdpart" ] && return 1
+	mtdpart_idx="$(echo $mtdpart | tr -d "/dev/mtdblock")"
+
+	overlays=$(awk '/overlayfs/ {print $2}' /proc/mounts)
+	return 0
+}
+
+clean_mounted_overlayfs() {
+	echo "first stop respawn app..."
+	/etc/init.d/odhcpd stop
+	/etc/init.d/log stop
+	/etc/init.d/dnsmasq stop
+	/etc/init.d/network stop
+	/etc/init.d/services.init stop
+	/etc/init.d/cm.init stop
+	/etc/init.d/sdcard_mount stop
+
+	echo "then stop other left app..."
+	ps | sed '/ash\|PID\|firstboot\|sed/d;/\[.*\]$/d;s/^ \+//;s/ .*//;/^'$$'$/d;/^'$PPID'$/d' | xargs kill -9
+	sleep 2
+
+	echo "start to umount overlay-fs..."
+	if [ -d /NVM/*data ]; then
+		/bin/umount /NVM/*data
+	fi
+	if [ -d /usr/*web ]; then
+		/bin/umount /usr/*web
+	fi
+	rm -rf /data/*
+	/bin/umount /data /mnt /log
+	/bin/umount /system/etc
+	/bin/umount /NVM
+
+	echo -n "delete files under overlay upper layer... "
+	mtd erase /dev/mtd$mtdpart_idx
+
+	echo "done"
+	return 0
+}
+
+__try_ubifs_syscfg_mount() {
+	overlay_mountpoint=$1
+	if [ -z $overlay_mountpoint ]; then
+		overlay_mountpoint=/overlay
+	fi
+	recover_ubifs=0
+	[ ! -e /dev/ubi0 ] && ubiattach /dev/ubi_ctrl -m $mtdpart_idx -d 0 || recover_ubifs=1
+	if [ $recover_ubifs -eq 0 ]; then
+		ubi0_nod_id=`cat /sys/class/ubi/ubi0/dev | tr -s ":" " "`
+		[ ! -e /dev/ubi0 ] && mknod /dev/ubi0 c ${ubi0_nod_id}
+		if [ ! -e /sys/class/ubi/ubi0_0/dev ]
+		then
+			# no volume
+			recover_ubifs=1
+		else
+			# check for "data" volume
+			ubi0_0_nod_id=`cat /sys/class/ubi/ubi0_0/dev | tr -s ":" " "`
+			[ ! -e /dev/ubi0_0 ] && mknod /dev/ubi0_0 c ${ubi0_0_nod_id}
+			{ ubinfo /dev/ubi0_0 | grep Name  | grep -qs "data" ; } || \
+			recover_ubifs=1
+		fi
+	fi
+	if [ $recover_ubifs -eq 1 ]; then
+		echo "ubifs syscfg partition is damaged"
+		echo "try to recover by formatting $mtdpart..."
+		[ -e /dev/ubi0 ] && ubidetach -m $mtdpart_idx
+		ubiformat -y -q /dev/mtd$mtdpart_idx
+		ubiattach -m $mtdpart_idx /dev/ubi_ctrl
+		ubi0_nod_id=`cat /sys/class/ubi/ubi0/dev | tr -s ":" " "`
+		[ ! -e /dev/ubi0 ] && mknod /dev/ubi0 c ${ubi0_nod_id}
+		ubimkvol /dev/ubi0 -n 1 -N etc -t dynamic -s 5MiB
+		ubimkvol /dev/ubi0 -n 2 -N nvm -t dynamic -s 4MiB
+		ubimkvol /dev/ubi0 -n 0 -N data -t dynamic --maxavsize
+	fi
+
+	# finally mount the ubifs
+	mount -t ubifs -o noatime ubi0:data /data || return 1
+	mount -t ubifs -o noatime ubi0:data /mnt || return 1
+	mount -t ubifs -o noatime ubi0:data /log || return 1
+	mount -t ubifs -o noatime ubi0:etc $overlay_mountpoint/etc || return 1
+	mount -t ubifs -o noatime ubi0:nvm $overlay_mountpoint/nvm || return 1
+	return 0
+}
+
+try_ubifs_syscfg_mount() {
+	__try_ubifs_syscfg_mount || {
+		echo "roofs_data mount fail, try to recover by erase..."
+		mtd erase rootfs_data
+		__try_ubifs_syscfg_mount
+	}
+
+	return 0
+}
+
+if [ "$1" != "-y" ]
+then
+read -p "This will erase all settings and remove any installed packages. Are you sure? [N/y]" answer
+case $answer in
+	[Yy]* ) break;;
+	[Nn]* ) exit 0;;
+	* )     exit 0;;
+esac
+fi
+
+pre_check || exit 1
+if [ -z "$overlays" ]; then
+	echo "try to mount overlayfs"
+	try_ubifs_syscfg_mount || exit 1
+fi
+
+clean_mounted_overlayfs
diff --git a/target/linux/mmp/base-files/sbin/memport_monitor.sh b/target/linux/mmp/base-files/sbin/memport_monitor.sh
new file mode 100755
index 0000000..f6ac60b
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/memport_monitor.sh
@@ -0,0 +1,125 @@
+#!/bin/sh
+
+if cat /etc/mversion | grep pxa1826 > /dev/null
+then
+	echo "1826 has no port monitor feature"
+fi
+
+while [ 1 ]
+do
+        hwacc w 0xc0158500 0x00000000 > /dev/null
+        hwacc w 0xc0158500 0x80008020 > /dev/null
+        hwacc w 0xc0158510 0x00000000 > /dev/null
+        hwacc w 0xc0158510 0x80008020 > /dev/null
+        hwacc w 0xc0158520 0x00000000 > /dev/null
+        hwacc w 0xc0158520 0x80008020 > /dev/null
+        hwacc w 0xc0158530 0x00000000 > /dev/null
+        hwacc w 0xc0158530 0x80008020 > /dev/null
+        sleep 1
+        hwacc w 0xc0158500 0x80008060 > /dev/null
+        hwacc w 0xc0158510 0x80008060 > /dev/null
+        hwacc w 0xc0158520 0x80008060 > /dev/null
+        hwacc w 0xc0158530 0x80008060 > /dev/null
+        echo "----------------------------------------------------"
+        hwacc w 0xc0158500 0x80008070 > /dev/null
+        num=`hwacc r 0xc015850c | sed -n '2 p' | awk '{print $8}`
+        #echo $num
+        num=$((num))
+        num=$((num*16))
+        echo DDR PORT0 read bandwith is $num Bytes/s
+
+        hwacc w 0xc0158500 0x80008072 > /dev/null
+        num=`hwacc r 0xc015850c | sed -n '2 p' | awk '{print $8}`
+        #echo $num
+        num=$((num))
+        num=$((num*16))
+        echo DDR PORT0 write bandwith is $num Bytes/s
+
+        hwacc w 0xc0158500 0x80008065 > /dev/null
+        num=`hwacc r 0xc015850c | sed -n '2 p' | awk '{print $8}`
+        num=$((num))
+        echo DDR PORT0 read latency is $num AXI clock
+
+        hwacc w 0xc0158500 0x8000806D > /dev/null
+        num=`hwacc r 0xc015850c | sed -n '2 p' | awk '{print $8}`
+        num=$((num))
+        echo DDR PORT0 write latency is $num AXI clock
+        echo "================================"
+        #port1
+        hwacc w 0xc0158510 0x80008070 > /dev/null
+        num=`hwacc r 0xc015851c | sed -n '2 p' | awk '{print $8}`
+        #echo $num
+        num=$((num))
+        num=$((num*16))
+        echo DDR PORT1 read bandwith is $num Bytes/s
+
+        hwacc w 0xc0158510 0x80008072 > /dev/null
+        num=`hwacc r 0xc015851c | sed -n '2 p' | awk '{print $8}`
+        #echo $num
+        num=$((num))
+        num=$((num*16))
+        echo DDR PORT1 write bandwith is $num Bytes/s
+
+        hwacc w 0xc0158510 0x80008065 > /dev/null
+        num=`hwacc r 0xc015851c | sed -n '2 p' | awk '{print $8}`
+        num=$((num))
+        echo DDR PORT1 read latency is $num AXI clock
+
+        hwacc w 0xc0158510 0x8000806D > /dev/null
+        num=`hwacc r 0xc015851c | sed -n '2 p' | awk '{print $8}`
+        num=$((num))
+        echo DDR PORT1 write latency is $num AXI clock
+
+        echo "================================"
+        #port2
+        hwacc w 0xc0158520 0x80008070 > /dev/null
+        num=`hwacc r 0xc015852c | sed -n '2 p' | awk '{print $8}`
+        #echo $num
+        num=$((num))
+        num=$((num*16))
+        echo DDR PORT2 read bandwith is $num Bytes/s
+
+        hwacc w 0xc0158520 0x80008072 > /dev/null
+        num=`hwacc r 0xc015852c | sed -n '2 p' | awk '{print $8}`
+        #echo $num
+        num=$((num))
+        num=$((num*16))
+        echo DDR PORT2 write bandwith is $num Bytes/s
+
+        hwacc w 0xc0158520 0x80008065 > /dev/null
+        num=`hwacc r 0xc015852c | sed -n '2 p' | awk '{print $8}`
+        num=$((num))
+        echo DDR PORT2 read latency is $num AXI clock
+
+        hwacc w 0xc0158520 0x8000806D > /dev/null
+        num=`hwacc r 0xc015852c | sed -n '2 p' | awk '{print $8}`
+        num=$((num))
+        echo DDR PORT2 write latency is $num AXI clock
+        echo "================================"
+
+        #port3
+        hwacc w 0xc0158530 0x80008070 > /dev/null
+        num=`hwacc r 0xc015853c | sed -n '2 p' | awk '{print $8}`
+        #echo $num
+        num=$((num))
+        num=$((num*16))
+        echo DDR PORT3 read bandwith is $num Bytes/s
+
+        hwacc w 0xc0158530 0x80008072 > /dev/null
+        num=`hwacc r 0xc015853c | sed -n '2 p' | awk '{print $8}`
+        #echo $num
+        num=$((num))
+        num=$((num*16))
+        echo DDR PORT3 write bandwith is $num Bytes/s
+
+        hwacc w 0xc0158530 0x80008065 > /dev/null
+        num=`hwacc r 0xc015853c | sed -n '2 p' | awk '{print $8}`
+        num=$((num))
+        echo DDR PORT3 read latency is $num AXI clock
+
+
+        hwacc w 0xc0158530 0x8000806D > /dev/null
+        num=`hwacc r 0xc015853c | sed -n '2 p' | awk '{print $8}`
+        num=$((num))
+        echo DDR PORT3 write latency is $num AXI clock
+done
diff --git a/target/linux/mmp/base-files/sbin/mrvl_detect_sdcard b/target/linux/mmp/base-files/sbin/mrvl_detect_sdcard
new file mode 100755
index 0000000..fee319f
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/mrvl_detect_sdcard
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+. /lib/functions.sh
+
+num=0
+path_prefix=/sdcard
+
+link_mount() {
+        local config="$1"
+        local target
+        local path=$path_prefix
+
+        config_get target "$config" target
+        echo $target | grep "mnt" && {
+                grep -qs "$target" /proc/mounts
+                if [ $? -eq 0 ]; then
+                        [ $num -gt 0 ] && path=$path$num
+                        mkdir -p $path
+                        /bin/mount -o noatime,move $target $path
+                        echo $target mounted, soft link created:$path
+                        num=$((num+1))
+                else
+                        echo $target NOT mounted, removing $target
+                        rmdir $target &> /dev/null
+                fi
+        }
+}
+
+config_load fstab
+
+if [ $? -eq 0 ]; then
+
+        # Create a soft link to mounted partitions
+        rm $path_prefix* &> /dev/null
+        config_foreach link_mount mount
+else
+        echo "No SD Card detected"
+fi
diff --git a/target/linux/mmp/base-files/sbin/mrvl_init b/target/linux/mmp/base-files/sbin/mrvl_init
new file mode 100755
index 0000000..8c515b1
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/mrvl_init
@@ -0,0 +1,19 @@
+#!/bin/sh
+# mrvl_init script
+
+echo "Starting Marvell Specific Boot Script"
+
+# trigger panic at oom, and dump memory info
+echo 2 > /proc/sys/vm/panic_on_oom
+echo 1 > /proc/sys/vm/oom_dump_tasks
+# Default Kernel signal handler print-only=1 or ramdump=0xF
+echo 0xF > /proc/sys/kernel/print-fatal-signals
+# constantly clearing cache in background without freezing the application
+echo 2 > /proc/sys/vm/dirty_background_ratio
+# increse the tendency of reclaiming memory used for caching of directory and inode objects
+echo 500 > /proc/sys/vm/vfs_cache_pressure
+#app aslr
+echo 2 > /proc/sys/kernel/randomize_va_space
+echo 1 > /proc/sys/kernel/panic_on_rcu_stall
+
+
diff --git a/target/linux/mmp/base-files/sbin/mrvl_init_aquila b/target/linux/mmp/base-files/sbin/mrvl_init_aquila
new file mode 100755
index 0000000..1b3bb7b
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/mrvl_init_aquila
@@ -0,0 +1,52 @@
+#!/bin/sh
+# mrvl_init script
+
+echo "Starting Marvell Specific Boot Script"
+
+#Set low memory value to 1024K
+echo 2 > /proc/sys/vm/panic_on_oom
+echo 1 > /proc/sys/vm/oom_dump_tasks
+# Default Kernel signal handler print-only=1 or ramdump=0xF
+echo 0xF > /proc/sys/kernel/print-fatal-signals
+echo 1024 > /proc/sys/vm/min_free_kbytes
+echo 3 > /proc/sys/vm/min_free_order_shift
+
+#load modem image
+/bin/sulog &
+/bin/cp_load
+/bin/diag &
+
+#Enable USB configurations
+echo 0 > /sys/class/android_usb/android0/enable
+echo 1286 > /sys/class/android_usb/android0/idVendor
+echo 4e28 > /sys/class/android_usb/android0/idProduct
+echo Marvell > /sys/class/android_usb/android0/iManufacturer
+echo 123456789ABCD > /sys/class/android_usb/android0/iSerial
+
+# iProduct will displayed on Windows
+echo Marvell > /sys/class/android_usb/android0/iProduct
+echo marvell_diag,marvell_debug > /sys/class/android_usb/android0/functions
+echo 239 > /sys/class/android_usb/android0/bDeviceClass
+#echo 1 > /sys/class/android_usb/android0/enable
+
+#Enable USB configurations
+echo 0 > /sys/class/android_usbtel/android0/enable
+echo 1286 > /sys/class/android_usbtel/android0/idVendor
+echo 4e5a > /sys/class/android_usbtel/android0/idProduct
+echo Marvell > /sys/class/android_usbtel/android0/iManufacturer
+echo 123456789ABCD > /sys/class/android_usbtel/android0/iSerial
+
+# iProduct will displayed on Windows
+echo Marvell > /sys/class/android_usbtel/android0/iProduct
+echo usbtel > /sys/class/android_usbtel/android0/win7
+echo usbtel > /sys/class/android_usbtel/android0/win8
+echo usbtel > /sys/class/android_usbtel/android0/apple
+echo win7 > /sys/class/android_usbtel/android0/os
+echo 239 > /sys/class/android_usbtel/android0/bDeviceClass
+echo 1 > /sys/class/android_usbtel/android0/enable
+
+#init usb3 10s later to avoid catstudio waiting too long to get CP image id
+sleep 10
+u3start
+#fot SAAR HAWK - light green led to know board is ON (since we dont have a screen)
+#echo 255 > /sys/devices/soc.0/d4000000.apb/pxa2xx-i2c.0/i2c-0/0-0024/subsystem/drivers/leds-pca963x/0-0070/leds/pca963x\:green/brightness
diff --git a/target/linux/mmp/base-files/sbin/prod_usb_init b/target/linux/mmp/base-files/sbin/prod_usb_init
new file mode 100755
index 0000000..a89e184
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/prod_usb_init
@@ -0,0 +1,84 @@
+#!/bin/sh
+# usb_init script
+
+#wait for telephony ready
+#sleep 5
+#Enable USB configurations
+echo 0 > /sys/class/android_usb/android0/enable
+echo 2ecc > /sys/class/android_usb/android0/idVendor
+echo 3012 > /sys/class/android_usb/android0/idProduct
+echo 0100 > /sys/class/android_usb/android0/bcdDevice
+echo Asrmicro > /sys/class/android_usb/android0/iManufacturer
+
+atdl_mode=`cat /proc/cmdline | grep "LDTA="`
+if [ -n "$atdl_mode" ]; then
+	echo "!!!ATDL mode" > /dev/kmsg
+	#wait for atcmd ready
+	loop_atcmdsrv=0
+	while [ $loop_atcmdsrv -le 20 ]
+	do
+		if [ -e /tmp/atcmdsrv_ok ]; then
+			break
+		else
+			loop_atcmdsrv=$((loop_atcmdsrv+1))
+			sleep 1
+		fi
+	done
+
+	serial_atcmd AT*MRD_SN=R > /tmp/usb_mrd_sn1
+	sed -n '/MRD_SN/p' /tmp/usb_mrd_sn1 > /tmp/usb_mrd_sn2
+	MRD_SNUM=`awk -F ',' '{print $3}' /tmp/usb_mrd_sn2`
+	if [ -n "$MRD_SNUM" ]; then
+		echo "USB_MRD_SN: $MRD_SNUM" > /dev/kmsg
+		echo $MRD_SNUM > /sys/class/android_usb/android0/iSerial
+	else
+		echo 123456789ABCD > /sys/class/android_usb/android0/iSerial
+	fi
+else
+	echo 123456789ABCD > /sys/class/android_usb/android0/iSerial
+fi
+
+# iProduct will displayed on Windows
+echo Asrmicro > /sys/class/android_usb/android0/iProduct
+# store function in node functions if os detect is not compiled, 
+# otherwise the functions are stored in win7/win8/apple
+echo rndis,acm,marvell_diag,marvell_debug,adb > /sys/class/android_usb/android0/functions
+echo rndis,acm,marvell_diag,marvell_debug,adb > /sys/class/android_usb/android0/win7
+echo rndis,acm,marvell_diag,marvell_debug,adb > /sys/class/android_usb/android0/win8
+
+#PIPE mode use rndis, router mode use ncm
+pipemode=`cat /proc/cmdline | grep "PIPE=1"`
+if [ -n $pipemode ]; then
+	echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/olinux
+else
+	echo ncm,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/olinux
+fi
+
+echo ncm > /sys/class/android_usb/android0/apple
+
+#below items are for enumeraton stage2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/win7_s2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/win8_s2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/olinux_s2
+echo ncm > /sys/class/android_usb/android0/apple_s2
+echo win7 > /sys/class/android_usb/android0/os
+echo 239 > /sys/class/android_usb/android0/bDeviceClass
+echo Asrmicro > /sys/class/android_usb/android0/f_rndis/manufacturer
+echo 0bb4 > /sys/class/android_usb/android0/f_rndis/vendorID
+echo 1 > /sys/class/android_usb/android0/f_rndis/wceis
+echo 1 > /sys/class/android_usb/android0/f_acm/instances 
+echo 1 > /sys/class/android_usb/android0/enable
+
+#start mbim early to connect with PC, otherwise AT com port will
+#be blocked for tens of seconds
+[ -e /sys/class/android_usb/android0/win8 ] && {
+	mbim_enabled=`cat /sys/class/android_usb/android0/win8 | grep mbim`
+	if [ -n "$mbim_enabled" ]; then
+		/bin/mbim &
+	fi
+}
+
+if cat /proc/cmdline | grep "CPLOG=1" > /dev/null
+then
+	/bin/sulog &
+fi
diff --git a/target/linux/mmp/base-files/sbin/rdp_transfer b/target/linux/mmp/base-files/sbin/rdp_transfer
new file mode 100755
index 0000000..6bde6fa
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/rdp_transfer
@@ -0,0 +1,580 @@
+#!/bin/sh
+# Set variable upload_over: DUMP media sequence
+# 1: SD -> USB, try usb no matter SD pass or fail for internal auto tool flow
+# 2: SD -> FLASH -> USB, reboot on any success
+# 3: SD->FLASH, reboot on any success, stall on final fail
+# 4: SD->FLASH, reboot on any success, reboot on final fail
+# 5: USB Only
+
+upload_over=5	#default mode
+
+if [ ! -e /dev/rdr ]; then
+	echo No RAMDUMP found > /dev/kmsg
+	exit 0
+fi
+
+echo =========================================== > /dev/kmsg
+echo RAMDUMP prepared by U-boot in RAM found > /dev/kmsg
+echo Script $0 is running > /dev/kmsg
+echo upload_over == $upload_over > /dev/kmsg
+
+# Use fixed File-Name:
+#	RDNAME=RAMDUMP0000
+# Use File-Name with RAMDUMP_YYMMDD-HHMM:
+RDNAME=RAMDUMP_$(date +%y%m%d-%H%M)
+CPDUMPNAME=cpdump_$(date +%y%m%d-%H%M)
+COMDDRNAME=COM_DDR_$(date +%y%m%d-%H%M)
+DSPDDRNAME=DSP_DDR_$(date +%y%m%d-%H%M)
+BMBUFFNAME=bm_buffer_$(date +%y%m%d-%H%M)
+ADSPSHMNAME=adsp_shm_$(date +%y%m%d-%H%M)
+ADSPDTCMNAME=adsp_dtcm_$(date +%y%m%d-%H%M)
+ADSPDDRNAME=adsp_ddr_$(date +%y%m%d-%H%M)
+ADSPSQUNAME=adsp_squ_$(date +%y%m%d-%H%M)
+
+#flash dump name should be fixed name
+AP_DUMPTXT=ap_dump.txt
+AP_DUMPGZ=ap_dump.gz
+COM_CP_DUMP=com_RW_DDR.bin
+COM_DSP_DUMP=com_dsp_ddr.bin
+
+FBMBUFFNAME=bm_buffer
+FADSPSHMNAME=adsp_shm
+FADSPDTCMNAME=adsp_dtcm
+FADSPDDRNAME=adsp_ddr
+FADSPSQUNAME=adsp_squ
+
+SD_DUMP_DIR=/sdcard/modem_dump/
+FLASH_DUMP_DIR=/data/modem_dump/
+
+iscpdump=`cat /proc/cmdline | grep "cpdump"`
+
+function no_usbdump_reboot {
+	echo "=========NO usbdump rboot" > /dev/kmsg
+	sync
+	sleep 3
+	sync
+	echo "reboot" > /dev/kmsg
+	# Clear ramdump descriptor before restart
+	echo c > /dev/rdr
+	ifconfig usbnet0 down
+	echo 0 > /sys/class/android_usb/android0/enable
+	reboot
+	exit 0
+}
+
+function sd_dump {
+	/etc/init.d/sdcard_mount start
+	sleep 5
+
+	if [ ! -e /sdcard ]; then
+		echo "no /sdcard directory" > /dev/kmsg
+		return 1
+	fi
+
+	if [ ! -e "$SD_DUMP_DIR" ]; then
+		echo "mkdir /sdcard/modem_dump" > /dev/kmsg
+		mkdir -p $SD_DUMP_DIR
+	fi
+
+	if [ ! -e "$SD_DUMP_DIR" ]; then
+		echo "!!!!!no /sdcard/modem_dump directory" > /dev/kmsg
+		return 1
+	fi
+
+	if [ -n "$iscpdump" ]; then
+		echo t > /dev/rdr
+		cp /dev/rdr $SD_DUMP_DIR/$COMDDRNAME.bin
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "sd dump CP image failed" > /dev/kmsg
+			return 1
+		fi
+
+		echo d > /dev/rdr
+		cp /dev/rdr $SD_DUMP_DIR/$DSPDDRNAME.bin
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "sd dump DSP image failed" > /dev/kmsg
+			return 1
+		fi
+
+		if [ -e /sys/kernel/debug/adsp/adsp_shm ]; then
+			echo "sd dump adsp_shm" > /dev/kmsg
+			cp /sys/kernel/debug/adsp/adsp_shm $SD_DUMP_DIR/$ADSPSHMNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "sd dump adsp_shm failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+
+		if [ -e /sys/kernel/debug/adsp/adsp_dtcm ]; then
+			echo "sd dump adsp_dtcm" > /dev/kmsg
+			cp /sys/kernel/debug/adsp/adsp_dtcm $SD_DUMP_DIR/$ADSPDTCMNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "sd dump adsp_dtcm failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+
+		if [ -e /sys/kernel/debug/adsp/adsp_ddr ]; then
+			echo "sd dump adsp_ddr" > /dev/kmsg
+			cp /sys/kernel/debug/adsp/adsp_ddr $SD_DUMP_DIR/$ADSPDDRNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "sd dump adsp_ddr failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+
+
+		if [ -e /sys/kernel/debug/adsp/adsp_squ ]; then
+			echo "sd dump adsp_squ" > /dev/kmsg
+			cp /sys/kernel/debug/adsp/adsp_squ $SD_DUMP_DIR/$ADSPSQUNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "sd dump adsp_squ failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+
+		if [ -e /sys/kernel/debug/bm/buffer ]; then
+			echo "sd dump bm_buffer" > /dev/kmsg
+			cp /sys/kernel/debug/bm/buffer $SD_DUMP_DIR/$BMBUFFNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "sd dump bm_buffer failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+	else
+		echo t > /dev/rdr
+		cp /dev/rdr $SD_DUMP_DIR/$RDNAME.txt
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "!!!!!!!!!!sd dump txt image failed" > /dev/kmsg
+			return 1
+		fi
+
+		echo d > /dev/rdr
+		cp /dev/rdr $SD_DUMP_DIR/$RDNAME.gz
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "!!!!!!!!!!sd dump GZ image failed" > /dev/kmsg
+			return 1
+		fi
+	fi
+
+	return 0
+}
+
+function flash_dump {
+	if [ ! -e "$FLASH_DUMP_DIR" ]; then
+		echo "mkdir $FLASH_DUMP_DIR" > /dev/kmsg
+		mkdir -p $FLASH_DUMP_DIR
+	fi
+
+	if [ ! -e "$FLASH_DUMP_DIR" ]; then
+		echo "!!!!!no $FLASH_DUMP_DIR" > /dev/kmsg
+		return 1
+	fi
+
+	#remove the old dump files, as flash space is limited
+	rm $FLASH_DUMP_DIR/*
+
+	if [ -n "$iscpdump" ]; then
+		echo t > /dev/rdr
+		cp /dev/rdr $FLASH_DUMP_DIR/$COM_CP_DUMP
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "flash dump CP image failed" > /dev/kmsg
+			rm $FLASH_DUMP_DIR/$COM_CP_DUMP
+			return 1
+		fi
+
+		echo d > /dev/rdr
+		cp /dev/rdr $FLASH_DUMP_DIR/$COM_DSP_DUMP
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "flash dump DSP image failed" > /dev/kmsg
+			rm $COM_DSP_DUMP
+			return 1
+		fi
+
+		if [ -e /sys/kernel/debug/adsp/adsp_shm ]; then
+			echo "flash dump adsp_shm" > /dev/kmsg
+			cp /sys/kernel/debug/adsp/adsp_shm $FLASH_DUMP_DIR/$FADSPSHMNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "flash dump adsp_shm failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+
+		if [ -e /sys/kernel/debug/adsp/adsp_dtcm ]; then
+			echo "flash dump adsp_dtcm" > /dev/kmsg
+			cp /sys/kernel/debug/adsp/adsp_dtcm $FLASH_DUMP_DIR/$FADSPDTCMNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "flash dump adsp_dtcm failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+
+		if [ -e /sys/kernel/debug/adsp/adsp_ddr ]; then
+			echo "flash dump adsp_ddr" > /dev/kmsg
+			cp /sys/kernel/debug/adsp/adsp_ddr $FLASH_DUMP_DIR/$FADSPDDRNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "flash dump adsp_ddr failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+
+		if [ -e /sys/kernel/debug/adsp/adsp_squ ]; then
+			echo "flash dump adsp_squ" > /dev/kmsg
+			cp /sys/kernel/debug/adsp/adsp_squ $FLASH_DUMP_DIR/$FADSPSQUNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "flash dump adsp_squ failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+
+		if [ -e /sys/kernel/debug/bm/buffer ]; then
+			echo "flash dump bm_buffer" > /dev/kmsg
+			cp /sys/kernel/debug/bm/buffer $FLASH_DUMP_DIR/$FBMBUFFNAME.bin
+			result=$?
+			if [ $result -ne 0 ]; then
+				echo "flash dump bm_buffer failed" > /dev/kmsg
+				return 1
+			fi
+		fi
+	else
+		echo t > /dev/rdr
+		cp /dev/rdr $FLASH_DUMP_DIR/$AP_DUMPTXT
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "!!!!!!!!!!flash dump txt image failed" > /dev/kmsg
+			rm $FLASH_DUMP_DIR/$AP_DUMPTXT
+			return 1
+		fi
+
+		echo d > /dev/rdr
+		cp /dev/rdr $FLASH_DUMP_DIR/$AP_DUMPGZ
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "!!!!!!!!!!flash dump GZ image failed" > /dev/kmsg
+			rm $FLASH_DUMP_DIR/$AP_DUMPGZ
+			return 1
+		fi
+	fi
+
+	return 0
+}
+
+
+# 1: SD -> USB, try usb no matter SD pass or fail for internal auto tool flow
+# 2: SD -> FLASH -> USB, reboot on any success
+# 3: SD->FLASH, reboot on any success, stall on final fail
+# 4: SD->FLASH, reboot on any success, reboot on final fail
+if [ $upload_over -eq 1 ]; then
+	sd_dump
+	result=$?
+	if [ $result -eq 0 ]; then
+		echo "=========sd dump success" > /dev/kmsg
+	fi
+elif [ $upload_over -eq 2 ]; then
+	sd_dump
+	result=$?
+	if [ $result -eq 0 ]; then
+		echo "=========sd dump success" > /dev/kmsg
+		no_usbdump_reboot
+	fi
+	flash_dump
+	result=$?
+	if [ $result -eq 0 ]; then
+		echo "=========flash dump success" > /dev/kmsg
+		no_usbdump_reboot
+	fi
+elif [ $upload_over -eq 3 ]; then
+	sd_dump
+	result=$?
+	if [ $result -eq 0 ]; then
+		echo "=========sd dump success" > /dev/kmsg
+		no_usbdump_reboot
+	fi
+	flash_dump
+	result=$?
+	if [ $result -eq 0 ]; then
+		echo "=========flash dump success" > /dev/kmsg
+		no_usbdump_reboot
+	fi
+	#stall on fail
+	while [ 1 ]
+	do
+		sleep 100
+	done
+elif [ $upload_over -eq 4 ]; then
+	sd_dump
+	result=$?
+	if [ $result -eq 0 ]; then
+		echo "=========sd dump success" > /dev/kmsg
+		no_usbdump_reboot
+	fi
+	flash_dump
+	result=$?
+	if [ $result -eq 0 ]; then
+		echo "=========flash dump success" > /dev/kmsg
+		no_usbdump_reboot
+	fi
+	no_usbdump_reboot
+else
+	echo "don't check storage media" > /dev/kmsg
+fi
+
+FTP_SERV_IP=""
+loop_net=0
+#leave 3 days(for weekend test, 259200 secs) to check network on
+while [ $loop_net -le 259200 -a -z $FTP_SERV_IP ]
+do
+	if [ -z "$1" ]; then
+		cat /proc/net/arp > /tmp/tmp_arp1
+		sed -n '/br-lan/p' /tmp/tmp_arp1 > /tmp/tmp_arp2
+		sed -n '/0x2/p' /tmp/tmp_arp2 > /tmp/sed_arp_output
+		sed -n '1p' /tmp/sed_arp_output > /tmp/ip_string1
+		sed -n '2p' /tmp/sed_arp_output > /tmp/ip_string2
+		FTP_SERV_IP=`awk '{print $1}' /tmp/ip_string1`
+		echo $FTP_SERV_IP > /dev/kmsg
+		local_ip=`echo $FTP_SERV_IP |grep 192.168`
+		if [ -n "$local_ip" ]; then
+			break
+		fi
+		FTP_SERV_IP=`awk '{print $1}' /tmp/ip_string2`
+		local_ip=`echo $FTP_SERV_IP |grep 192.168`
+		echo $FTP_SERV_IP > /dev/kmsg
+		if [ -n "$local_ip" ]; then
+			break
+		fi
+	else
+		FTP_SERV_IP=$1
+	fi
+	loop_net=$((loop_net+1))
+	echo Searching PC SRV to dump image ... > /dev/kmsg
+	sleep 1
+done
+
+if [ -z "$FTP_SERV_IP" ]; then
+	echo "!!!!!!!!!!!!! Can't find any SRV PC to dump image" > /dev/kmsg
+	exit 0
+else
+	echo FTP_SERV_IP $FTP_SERV_IP > /dev/kmsg
+fi
+
+#if [ $upload_over -eq 1 ]; then
+#	echo ...Upload to SD /sdcard/$RDNAME.* > /dev/kmsg
+#	#echo t > /dev/rdr	- default
+#	cp /dev/rdr /sdcard/$RDNAME.txt
+#	echo d > /dev/rdr
+#	cp /dev/rdr /sdcard/$RDNAME.gz
+#	result=$?
+#fi
+
+if [ 1 ]; then
+	echo ...Upload to TFTP $FTP_SERV_IP > /dev/kmsg
+	loop=0
+	#wait for enough time to prepare the PC server
+	#the timeout is for weekend time(3 days)
+	while [ $loop -le 259200 ]
+	do
+		echo t > /dev/rdr
+
+		if [ -n "$iscpdump" ]; then
+			tftp -p -l /dev/rdr -r $COMDDRNAME.bin $FTP_SERV_IP
+		else
+			tftp -p -l /dev/rdr -r $RDNAME.txt $FTP_SERV_IP
+		fi
+
+		result=$?
+		if [ $result -eq 0 ]; then
+			echo "======dump text ok" > /dev/kmsg
+			echo d > /dev/rdr
+			if [ -n "$iscpdump" ]; then
+				busybox tftp -p -l /dev/rdr -r $DSPDDRNAME.bin $FTP_SERV_IP
+			else
+				busybox tftp -p -l /dev/rdr -r $RDNAME.gz $FTP_SERV_IP
+			fi
+			result=$?
+		fi
+
+		if [ $result -eq 0 ]; then
+			# Uploaded with ok. Exit loop
+			echo "======dump gz ok" > /dev/kmsg
+			if [ -n "$iscpdump" ]; then
+				if [ ! -e /log/cp_dump.tar.gz ]; then
+					echo ================= cpdump image does not exsit > /dev/kmsg
+					loop=400000
+				else
+					tftp -p -l /log/cp_dump.tar.gz -r $CPDUMPNAME.tar.gz $FTP_SERV_IP
+					result=$?
+					if [ $result -eq 0 ]; then
+						# Uploaded with ok. Exit loop
+						echo "======cp dump transfer ok" > /dev/kmsg
+						loop=400000
+					else
+						# No answer from server or error. Try again
+						loop=$((loop+1))
+						echo TFTP uploading cpdump retry ... > /dev/kmsg
+						sleep 2
+					fi
+				fi
+			else
+				echo "======no cp assert dump done" > /dev/kmsg
+				loop=400000
+			fi
+		else
+			# No answer from server or error. Try again
+			loop=$((loop+1))
+			echo TFTP uploading RDP retry ... > /dev/kmsg
+			sleep 2
+		fi
+	done
+fi
+
+if [ -n "$iscpdump" ]; then
+	if [ ! -e /sys/kernel/debug/bm/buffer ]; then
+		echo ================= no bm_buffer to be dump > /dev/kmsg
+	else
+		tftp -p -l /sys/kernel/debug/bm/buffer -r $BMBUFFNAME.bin $FTP_SERV_IP
+		result=$?
+		if [ $result -eq 0 ]; then
+			# Uploaded with ok. Exit loop
+			echo "======bm buffer dump ok" > /dev/kmsg
+		else
+			#try again
+			echo "======retry to dump bm buffer" > /dev/kmsg
+			tftp -p -l /sys/kernel/debug/bm/buffer -r $BMBUFFNAME.bin $FTP_SERV_IP
+			result=$?
+			if [ $result -eq 0 ]; then
+				# Uploaded with ok. Exit loop
+				echo "======bm buffer dump ok" > /dev/kmsg
+			else
+				echo "======bm buffer dump failed" > /dev/kmsg
+			fi
+		fi
+	fi
+fi
+
+#dump ADSP bins
+if [ -n "$iscpdump" ]; then
+	if [ ! -e /sys/kernel/debug/adsp/adsp_shm ]; then
+		echo ================= no adsp_shm to dump > /dev/kmsg
+	else
+		tftp -p -l /sys/kernel/debug/adsp/adsp_shm -r $ADSPSHMNAME.bin $FTP_SERV_IP
+		result=$?
+		if [ $result -eq 0 ]; then
+			# Uploaded with ok. Exit loop
+			echo "======adsp_shm dump ok" > /dev/kmsg
+		else
+			#try again
+			echo "======retry to dump adsp_shm" > /dev/kmsg
+			tftp -p -l /sys/kernel/debug/adsp/adsp_shm -r $ADSPSHMNAME.bin $FTP_SERV_IP
+			result=$?
+			if [ $result -eq 0 ]; then
+				# Uploaded with ok. Exit loop
+				echo "======adsp_shm dump ok" > /dev/kmsg
+			else
+				echo "======dump adsp_shm failed" > /dev/kmsg
+			fi
+		fi
+	fi
+
+	if [ ! -e /sys/kernel/debug/adsp/adsp_dtcm ]; then
+		echo ================= no adsp_dtcm to dump > /dev/kmsg
+	else
+		tftp -p -l /sys/kernel/debug/adsp/adsp_dtcm -r $ADSPDTCMNAME.bin $FTP_SERV_IP
+		result=$?
+		if [ $result -eq 0 ]; then
+			# Uploaded with ok. Exit loop
+			echo "======adsp_dtcm dump ok" > /dev/kmsg
+		else
+			#try again
+			echo "======retry to dump adsp_dtcm" > /dev/kmsg
+			tftp -p -l /sys/kernel/debug/adsp/adsp_dtcm -r $ADSPDTCMNAME.bin $FTP_SERV_IP
+			result=$?
+			if [ $result -eq 0 ]; then
+				# Uploaded with ok. Exit loop
+				echo "======adsp_dtcm dump ok" > /dev/kmsg
+			else
+				echo "======dump adsp_dtcm failed" > /dev/kmsg
+			fi
+		fi
+	fi
+
+	if [ ! -e /sys/kernel/debug/adsp/adsp_ddr ]; then
+		echo ================= no adsp_ddr to dump > /dev/kmsg
+	else
+		tftp -p -l /sys/kernel/debug/adsp/adsp_ddr -r $ADSPDDRNAME.bin $FTP_SERV_IP
+		result=$?
+		if [ $result -eq 0 ]; then
+			# Uploaded with ok. Exit loop
+			echo "======adsp_ddr dump ok" > /dev/kmsg
+		else
+			#try again
+			echo "======retry to dump adsp_ddr" > /dev/kmsg
+			tftp -p -l /sys/kernel/debug/adsp/adsp_ddr -r $ADSPDDRNAME.bin $FTP_SERV_IP
+			result=$?
+			if [ $result -eq 0 ]; then
+				# Uploaded with ok. Exit loop
+				echo "======adsp_ddr dump ok" > /dev/kmsg
+			else
+				echo "======dump adsp_ddr failed" > /dev/kmsg
+			fi
+		fi
+	fi
+
+	if [ ! -e /sys/kernel/debug/adsp/adsp_squ ]; then
+		echo ================= no adsp_squ to dump > /dev/kmsg
+	else
+		tftp -p -l /sys/kernel/debug/adsp/adsp_squ -r $ADSPSQUNAME.bin $FTP_SERV_IP
+		result=$?
+		if [ $result -eq 0 ]; then
+			# Uploaded with ok. Exit loop
+			echo "======adsp_squ dump ok" > /dev/kmsg
+		else
+			#try again
+			echo "======retry to dump adsp_squ" > /dev/kmsg
+			tftp -p -l /sys/kernel/debug/adsp/adsp_squ -r $ADSPSQUNAME.bin $FTP_SERV_IP
+			result=$?
+			if [ $result -eq 0 ]; then
+				# Uploaded with ok. Exit loop
+				echo "======adsp_squ dump ok" > /dev/kmsg
+			else
+				echo "======dump adsp_squ failed" > /dev/kmsg
+			fi
+		fi
+	fi
+fi
+
+if [ $loop -ne 400000 ]; then
+	echo "!!!!!!!!!!!!!!!!!ramdump failed, please check tftp server or firewall" > /dev/kmsg
+	exit 0
+fi
+
+echo RAMDUMP upload finished with $result ----- Re-Start ---- > /dev/kmsg
+# Clear ramdump descriptor before restart
+echo c > /dev/rdr
+
+echo "sending rdp_ok.txt to server" > /dev/kmsg
+echo "rdp_ok" > /tmp/rdp_ok.txt
+tftp -p -l /tmp/rdp_ok.txt -r rdp_ok.txt $FTP_SERV_IP
+
+echo "sleep 15s for auto test" > /dev/kmsg
+sleep 15
+
+ifconfig usbnet0 down
+echo 0 > /sys/class/android_usb/android0/enable
+
+reboot
+
diff --git a/target/linux/mmp/base-files/sbin/rdp_usb_init b/target/linux/mmp/base-files/sbin/rdp_usb_init
new file mode 100755
index 0000000..56f238f
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/rdp_usb_init
@@ -0,0 +1,53 @@
+#!/bin/sh
+# rdp_usb_init script
+
+#wait for telephony ready
+#sleep 5
+#Enable USB configurations
+echo 0 > /sys/class/android_usb/android0/enable
+echo 2ecc > /sys/class/android_usb/android0/idVendor
+echo 2004 > /sys/class/android_usb/android0/idProduct
+echo 0100 > /sys/class/android_usb/android0/bcdDevice
+echo Asrmicro > /sys/class/android_usb/android0/iManufacturer
+
+atdl_mode=`cat /proc/cmdline | grep "LDTA="`
+if [ -n "$atdl_mode" ]; then
+	echo "!!!ATDL mode" > /dev/kmsg
+	#wait for atcmd ready
+	sleep 5
+
+	serial_atcmd AT*MRD_SN=R > /tmp/usb_mrd_sn1
+	sed -n '/MRD_SN/p' /tmp/usb_mrd_sn1 > /tmp/usb_mrd_sn2
+	MRD_SNUM=`awk -F ',' '{print $3}' /tmp/usb_mrd_sn2`
+	if [ -n "$MRD_SNUM" ]; then
+		echo "USB_MRD_SN: $MRD_SNUM" > /dev/kmsg
+		echo $MRD_SNUM > /sys/class/android_usb/android0/iSerial
+	else
+		echo 123456789ABCD > /sys/class/android_usb/android0/iSerial
+	fi
+else
+	echo 123456789ABCD > /sys/class/android_usb/android0/iSerial
+fi
+# iProduct will displayed on Windows
+echo Asrmicro > /sys/class/android_usb/android0/iProduct
+# store function in node functions if os detect is not compiled, 
+# otherwise the functions are stored in win7/win8/apple
+echo rndis,adb > /sys/class/android_usb/android0/functions
+echo rndis,adb > /sys/class/android_usb/android0/win7
+echo rndis,adb > /sys/class/android_usb/android0/win8
+echo rndis,adb > /sys/class/android_usb/android0/olinux
+echo ecm > /sys/class/android_usb/android0/apple
+
+#below items are for enumeraton stage2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/win7_s2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/win8_s2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/olinux_s2
+echo ncm > /sys/class/android_usb/android0/apple_s2
+echo win7 > /sys/class/android_usb/android0/os
+echo 239 > /sys/class/android_usb/android0/bDeviceClass
+echo Asrmicro > /sys/class/android_usb/android0/f_rndis/manufacturer
+echo 0bb4 > /sys/class/android_usb/android0/f_rndis/vendorID
+echo 1 > /sys/class/android_usb/android0/f_rndis/wceis
+echo 1 > /sys/class/android_usb/android0/f_acm/instances 
+echo 1 > /sys/class/android_usb/android0/enable
+
diff --git a/target/linux/mmp/base-files/sbin/run_ims.sh b/target/linux/mmp/base-files/sbin/run_ims.sh
new file mode 100755
index 0000000..95288f7
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/run_ims.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# run IMS on spesific APN
+# CID7 must be free for MO PDP used by IMS
+# If IMS use MT PDP on ccinet4 instead wsetup script must be called before
+#
+
+APN=$1
+CID=7
+
+## check AT channel
+status=`serial_atcmd "AT" | grep OK`
+if [ -z "$status" ]; then
+		echo "AT CHANNEL ERROR"
+		exit 1
+fi
+
+status=`serial_atcmd "AT+CGPIAF=0,0,0,0" | grep OK`
+if [ -z "$status" ]; then
+		echo "AT CHANNEL ERROR"
+		exit 1
+fi
+
+if [ -n "$APN" ]; then
+	## configure IMS APN
+	status=`serial_atcmd "AT*IMSCFG=KEY_IMS_PDP_APN,$APN" | grep OK`
+	if [ -z "$status" ]; then
+			echo "AT CHANNEL ERROR"
+			exit 1
+	fi
+fi
+
+ifup wan6$CID
+
+## enable IMS
+status=`serial_atcmd "AT*IMSCFG=KEY_IMS_SUPPORT,true" | grep OK`
+if [ -z "$status" ]; then
+		echo "AT CHANNEL ERROR"
+		exit 1
+fi
diff --git a/target/linux/mmp/base-files/sbin/stresstest.sh b/target/linux/mmp/base-files/sbin/stresstest.sh
new file mode 100755
index 0000000..79682eb
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/stresstest.sh
@@ -0,0 +1,167 @@
+#!/bin/sh
+
+#NOTE: dvc_update_volt.sh is set as root-only executable in read only directory /sbin/
+#NOTE: better to move dvc_update_volt.sh to writtable directory, such /data
+#NOTE: better to remove dvc_update_volt.sh after doing system test
+#NOTE: be careful to check if dvc_update_volt.sh is executed correctly from dmesg log
+#NOTE: dvc_update_volt.sh is to reduce voltage before doing stress test
+#NOTE: default is reduce 25mv in dvc_update_volt.sh, can change it to other value if needed
+
+
+#reduce_volt=1
+
+trap 'onCtrlC' INT
+function onCtrlC () {
+	echo strestestcpu > /sys/power/cpu_freq_max_pm_unqos
+	echo strestestddr > /sys/power/ddr_devfreq_min_pm_unqos
+	echo strestestcpu > /sys/power/cpu_freq_min_pm_unqos
+	echo strestestddr > /sys/power/ddr_devfreq_max_pm_unqos
+	[ -e /data/stresstfile ] && rm /data/stresstfile
+	echo "Exit 0 on Ctrl+C" > /dev/kmsg
+	exit 0
+}
+
+if [ -z $1 -o -z $2 ]; then
+	echo "!!!!!!!!no runtime_sec and test idx specified" > /dev/kmsg
+	exit 1
+fi
+
+echo "runtime " $1 > /dev/kmsg
+echo "stress test " $2 > /dev/kmsg
+result=0
+# $2: 0 - mem test 1 - mem+flash test
+if [ $2 -eq 0 ]; then
+	# set cpufreq max to 416000 and ddrfreq min to 2000000
+	echo strestestcpu 416000 > /sys/power/cpu_freq_max_pm_qos
+	echo strestestcpu 416000 > /sys/power/cpu_freq_min_pm_qos
+	echo strestestddr 2000000 > /sys/power/ddr_devfreq_max_pm_qos
+	echo strestestddr 2000000 > /sys/power/ddr_devfreq_min_pm_qos
+
+	if [ "$reduce_volt" == "1" ]
+	then
+		serial_atcmd at+cfun=0
+		sync
+		echo 3 > /proc/sys/vm/drop_caches
+		[ -e "/sbin/dvc_update_volt.sh" ] && /sbin/dvc_update_volt.sh sub
+	fi
+
+	free_mem_kbytes=`sed -n '2p' /proc/meminfo | awk '{print $(NF-1)}'`
+	echo "Free_KB:" $free_mem_kbytes > /dev/kmsg
+	#larger than 11MB
+	if [ $free_mem_kbytes -gt 11264 ]; then
+		stresstest -s $1 -C 1 -m 4 -i 2 -M 8 --max_errors 1 --stop_on_errors -l /tmp/stress_log > /dev/kmsg
+		result=$?
+	else
+		stresstest -s $1 -C 1 -m 1 -i 1 -M 4 --max_errors 1 --stop_on_errors -l /tmp/stress_log > /dev/kmsg
+		result=$?
+	fi
+	echo strestestcpu > /sys/power/cpu_freq_max_pm_unqos
+	echo strestestcpu > /sys/power/cpu_freq_min_pm_unqos
+	echo strestestddr > /sys/power/ddr_devfreq_max_pm_unqos
+	echo strestestddr > /sys/power/ddr_devfreq_min_pm_unqos
+	if [ "$reduce_volt" == "1" ]
+	then
+		[ -e "/sbin/dvc_update_volt.sh" ] && /sbin/dvc_update_volt.sh restore
+	fi
+elif [ $2 -eq 1 ]; then
+	stresstest -s $1 -C 1 -m 1 -i 1 --max_errors 1 -M 8 --stop_on_errors -l /tmp/stress_log -f /data/stresstfile --filesize 0x200000
+	result=$?
+elif [ $2 -eq 2 ]; then
+	loop=1
+	while [ $loop -le $1 ]
+	do
+		[ -e /log/fs_test.bin0 ] && rm /log/fs_test.bin0
+		fs_test 0 7 0
+		result=$?
+		if [ $result -ne 0 ]; then
+			echo "==== FLASH TEST FAILED ON LOOP" $loop > /dev/kmsg
+			[ -e /log/fs_test.bin0 ] && rm /log/fs_test.bin0
+			exit 1
+		fi
+		loop=$((loop+1))
+		echo "##FLASH test loop" $loop "done" > /dev/kmsg
+		[ -e /log/fs_test.bin0 ] && rm /log/fs_test.bin0
+	done
+	[ -e /log/fs_test.bin0 ] && rm /log/fs_test.bin0
+	echo "==== ALL FLASH TEST DONE, PASS" > /dev/kmsg
+	exit 0
+elif [ $2 -eq 3 ]; then
+	if [ "$reduce_volt" == "1" ]
+	then
+		serial_atcmd at+cfun=0
+		sync
+		echo 3 > /proc/sys/vm/drop_caches
+		[ -e "/sbin/dvc_update_volt.sh" ] && /sbin/dvc_update_volt.sh sub
+	fi
+	# set cpufreq max to 2000000 and ddrfreq min to 2000000
+	echo strestestcpu 2000000 > /sys/power/cpu_freq_max_pm_qos
+	echo strestestcpu 2000000 > /sys/power/cpu_freq_min_pm_qos
+	echo strestestddr 2000000 > /sys/power/ddr_devfreq_max_pm_qos
+	echo strestestddr 2000000 > /sys/power/ddr_devfreq_min_pm_qos
+	free_mem_kbytes=`sed -n '2p' /proc/meminfo | awk '{print $(NF-1)}'`
+	echo "Free_KB:" $free_mem_kbytes > /dev/kmsg
+	#larger than 11MB
+	if [ $free_mem_kbytes -gt 11264 ]; then
+		stresstest -s $1 -C 1 -m 4 -i 2 -M 8 --max_errors 1 --stop_on_errors -l /tmp/stress_log > /dev/kmsg
+		result=$?
+	else
+		stresstest -s $1 -C 1 -m 1 -i 1 -M 4 --max_errors 1 --stop_on_errors -l /tmp/stress_log > /dev/kmsg
+		result=$?
+	fi
+	echo strestestcpu > /sys/power/cpu_freq_max_pm_unqos
+	echo strestestcpu > /sys/power/cpu_freq_min_pm_unqos
+	echo strestestddr > /sys/power/ddr_devfreq_max_pm_unqos
+	echo strestestddr > /sys/power/ddr_devfreq_min_pm_unqos
+
+	if [ "$reduce_volt" == "1" ]
+	then
+		[ -e "/sbin/dvc_update_volt.sh" ] && /sbin/dvc_update_volt.sh restore
+	fi
+elif [ $2 -eq 4 ]; then
+	if [ "$reduce_volt" == "1" ]
+	then
+		serial_atcmd at+cfun=0
+		sync
+		echo 3 > /proc/sys/vm/drop_caches
+		[ -e "/sbin/dvc_update_volt.sh" ] && /sbin/dvc_update_volt.sh sub
+	fi
+	# set cpufreq max to 416000 and ddrfreq min to 266000
+	echo strestestcpu 416000 > /sys/power/cpu_freq_max_pm_qos
+	echo strestestcpu 416000 > /sys/power/cpu_freq_min_pm_qos
+	echo strestestddr 266000 > /sys/power/ddr_devfreq_max_pm_qos
+	echo strestestddr 266000 > /sys/power/ddr_devfreq_min_pm_qos
+	free_mem_kbytes=`sed -n '2p' /proc/meminfo | awk '{print $(NF-1)}'`
+	echo "Free_KB:" $free_mem_kbytes > /dev/kmsg
+	#larger than 11MB
+	if [ $free_mem_kbytes -gt 11264 ]; then
+		stresstest -s $1 -C 1 -m 4 -i 2 -M 8 --max_errors 1 --stop_on_errors -l /tmp/stress_log > /dev/kmsg
+		result=$?
+	else
+		stresstest -s $1 -C 1 -m 1 -i 1 -M 4 --max_errors 1 --stop_on_errors -l /tmp/stress_log > /dev/kmsg
+		result=$?
+	fi
+	echo strestestcpu > /sys/power/cpu_freq_max_pm_unqos
+	echo strestestcpu > /sys/power/cpu_freq_min_pm_unqos
+	echo strestestddr > /sys/power/ddr_devfreq_max_pm_unqos
+	echo strestestddr > /sys/power/ddr_devfreq_min_pm_unqos
+
+	if [ "$reduce_volt" == "1" ]
+	then
+		[ -e "/sbin/dvc_update_volt.sh" ] && /sbin/dvc_update_volt.sh restore
+	fi
+else
+	echo "==== unsupported test" > /dev/kmsg
+	$result=1
+fi
+
+if [ $result -eq 0 ]; then
+	echo "======stress test " $2 " ok" > /dev/kmsg
+	[ -e /data/stresstfile ] && rm /data/stresstfile
+	exit 0
+else
+	echo "======stress test " $2 " fail" > /dev/kmsg
+	[ -e /data/stresstfile ] && rm /data/stresstfile
+	exit 1
+fi
+
+
diff --git a/target/linux/mmp/base-files/sbin/switch2jffs b/target/linux/mmp/base-files/sbin/switch2jffs
new file mode 100755
index 0000000..b79b9ae
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/switch2jffs
@@ -0,0 +1,121 @@
+#!/bin/sh
+SYSCFG_UBIFS_MNT=/tmp/syscfg
+. /lib/functions.sh
+
+# mtdpart: the ubifs syscfg partition
+# rom: the read-only rootfs mount point
+# overlay: the overlay upper directory
+# ramoverlay: if ramoverlay is activated, ramoverlay=1
+pre_check() {
+	# return 1 on failed
+	grep -qs ubifs /proc/filesystems ||  return 1
+	grep -qs overlayfs /proc/filesystems ||  return 1
+	[ ! -e $SYSCFG_UBIFS_MNT ] && mkdir -p $SYSCFG_UBIFS_MNT
+
+	mtdpart="$(find_mtd_part syscfg)"
+	[ -z "$mtdpart" ] && return 1
+	mtdpart_idx="$(echo $mtdpart | tr -d "/dev/mtdblock")"
+
+	rom=$(awk '/jffs2 ro/ {print $2}' /proc/mounts)
+	overlay=$(awk '/ubifs/ {print $2}' /proc/mounts | tail -n 1)
+	ramoverlay=1
+	grep -qs 'overlayfs:/tmp/root' /proc/mounts || ramoverlay=0
+	return 0
+}
+
+try_ubifs_syscfg_mount() {
+	overlay_mountpoint=$1
+	if [ -z $overlay_mountpoint ]
+	then
+		overlay_mountpoint=/overlay
+	fi
+	recover_ubifs=0
+	[ ! -e /dev/ubi0 ] && ubiattach -m $mtdpart_idx /dev/ubi_ctrl || recover_ubifs=1
+	if [ $recover_ubifs -eq 0 ]
+	then
+		ubi0_nod_id=`cat /sys/class/ubi/ubi0/dev | tr -s ":" " "`
+		[ ! -e /dev/ubi0 ] && mknod /dev/ubi0 c ${ubi0_nod_id}
+		if [ ! -e /sys/class/ubi/ubi0_0/dev ]
+		then
+			# no volume
+			recover_ubifs=1
+		else
+			# check for "syscfg" volume
+			ubi0_0_nod_id=`cat /sys/class/ubi/ubi0_0/dev | tr -s ":" " "`
+			[ ! -e /dev/ubi0_0 ] && mknod /dev/ubi0_0 c ${ubi0_0_nod_id}
+			{ ubinfo /dev/ubi0_0 | grep Name  | grep -qs "syscfg" ; } || \
+			recover_ubifs=1
+		fi
+	fi
+	if [ $recover_ubifs -eq 1 ]
+	then
+		echo "ubifs syscfg partition is damaged"
+		echo "try to recover by formatting $mtdpart..."
+		[ -e /dev/ubi0 ] && ubidetach -m $mtdpart_idx
+		ubiformat -y -q /dev/mtd$mtdpart_idx
+		ubiattach -m $mtdpart_idx /dev/ubi_ctrl
+		ubi0_nod_id=`cat /sys/class/ubi/ubi0/dev | tr -s ":" " "`
+		[ ! -e /dev/ubi0 ] && mknod /dev/ubi0 c ${ubi0_nod_id}
+		ubimkvol /dev/ubi0 -n 0 -N syscfg -t dynamic --maxavsize
+	fi
+	# finally mount the ubifs
+	mount -t ubifs -o noatime ubi0:syscfg $SYSCFG_UBIFS_MNT || return 1
+	[ ! -d $SYSCFG_UBIFS_MNT/openwrt_overlay ] && mkdir -p $SYSCFG_UBIFS_MNT/openwrt_overlay
+	mount -o bind $SYSCFG_UBIFS_MNT/openwrt_overlay $overlay_mountpoint
+	return 0
+}
+
+with_fo_cleanup() {
+	# try to get rid of /tmp/root
+	# this will almost always fail
+        # unmount overlay
+	umount -l /tmp/root 2>&-
+        # umount ramfs
+	umount -l /tmp/root 2>&-
+        grep -q overlay /proc/filesystems && {
+                cd $overlay
+                (
+			find -type l
+                ) | while read FILE; do
+                        [ -z "$FILE" ] && break
+                        if ls -la "$FILE" 2>&- | grep -q '(overlay-whiteout)'; then
+                                rm -f "$FILE"
+                        fi
+		done
+	}
+}
+
+pre_check
+if [ ! -z "$overlay" ]
+then
+	echo "overlayfs is mounted"
+else
+	if [ "$ramoverlay" -eq 1 ]
+	then
+		echo "switch from ramoverlay to ubifs overlay"
+		overlay=/rom/overlay
+		try_ubifs_syscfg_mount $overlay || exit 1
+		# try to avoid fs changing while copying
+		mount -o remount,ro none / 2>&-
+		# copy ramoverlay to ubifs overlay
+		echo -n "copying files ... "
+		cp -a /tmp/root/* $overlay 2>&-
+		echo "done"
+		# switch back to ro rootfs (temporarily)
+		# and park the ramdisk ontop of /tmp/root
+		pivot /rom /mnt
+		# after pivot to rom, $overlay may change
+		overlay=$(awk '/ubifs/ {print $2}' /proc/mounts | tail -n 1)
+		 mount -o move /mnt /tmp/root
+
+		# /overlay is the overlay
+		# /rom is the readonly
+		fopivot $overlay /rom
+		with_fo_cleanup
+	else
+		echo "try to mount overlayfs"
+		overlay=/overlay
+		try_ubifs_syscfg_mount $overlay || exit 1
+		fopivot $overlay /rom
+	fi
+fi
diff --git a/target/linux/mmp/base-files/sbin/u3start b/target/linux/mmp/base-files/sbin/u3start
new file mode 100755
index 0000000..2a95c94
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/u3start
@@ -0,0 +1,4 @@
+#!/bin/sh
+echo 0 > /sys/class/android_usb/android0/enable
+echo 1 > /sys/class/android_usb/android0/enable
+
diff --git a/target/linux/mmp/base-files/sbin/u3stop b/target/linux/mmp/base-files/sbin/u3stop
new file mode 100755
index 0000000..5370e65
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/u3stop
@@ -0,0 +1,3 @@
+#!/bin/sh
+echo 0 > /sys/class/android_usb/android0/enable
+
diff --git a/target/linux/mmp/base-files/sbin/usb_init b/target/linux/mmp/base-files/sbin/usb_init
new file mode 100755
index 0000000..ebd37f1
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/usb_init
@@ -0,0 +1,85 @@
+#!/bin/sh
+# usb_init script
+
+#wait for telephony ready
+#sleep 5
+#Enable USB configurations
+echo 0 > /sys/class/android_usb/android0/enable
+echo 2ecc > /sys/class/android_usb/android0/idVendor
+echo 3012 > /sys/class/android_usb/android0/idProduct
+echo 0100 > /sys/class/android_usb/android0/bcdDevice
+echo Asrmicro > /sys/class/android_usb/android0/iManufacturer
+
+atdl_mode=`cat /proc/cmdline | grep "LDTA="`
+if [ -n "$atdl_mode" ]; then
+	echo "!!!ATDL mode" > /dev/kmsg
+	#wait for atcmd ready
+	loop_atcmdsrv=0
+	while [ $loop_atcmdsrv -le 20 ]
+	do
+		if [ -e /tmp/atcmdsrv_ok ]; then
+			break
+		else
+			loop_atcmdsrv=$((loop_atcmdsrv+1))
+			sleep 1
+		fi
+	done
+
+	serial_atcmd AT*MRD_SN=R > /tmp/usb_mrd_sn1
+	sed -n '/MRD_SN/p' /tmp/usb_mrd_sn1 > /tmp/usb_mrd_sn2
+	MRD_SNUM=`awk -F ',' '{print $3}' /tmp/usb_mrd_sn2`
+	if [ -n "$MRD_SNUM" ]; then
+		echo "USB_MRD_SN: $MRD_SNUM" > /dev/kmsg
+		echo $MRD_SNUM > /sys/class/android_usb/android0/iSerial
+	else
+		echo 123456789ABCD > /sys/class/android_usb/android0/iSerial
+	fi
+else
+	echo 123456789ABCD > /sys/class/android_usb/android0/iSerial
+fi
+
+# iProduct will displayed on Windows
+echo Asrmicro > /sys/class/android_usb/android0/iProduct
+# store function in node functions if os detect is not compiled, 
+# otherwise the functions are stored in win7/win8/apple
+echo rndis,acm,marvell_diag,marvell_debug,adb > /sys/class/android_usb/android0/functions
+echo rndis,acm,marvell_diag,marvell_debug,adb > /sys/class/android_usb/android0/win7
+echo rndis,acm,marvell_diag,marvell_debug,adb > /sys/class/android_usb/android0/win8
+
+#PIPE mode use rndis, router mode use ncm
+pipemode=`cat /proc/cmdline | grep "PIPE=1"`
+if [ -n "$pipemode" ]; then
+	echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/olinux
+else
+	echo ncm,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/olinux
+fi
+
+echo ncm > /sys/class/android_usb/android0/apple
+
+#below items are for enumeraton stage2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/win7_s2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/win8_s2
+echo rndis,acm,marvell_diag,marvell_debug > /sys/class/android_usb/android0/olinux_s2
+echo ncm > /sys/class/android_usb/android0/apple_s2
+echo win7 > /sys/class/android_usb/android0/os
+echo 239 > /sys/class/android_usb/android0/bDeviceClass
+echo Asrmicro > /sys/class/android_usb/android0/f_rndis/manufacturer
+echo 0bb4 > /sys/class/android_usb/android0/f_rndis/vendorID
+echo 1 > /sys/class/android_usb/android0/f_rndis/wceis
+echo 1 > /sys/class/android_usb/android0/f_acm/instances 
+echo 1 > /sys/class/android_usb/android0/enable
+
+#start mbim early to connect with PC, otherwise AT com port will
+#be blocked for tens of seconds
+[ -e /sys/class/android_usb/android0/win8 ] && {
+	mbim_enabled=`cat /sys/class/android_usb/android0/win8 | grep mbim`
+	if [ -n "$mbim_enabled" ]; then
+		/bin/mbim &
+	fi
+}
+
+if grep -q "CPLOG=1" /proc/cmdline && [ ! -e "/NVM/sulog_auto_enable" ]
+then
+	/bin/sulog &
+fi
+
diff --git a/target/linux/mmp/base-files/sbin/wlan-del-mac b/target/linux/mmp/base-files/sbin/wlan-del-mac
new file mode 100755
index 0000000..81fb8fd
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/wlan-del-mac
@@ -0,0 +1,18 @@
+#!/bin/sh
+# Copyright (C) 2010-2018 OpenWrt.org
+. /lib/functions.sh
+
+wlan_remove_macaddr() {
+	local macaddr
+
+	config_get macaddr $1 macaddr
+	[ -n "$macaddr" ] && {
+		uci_remove wireless $1 macaddr
+	}
+}
+
+[ -s /etc/config/wireless ] || return 0
+
+config_load wireless
+config_foreach wlan_remove_macaddr wifi-iface
+uci_commit wireless
diff --git a/target/linux/mmp/base-files/sbin/wsetup b/target/linux/mmp/base-files/sbin/wsetup
new file mode 100755
index 0000000..9314e49
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/wsetup
@@ -0,0 +1,269 @@
+#!/bin/sh
+#
+# wan setup: dial and setup ip/dns/route 
+#
+##usage:
+#parameters:
+#	CID=$1	,cid for the pdp - optional parameter
+#			 if empty than for LTE: cid=4, 3G: cid=1  
+#	APN=$2	,APN name - optional parameter
+#	IP_TYPE=$3	,IP type (IP, IPV6, IPV4V6)
+#	AUTO=$4	,optional parameter, AUTO=0/1
+#	if auto is set than wsetup will wait upon attach
+#	max waiting time is 3 sec * 40 MAX_TRY = 120 sec			
+
+deactive_if_active(){
+status=`serial_atcmd "AT+CGACT?"`
+error=`echo $status | grep -i ERROR`
+if [ "$error" != "" ]; then
+	echo "CGDACT? READ ERROR"
+	exit 3
+fi
+
+configured=`echo "$status" | grep "$(($CID+1)),1"`
+if [ -z "$configured" ]; then
+	return
+fi
+
+status=`serial_atcmd "AT+CGACT=0,$(($CID+1))"`
+error=`echo $status | grep -i ERROR`
+if [ "$error" != "" ]; then
+	echo "CGDACT DEACTIVATE ERROR"
+	exit 3
+fi
+}
+
+configure_pdp(){
+status=`serial_atcmd "AT+CGDCONT=$(($CID+1)),\"$IP_TYPE\",\"$APN\",\"\",0,0"`
+error=`echo $status | grep -i ERROR`
+if [ "$error" != "" ]; then
+	echo "CGDCONT SET ERROR"
+	exit 3
+fi
+}
+
+activate_pdp(){
+status=`serial_atcmd "AT+CGACT=1,$(($CID+1))"`
+error=`echo $status | grep -i ERROR`
+if [ "$error" != "" ]; then
+	echo "CGACT SET ERROR"
+	exit 3
+fi
+}
+
+set_and_activate_pdp(){
+deactive_if_active
+configure_pdp
+activate_pdp
+}
+
+cleanup_cid()
+{
+	uci delete network.wan$CID.ipaddr > /dev/null 2>&1
+	uci delete network.wan$CID.netmask > /dev/null 2>&1
+	uci delete network.wan$CID.gateway > /dev/null 2>&1
+	uci delete network.wan$CID.ip6addr > /dev/null 2>&1
+	uci delete network.wan$CID.dns > /dev/null 2>&1
+}
+
+set_dns(){
+# Configure DNS
+DNS_PRIMARY=`echo "$status" | awk -F "," '{print $6}' | tr -d '"'`
+DNS_SECOND=`echo "$status" | awk -F "," '{print $7}' | tr -d '"'`
+
+if [ -n "$DNS_PRIMARY" ]; then
+	uci add_list network.wan$CID.dns=$DNS_PRIMARY
+fi
+
+if [ -n "$DNS_SECOND" ]; then
+	uci add_list network.wan$CID.dns=$DNS_SECOND
+fi
+}
+
+check_success(){
+status=`serial_atcmd "AT+CGACT?"`
+error=`echo $status | grep -i ERROR`
+if [ "$error" != "" ]; then
+	echo "CGDACT? READ ERROR"
+	exit 3
+fi
+
+configured=`echo "$status" | grep "$(($CID+1)),1"`
+if [ -z "$configured" ]; then
+	echo "wsetup: connect failed!"
+	exit 3
+else
+	ERR_STAT=0
+	echo "wsetup connect success CID=$CID APN=$APN"
+fi
+}
+
+#################
+# main entrance #
+#################
+
+CID=$1
+APN=$2
+IP_TYPE=$3
+AUTO=$4
+
+ERR_STAT=1
+logfile="./wsetup.log"
+TRY=0
+MAX_TRY=40
+
+if [ "$AUTO" == "1" ]; then
+	echo "AUTO MODE LOG" > $logfile
+fi
+
+if [ -z "$IP_TYPE" ]; then
+	IP_TYPE="IP"
+fi
+
+while [ $ERR_STAT -eq 1 ]; do
+	if [ "$AUTO" == "1" ]; then
+		echo "TRY=$TRY" >> $logfile
+		let TRY+=1
+		sleep 3
+		if [ $TRY -eq $MAX_TRY ]; then
+			exit 1
+		fi
+	fi
+
+	## check AT channel
+	status=`serial_atcmd "AT" | grep OK`
+	if [ -z "$status" ]; then
+		if [ "$AUTO" == "1" ]; then
+			echo "AT CHANNEL ERROR" >> $logfile
+			continue
+		else
+			echo "AT CHANNEL ERROR"
+			exit 1
+		fi
+	fi
+
+	## check SIM avilable
+	status=`serial_atcmd "AT+CPIN?" | grep READY`
+	if [ -z "$status" ]; then
+		if [ "$AUTO" == "1" ]; then
+			echo "SIM CARD NOT AVAILABLE" >> $logfile
+			continue
+		else
+			echo "SIM CARD NOT AVAILABLE"
+			exit 1
+		fi
+	fi
+
+	## check registration
+	rat=`serial_atcmd "AT+COPS?" | grep COPS | awk -F "," '{print $NF}'`
+
+	if [ -z "$rat" ]; then
+		if [ "$AUTO" == "1" ]; then
+			echo "COPS READ ERROR" >> $logfile
+			continue
+		else
+			echo "COPS READ ERROR"
+			exit 3
+		fi
+	fi
+
+	if [ $rat != 7 ]; then
+		## check registration 2G/3G
+		status=`serial_atcmd "AT+CGREG?" | grep CGREG | awk -F "," '{print $2}'`
+		if [ "$status" != "1" ] && [ "$status" != "5" ]; then
+			if [ "$AUTO" == "1" ]; then
+				echo "REGISTERATION FAILED" >> $logfile
+				continue
+			else
+				echo "REGISTERATION FAILED"
+				exit 1
+			fi
+		fi
+		#in case of 3G cid=0 is the default case
+		if [ -z "$CID" ]; then
+			CID=0
+		fi
+		set_and_activate_pdp
+	else
+		## check registration 4G
+		status=`serial_atcmd "AT+CEREG?" | grep CEREG | awk -F "," '{print $2}'`
+		if [ "$status" != "1" ] && [ "$status" != "5" ]; then
+			if [ "$AUTO" == "1" ]; then
+				echo "REGISTERATION FAILED" >> $logfile
+				let TRY+=1
+				continue
+			else
+				echo "REGISTERATION FAILED"
+				exit 1
+			fi
+		fi
+		if [ -z "$CID" ]; then
+			#in case of LTE cid=4 is the default case
+			CID=4
+		fi
+		if [ $CID -ne 4 ]; then
+			#Activate PDP only for MO case
+			set_and_activate_pdp
+		fi
+	fi
+
+	# Configure WAN
+	status=`serial_atcmd "AT+CGPIAF=1,0,0,1"`
+	error=`echo $status | grep -i ERROR`
+	if [ "$error" != "" ]; then
+		echo "CGPIAF READ ERROR"
+		exit 3
+	fi
+
+	status=`serial_atcmd "AT+CGDCONT?"`
+	error=`echo $status | grep -i ERROR`
+	if [ "$error" != "" ]; then
+		echo "CGDCONT? READ ERROR"
+		exit 3
+	fi
+
+	PROTO=`echo "$status" | grep "CGDCONT: $(($CID+1))" | awk -F "," '{print $2}' | tr -d '"'`
+	IPV6=`echo "$PROTO" | grep 6`
+	IPV4=`echo "$PROTO" | grep -v "IPV6"`
+	WAN_IP=`echo "$status" | grep "CGDCONT: $(($CID+1))" | awk -F "," '{print $4}' | tr -d '"'`
+
+	cleanup_cid
+	uci set network.wan$CID.ifname=ccinet$CID
+	uci set network.wan$CID.proto=static
+	if [ -n "$IPV4" ]; then
+		WAN_IP4_IP=`echo $WAN_IP | cut -d " " -f1`
+		WAN_IP=`echo $WAN_IP | cut -d " " -f2`
+		uci set network.wan$CID.ipaddr=$WAN_IP4_IP
+		uci set network.wan$CID.netmask=255.255.255.255
+		uci set network.wan$CID.gateway=$WAN_IP4_IP
+	fi
+	if [ -n "$IPV6" ]; then
+		uci set network.wan$CID.ip6addr=$WAN_IP/64
+	fi
+
+	status=`serial_atcmd "AT+CGCONTRDP=$(($CID+1))"`
+	error=`echo $status | grep -i ERROR`
+	if [ "$error" != "" ]; then
+		echo "CGCONTRDP READ ERROR"
+		exit 3
+	fi
+
+	status=`echo $status | grep CGCONTRDP`
+	set_dns
+
+	status=`echo $status | awk -F "CGCONTRDP:" '{print $3}'`
+	if [ -n "$status" ]; then
+		#IPv6 DNS again for Ipv6
+		set_dns
+	fi
+
+	# Save changes
+	uci commit network
+	/etc/init.d/network reload
+
+	ifup wan$CID
+	if [ -n "$IPV6" ]; then
+		ifup wan6$CID
+	fi
+	check_success
+done
diff --git a/target/linux/mmp/base-files/sbin/zippass.sh b/target/linux/mmp/base-files/sbin/zippass.sh
new file mode 100755
index 0000000..baf6430
--- /dev/null
+++ b/target/linux/mmp/base-files/sbin/zippass.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+pipe=$1
+pipe_now=`uci get cmdline.PIPE 2> /dev/null`
+
+if [ "$pipe" == "get" ]; then
+	if [ "$pipe_now" == "1" ]; then
+		echo 1
+	else
+		echo 0
+	fi
+	exit 0
+fi
+
+if [ "$pipe" != "0" ] && [ "$pipe" != "1" ]; then
+	echo "invaild pipe mode parameter" > /dev/kmsg
+	exit 0
+fi
+
+if [ "$pipe_now" == "1" ]; then
+	if [ "1" == "$pipe" ]; then
+		exit 0
+	fi
+else
+	if [ "0" == "$pipe" ]; then
+		exit 0
+	fi
+fi
+
+if [ "$pipe" == "1" ]; then
+	cp -fp /etc/config/network /etc/config/network_mifi
+	cp -fp /etc/config/dhcp /etc/config/dhcp_mifi
+	cp -fp /rom/etc/config/network /etc/config/network
+	/etc/init.d/forwarder stop
+	uci set cmdline.PIPE=1
+	uci commit cmdline
+	sync
+	/etc/init.d/network restart
+	/etc/init.d/cm.init restart
+	/etc/init.d/forwarder start
+else
+	cp -fp /etc/config/network_mifi /etc/config/network
+	cp -fp /etc/config/dhcp_mifi /etc/config/dhcp
+	/etc/init.d/forwarder stop
+	uci del cmdline.PIPE
+	uci commit cmdline
+	sync
+	/etc/init.d/network restart
+	/etc/init.d/cm.init restart
+	/etc/init.d/forwarder start
+fi