#!/bin/sh

. /lib/functions.sh
. /lib/functions/system.sh

#
# factory set -sn 22018C010005 -date 20200526 -mac 00:19:55:02:67:32 -hwver 3.0.0.1 -product WooLink2102-W-4G
# Set SN to 22018C010005
# set MAC to 00:19:55:02:67:32
# set DATE to 20200526
# set HWVER to 3.0.0.1
# set PRODUCT to WooLink2102-W-4G
# 
# factory get
# PRODUCT:	   WooLink2102-W-4G
# SN:		   22018C010005
# DATE:		   20200526
# HWVER:	   3.0.0.1
# MAC:		   00:19:55:02:67:32
#

help()
{
	cat <<_HELP_
Setup hardware information.
Usage: $0 {set|get} [-sn SN] [-date DATE ] [-mac MAC ] [-hwver HWVER ] [-product PRODUCT]
		-sn SN # board SN
		-date DATE # manufactory date
		-mac MAC # base MAC addr
		-hwver HWVER # hardware version
		-product PRODUCT # product name
Example:
	$0 set -sn 22018C010005 -date 20200526 -mac 00:19:55:02:67:32 -hwver 3.0.0.1 -product WooLink2102-W-4G
	$0 get 
_HELP_
}

case "$1" in
	set)action="$1";; 
	get)action="$1";;
	*) help; exit 1;;
esac
shift 1

while [ -n "$1" ]; do
	case $1 in
		-sn) sn="$2";shift 2;;
		-date) date="$2";shift 2;;
		-mac) mac="$2";shift 2;;
		-hwver) hwver="$2";shift 2;;
		-product) product="$2";shift 2;;
		--) shift;break;;
		-*) help;exit 1;;
		*) break;;
	esac
done

set_sn()
{
	echo "Set SN to $1"
    fw_setenv SN
    fw_setenv SN
	fw_setenv SN $1
}

set_mac()
{
	echo "set MAC to $1"
	local board=$(board_name)

	case "$board" in
		HuiWei|QIYANG|QIYANG_2|QIYANG_IMX6ULL|generic|HuiWei-NAND|FORLINX_IMX6ULL|QIYANG_IMX6ULL_2)
			mac_1=$(macaddr_add "$1" 1)
			fw_setenv ethaddr $1
			fw_setenv ethaddr1 $mac_1
			;;
		WOOLINK-MT7621-512M-256M)
			# mtd-mac-address = <&factory 0xe000>;
			mac=$1
			mac_2=$(macaddr_add "$1" 2)
			mac_3=$(macaddr_add "$1" 3)
			partname=Factory
			part='/dev/mtd3'
			dd if=$part of=/tmp/factory.bin bs=4096 2>/dev/null

			offset=$((0xe000))
			set -- $(echo "$mac" | sed 's,:, ,g')
			#echo "New MAC address: $1:$2:$3:$4:$5:$6"
			echo -ne "\x$1\x$2\x$3\x$4\x$5\x$6" | dd of=/tmp/factory.bin conv=notrunc bs=1 count=6 seek=$offset 2>/dev/null

			offset=$((0x4))
			set -- $(echo "$mac_2" | sed 's,:, ,g')
			#echo "New MAC address: $1:$2:$3:$4:$5:$6"
			echo -ne "\x$1\x$2\x$3\x$4\x$5\x$6" | dd of=/tmp/factory.bin conv=notrunc bs=1 count=6 seek=$offset 2>/dev/null

			offset=$((0x8004))
			set -- $(echo "$mac_3" | sed 's,:, ,g')
			#echo "New MAC address: $1:$2:$3:$4:$5:$6"
			echo -ne "\x$1\x$2\x$3\x$4\x$5\x$6" | dd of=/tmp/factory.bin conv=notrunc bs=1 count=6 seek=$offset 2>/dev/null

			mtd write /tmp/factory.bin $part 2>/dev/null
			rm /tmp/factory.bin
			;;
		WOOLINK-MT7628-128M-32M)
			# mtd-mac-address = <&factory 0x28>;
			mac=$1
			partname=factory
			offset=$((0x28))

			part=$(find_mtd_part "$partname")
			set -- $(echo "$mac" | sed 's,:, ,g')
			#echo "New MAC address: $1:$2:$3:$4:$5:$6"
			echo -ne "\x$1\x$2\x$3\x$4\x$5\x$6" | dd of=$part conv=notrunc bs=1 count=6 seek=$offset 2>/dev/null
			;;
	esac
}

set_date()
{
	echo "set DATE to $1"
	fw_setenv DATE $1
}

set_hwver()
{
	echo "set HWVER to $1"
	fw_setenv HWVER $1
}

set_product()
{
	echo "set PRODUCT to $1"
	fw_setenv PRODUCT
	fw_setenv product
	fw_setenv PRODUCT $1
}

init_env()
{
	local board=$(board_name)
	case "$board" in
		QIYANG|QIYANG_2|QIYANG_IMX6ULL|generic)
			fw_setenv baudrate 115200
			fw_setenv bootcmd 'run bootcmd_mmc'
			fw_setenv bootcmd_mfg 'run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};'
			fw_setenv bootcmd_mmc 'run loadimage;run mmcboot'
			fw_setenv bootcmd_net 'run netboot'
			fw_setenv bootdelay 1
			fw_setenv console ttymxc0
			fw_setenv ethact FEC0
			fw_setenv ethprime FEC
			fw_setenv fdt_addr 0x83000000
			fw_setenv fdt_file imx6ul-qiyang.dtb
			fw_setenv image zImage
			fw_setenv initrd_addr 0x83800000
			fw_setenv initrd_high 0xffffffff
			fw_setenv ipaddr 192.168.1.71
			fw_setenv loadaddr 0x80800000
			fw_setenv loadfdt 'mmc dev ${mmcdev};mmc read ${fdt_addr} 0x4800 0x2000'
			fw_setenv loadimage 'mmc dev ${mmcdev};mmc read ${loadaddr} 0x800 0x4000'
			fw_setenv mfgtool_args 'setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="" clk_ignore_unused'
			fw_setenv mmcargs 'setenv bootargs console=${console},${baudrate} root=${rootfs} ethaddr=${ethaddr} ethaddr1=${ethaddr1} ${display}'
			fw_setenv mmcboot 'echo Booting from mmc ...; run mmcargs; run loadfdt; bootz ${loadaddr} - ${fdt_addr};'
			fw_setenv mmcdev 1
			fw_setenv netargs 'setenv bootargs console=${console},${baudrate} ${smp} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp'
			fw_setenv netboot 'echo Booting from net ...; run netargs; tftp ${loadaddr} ${image}; tftp ${fdt_addr} ${fdt_file};bootz ${loadaddr} - ${fdt_addr};'
			fw_setenv nfsroot /home2/share/shim/imx6ul/rootfs
			fw_setenv panel QY_LCD800X480
			fw_setenv rootfs /dev/mmcblk1p1 rootwait rw
			fw_setenv rootfs_ip 192.168.1.7
			fw_setenv serverip 192.168.1.73
			fw_setenv updatefdt 'tftp ${fdt_addr} ${fdt_file};mmc dev ${mmcdev};mmc write ${fdt_addr} 0x4800 0x2000'
			fw_setenv updatekernel 'tftp ${loadaddr} ${image};mmc dev ${mmcdev};mmc write ${loadaddr} 0x800 0x4000'
			;;
		QIYANG_IMX6ULL_2)
			fw_setenv baudrate 115200
			fw_setenv boot_fdt try
			fw_setenv bootcmd run bootcmd_mmc
			fw_setenv bootcmd_mfg 'run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};'
			fw_setenv bootcmd_mmc 'run loadimage;run mmcboot'
			fw_setenv bootdelay 3
			fw_setenv bootscript 'echo Running bootscript from mmc ...; source'
			fw_setenv console ttymxc0
			fw_setenv ethaddr 08:00:3e:26:0a:5b
			fw_setenv ethaddr1 08:00:3e:26:0a:5c
			fw_setenv ethprime FEC
			fw_setenv fdt_addr 0x83000000
			fw_setenv fdt_file imx6ull-14x14-qiyang.dtb
			fw_setenv fdt_high 0xffffffff
			fw_setenv findfdt 'if test $fdt_file = undefined; then if test $board_name = EVK && test $board_rev = 9X9; then setenv fdt_file imx6ull-9x9-evk.dtb; fi; if test $board_name = EVK && test $board_rev = 14X14; then setenv fdt_file imx6ull-14x14-evk.dtb; fi; if test $fdt_file = undefined; then echo WARNING: Could not determine dtb to use; fi; fi;'
			fw_setenv image zImage
			fw_setenv initrd_addr 0x83800000
			fw_setenv initrd_high 0xffffffff
			fw_setenv ip_dyn yes
			fw_setenv loadaddr 0x80800000
			fw_setenv loadbootscript 'fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};'
			fw_setenv loadfdt 'mmc dev ${mmcdev};mmc read ${fdt_addr} 0x4800 0x2000'
			fw_setenv loadimage 'mmc dev ${mmcdev};mmc read ${loadaddr} 0x800 0x4000'
			fw_setenv mfgtool_args 'setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="" clk_ignore_unused '
			fw_setenv mmcargs 'setenv bootargs console=${console},${baudrate} root=${mmcroot} ethaddr=${ethaddr} ethaddr1=${ethaddr1}'
			fw_setenv mmcautodetect yes
			fw_setenv mmcboot 'echo Booting from mmc ...; run mmcargs; run loadfdt; bootz ${loadaddr} - ${fdt_addr};'
			fw_setenv mmcdev 1
			fw_setenv mmcpart 1
			fw_setenv mmcroot '/dev/mmcblk1p2 rootwait rw'
			fw_setenv netargs 'setenv bootargs console=${console},${baudrate} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp'
			fw_setenv netboot 'echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;'
			fw_setenv panel TFT43AB
			fw_setenv script boot.scr
			;;
		HuiWei-NAND)
			fw_setenv baudrate 115200
			fw_setenv nandargs 'setenv bootargs console=${console},${baudrate} ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs cma=96M mtdparts=gpmi-nand:4m(boot),16m(kernel),512k(dtb),-(rootfs) ethaddr=${ethaddr}'
			fw_setenv bootcmd 'nand read ${loadaddr} 0x400000 0x800000;nand read ${fdt_addr} 0x1400000 0x100000; run nandargs; bootz ${loadaddr} - ${fdt_addr}'
			fw_setenv bootdelay 5
			fw_setenv console ttymxc0
			fw_setenv ethact FEC0
			fw_setenv ethprime FEC
			fw_setenv fdt_addr 0x83000000
			fw_setenv fdt_high 0xffffffff
			fw_setenv ipaddr 10.3.1.55
			fw_setenv loadaddr 0x80800000
			fw_setenv panel CLAA-WVGA
			fw_setenv serverip 10.3.1.229
			;;
		HuiWei)
			fw_setenv baudrate 115200
			fw_setenv bootcmd 'mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then if run loadfdt; then run mmcboot; else run netboot; fi; else run netboot; fi; fi; else run netboot; fi'
			fw_setenv bootdelay 10
			fw_setenv bootscript 'echo Running bootscript from mmc ...; source'
			fw_setenv console ttymxc0
			fw_setenv ethact FEC0
			fw_setenv ethprime FEC
			fw_setenv fdt_addr 0x83000000
			fw_setenv fdt_file hw6ul-lite.dtb
			fw_setenv fdt_high 0xffffffff
			fw_setenv image zImage
			fw_setenv initrd_high 0xffffffff
			fw_setenv mmcdev 1
			fw_setenv mmcpart 1
			fw_setenv mmcroot /dev/mmcblk1p2 rootwait rw
			fw_setenv loadaddr 0x80800000
			fw_setenv loadbootscript 'fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};'
			fw_setenv loadfdt 'fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}'
			fw_setenv loadimage 'fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}'
			fw_setenv mmcargs 'setenv bootargs console=${console},${baudrate} cma=96M root=${mmcroot} ethaddr=${ethaddr}'
			fw_setenv mmcautodetect yes
			fw_setenv mmcboot 'echo Booting from mmc ...; run mmcargs; bootz ${loadaddr} - ${fdt_addr};'
			fw_setenv netargs 'setenv bootargs console=${console},${baudrate} cma=96M root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp'
			fw_setenv netboot 'echo Booting from net ...; run netargs; tftp ${image}; if tftp ${fdt_addr} ${fdt_file}; then bootz ${loadaddr} - ${fdt_addr}; else echo WARN: Cannot load the DT; fi;'
			fw_setenv panel CLAA-WVGA
			fw_setenv script boot.scr
			;;
		WOOLINK-MT7621-512M-256M)
			;;
		WOOLINK-MT7628-128M-32M)
			;;
		FORLINX_IMX6ULL)
			fw_setenv baudrate 115200
			fw_setenv board_name EVK
			fw_setenv board_rev 14X14
			fw_setenv boot_fdt try
			fw_setenv bootcmd 'if mmc rescan; then if run loadbootscript; then run bootscript; else if test ${bootdev} = sd1; then echo update from sd ???;run update_from_sd;else echo boot from emmc ???;if run loadimage; then run mmcboot; elif run loadimagebak; then run mmcboot; else run netboot; fi; fi; fi; else run netboot; fi'
			fw_setenv bootcmd_mfg 'run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};'
			fw_setenv bootdelay 1
			fw_setenv bootdev mmc2
			fw_setenv bootscript 'echo Running bootscript from mmc ...; source'
			fw_setenv console ttymxc0
			fw_setenv ethact FEC0
			fw_setenv ethprime FEC
			fw_setenv fdt_addr 0x83000000
			fw_setenv fdt_file imx6ull-S-emmc-1280x800c10dot1.dtb
			fw_setenv fdt_high 0xffffffff
			fw_setenv fileaddr 83800000
			fw_setenv filesize 5fa38
			fw_setenv image zImage
			fw_setenv imagebak zImagebak
			fw_setenv initrd_addr 0x83800000
			fw_setenv initrd_high 0xffffffff
			fw_setenv ip_dyn yes
			fw_setenv loadaddr 0x80800000
			fw_setenv loadbootscript 'fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};'
			fw_setenv loadfdt 'fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}'
			fw_setenv loadfdtbak 'fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_filebak}'
			fw_setenv loadimage 'fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}'
			fw_setenv loadimagebak 'fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${imagebak}'
			fw_setenv mfgtool_args 'setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.file=/fat g_mass_storage.ro=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="" clk_ignore_unused '
			fw_setenv mmcargs 'setenv bootargs console=${console},${baudrate} calibrate=${calibrate}  root=${mmcroot}'
			fw_setenv mmcautodetect yes
			fw_setenv mmcboot 'echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;'
			fw_setenv mmcdev 1
			fw_setenv mmcpart 1
			fw_setenv mmcroot '/dev/mmcblk1p2 rootwait rw'
			fw_setenv netargs 'setenv bootargs console=${console},${baudrate}  root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp'
			fw_setenv netboot 'echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;'
			fw_setenv panel TFT101AB-1280x800
			fw_setenv script boot.scr
			fw_setenv splashimage 0x83800000
			fw_setenv splashpos 'm,m'
			fw_setenv update_emmc 'mmc rescan;fatload mmc 0 ${loadaddr} /sdrun/${image}; fatload mmc 0 ${initrd_addr} /sdrun/ramdisk.img.u; fatload mmc 0 ${fdt_addr} /sdrun/imx6ull-14x14-evk.dtb; setenv bootargs console=${console},${baudrate} rdinit=/linuxrc;  bootz ${loadaddr} ${initrd_addr} ${fdt_addr};'
			fw_setenv update_from_sd 'run update_emmc;'
			;;
	esac

}

main()
{
	if [ "$action" == "set" ];then
		init_env

		if [ -n "$sn" ]
		then
			set_sn $sn
		fi

		if [ -n "$mac" ]
		then
			set_mac $mac
		fi
		
		if [ -n "$date" ]
		then
			set_date $date
		fi
		
		if [ -n "$hwver" ]
		then
			set_hwver $hwver
		fi
		
		if [ -n "$product" ]
		then
			set_product $product
		fi
		reboot -n 2
	elif [ "$action" == "get" ];then
		local board=$(board_name)
		local product=`fw_printenv | grep -i ^product= | awk -F = '{print $2}' | tr '\n' '\0'`
		local sn=`fw_printenv | grep -i ^sn= | awk -F = '{print $2}' | tr '\n' '\0'`
		local date=`fw_printenv | grep -i ^date= | awk -F = '{print $2}' | tr '\n' '\0'`
		local hwver=`fw_printenv | grep -i ^HWVER= | awk -F = '{print $2}' | tr '\n' '\0'`
		
		case "$board" in
			HuiWei|QIYANG|QIYANG_2|QIYANG_IMX6ULL|generic|HuiWei-NAND|QIYANG_IMX6ULL_2)
				mac=`fw_printenv | grep -i ^ethaddr= | awk -F = '{print $2}' | tr '\n' '\0'`
				;;
			WOOLINK-MT7621-512M-256M)
				# mtd-mac-address = <&factory 0xe000>;
				mac=$(mtd_get_mac_binary Factory 0xe000)
				;;
			WOOLINK-MT7628-128M-32M)
				# mtd-mac-address = <&factory 0x28>;
				mac=$(mtd_get_mac_binary factory 0x28)
				;;
		esac

		echo "PRODUCT=$product"
		echo "SN=$sn"
		echo "DATE=$date"
		echo "HWVER=$hwver"
		echo "MAC=$mac"
	else
		help
		exit 1
	fi
}

main

