#!/bin/sh /etc/rc.common

START=21

. /lib/functions.sh
. /usr/share/libubox/jshn.sh

MANUF="Teltonika Networks"

get_model_data() {
	json_load_file "/etc/board.json"

	json_select model

	json_get_var platform platform
	json_get_var pid pid
	json_get_var vid vid

	json_select ..

	case $pid in
	0x0005|0x0006)
		ifname="usb"
		udc_name="a600000.dwc3"
		;;
	0x0004)
		ifname="usb"
		udc_name="8a00000.dwc3"
		;;
	0x0003)
		ifname="ecm"
		udc_name="a600000.dwc3"
		;;
	0x0002)
		ifname="rndis"
		udc_name="msm_hsusb"
		platform="$platform""4X"
		;;
	esac
	fun_name="rndis.$ifname""0"
}

setup_diag_functionfs() {
	local p=$1
	func_str="ffs.diag,qdss.qdss"

	qdss_func="qdss.qdss_mdm"
	funcs=$(echo $func_str |tr "," "\n")

	mkdir "$p/functions/ffs.diag"
	mkdir "$p/functions/diag.diag"
	mkdir "$p/functions/diag.diag_mdm"
	mkdir "$p/functions/qdss.qdss"
	mkdir "$p/functions/qdss.qdss_mdm"

	echo 0xA0 > "$p/configs/c.1/bmAttributes"
	echo "DIAG_SER_RMNET" > "$p/configs/c.1/strings/0x409/configuration"


	for func in $funcs
	do
		case $func in
			ffs.diag)
				func_index=0
				;;
			qdss.qdss)
				func_index=12
				func=$qdss_func
				;;
		esac
		ln -s "$p/functions/$func" "$p/configs/c.1/f$func_index"
	done
	mkdir /dev/ffs-diag
	mount -t functionfs diag /dev/ffs-diag
}

boot() {
	local p="/sys/kernel/config/usb_gadget/g1"
	[ -d "$p" ] && return

	get_model_data

	# mount configfs for usb gadget configuration
	mount -t configfs none /sys/kernel/config

	mkdir "$p"

	# write product info data
	echo "$vid" > "$p/idVendor"
	echo "$pid" > "$p/idProduct"
	echo "0x02" > "$p/bDeviceClass"

	# set device revision number
	echo "0x0101" > "$p/bcdDevice"

	local router_serial=$(/sbin/mnf_info --sn 2>/dev/null)

	# write Windows OS specific descriptors
	echo "0xcd" > "$p/os_desc/b_vendor_code"
	echo "MSFT100" > "$p/os_desc/qw_sign"
	echo "1" > "$p/os_desc/use"

	mkdir "$p/strings/0x409"
	echo "$MANUF" > "$p/strings/0x409/manufacturer"
	echo "$platform" > "$p/strings/0x409/product"
	echo "$router_serial" > "$p/strings/0x409/serialnumber"

	# enable interface and function file-system gadgets
	mkdir "$p/functions/$fun_name"
	mkdir "$p/configs/c.1"
	echo "$ifname%d" > "$p/functions/$fun_name/ifname"

	# specify Windows OS specific descriptors for RNDIS
	echo "RNDIS"   > $p/functions/$fun_name/os_desc/interface.rndis/compatible_id
	echo "5162001" > $p/functions/$fun_name/os_desc/interface.rndis/sub_compatible_id

	ln -s "$p/functions/$fun_name" "$p/configs/c.1"
	ln -s ${p}/configs/c.1 ${p}/os_desc

	# specify class, subclass and protocol for RNDIS
	echo "EF" > "$p/functions/$fun_name/class"
	echo "04" > "$p/functions/$fun_name/subclass"
	echo "01" > "$p/functions/$fun_name/protocol"

	# probe UDC
	echo "$udc_name" > "$p/UDC"

	setup_diag_functionfs $p
}
