From 861f2da56e4aa212ad17799bca546f7b7c0d3baa Mon Sep 17 00:00:00 2001
From: "Igor Zalatov (from Citadel PC)" <flyrouter@gmail.com>
Date: Mon, 5 Sep 2022 17:24:07 +0300
Subject: [PATCH] Add hi3516ev200_fpv files

---
 projects/hi3516ev200_fpv/.dot                 |   0
 projects/hi3516ev200_fpv/Makefile             | 174 +++++++++
 .../general/overlay/etc/httpd.conf            |   8 +
 .../general/overlay/etc/inittab               |  39 ++
 .../general/overlay/etc/majestic.yaml         |  57 +++
 .../general/overlay/etc/mavlink.conf          |  11 +
 .../etc/sensors/imx307_i2c_2l_1080p.ini       | 149 +++++++
 .../general/overlay/etc/telemetry.conf        |  14 +
 .../general/overlay/etc/wfb.conf              |  18 +
 .../general/overlay/usr/bin/load_goke         | 366 ++++++++++++++++++
 10 files changed, 836 insertions(+)
 delete mode 100644 projects/hi3516ev200_fpv/.dot
 create mode 100644 projects/hi3516ev200_fpv/Makefile
 create mode 100644 projects/hi3516ev200_fpv/general/overlay/etc/httpd.conf
 create mode 100644 projects/hi3516ev200_fpv/general/overlay/etc/inittab
 create mode 100644 projects/hi3516ev200_fpv/general/overlay/etc/majestic.yaml
 create mode 100644 projects/hi3516ev200_fpv/general/overlay/etc/mavlink.conf
 create mode 100644 projects/hi3516ev200_fpv/general/overlay/etc/sensors/imx307_i2c_2l_1080p.ini
 create mode 100644 projects/hi3516ev200_fpv/general/overlay/etc/telemetry.conf
 create mode 100644 projects/hi3516ev200_fpv/general/overlay/etc/wfb.conf
 create mode 100755 projects/hi3516ev200_fpv/general/overlay/usr/bin/load_goke

diff --git a/projects/hi3516ev200_fpv/.dot b/projects/hi3516ev200_fpv/.dot
deleted file mode 100644
index e69de29..0000000
diff --git a/projects/hi3516ev200_fpv/Makefile b/projects/hi3516ev200_fpv/Makefile
new file mode 100644
index 0000000..ccc9d0a
--- /dev/null
+++ b/projects/hi3516ev200_fpv/Makefile
@@ -0,0 +1,174 @@
+
+ROOT_DIR      := $(CURDIR)
+BR_VER        ?= 2021.02.12
+BR_DIR        := $(ROOT_DIR)/buildroot-$(BR_VER)
+
+ifeq ($(PLATFORM),)
+    ifneq ($(BOARD),)
+		FULL_PATH := $(shell find br-ext-chip-* -name "$(BOARD)*_defconfig")
+		ifeq ($(FULL_PATH),)
+			FULL_PATH := $(error Cannot find anything for $(BOARD))
+		else ifneq ($(shell echo $(FULL_PATH) | wc -w), 1)
+			FULL_PATH := $(error For provided '$(BOARD)' multiple options found: $(FULL_PATH))
+		endif
+
+		PLATFORM := $(shell echo $(FULL_PATH) | cut -d '/' -f 1 | cut -d '-' -f 4 )
+    endif
+endif
+
+BR_EXT_DIR    := $(ROOT_DIR)/br-ext-chip-$(PLATFORM)
+SCRIPTS_DIR   := $(ROOT_DIR)/scripts
+#BOARDS       := $(shell ls -1 $(BR_EXT_DIR)/configs)
+
+.PHONY: usage help clean distclean prepare install-deps all toolchain-params run-tests overlayed-rootfs-%
+
+usage help:
+	@echo -e \
+	"\n\
+	BR-OpenIPC usage:\n\
+	  - make help|usage - print this help\n\
+	  - make install-deps - install system deps\n\
+	  - make prepare - download and unpack buildroot\n\
+	  - make list-configs - show available hardware configs list\n\
+	  - make BOARD=<BOARD-ID> board-info - write to stdout information about selected board\n\
+	  - make BOARD=<BOARD-ID> all - build all needed for a board (toolchain, kernel and rootfs images)\n\
+	  - make overlayed-rootfs-<FS-TYPE> ROOTFS_OVERLAYS=... - create rootfs image that contains original\n\
+	  - make clean - cleaning before reassembly\n\
+	  - make distclean - switching to the factory state\n\
+	  Buildroot target dir overlayed by some custom layers.\n\
+	  Example:\n\
+	      make overlayed-rootfs-squashfs ROOTFS_OVERLAYS=./examples/echo_server/overlay\n\
+	"
+
+distclean:
+	@rm -rf output buildroot-$(BR_VER)
+
+clean:
+	@rm -rf output/target output/.config
+
+prepare: $(BR_DIR)
+$(ROOT_DIR)/buildroot-$(BR_VER).tar.gz:
+	wget -O $@ -nv \
+		--retry-connrefused --continue --timeout=15 \
+		http://buildroot.org/downloads/buildroot-$(BR_VER).tar.gz
+
+$(BR_DIR): $(ROOT_DIR)/buildroot-$(BR_VER).tar.gz
+	tar -C $(ROOT_DIR) -xf buildroot-$(BR_VER).tar.gz
+	rm -f buildroot-$(BR_VER).tar.gz
+
+
+install-deps:
+ifneq ($(shell id -u), 0)
+	@echo "You must be root to perform this action."
+else
+	DEBIAN_FRONTEND=noninteractive apt-get update && \
+		apt-get -y install \
+		build-essential git make libncurses-dev wget curl \
+		cpio rsync bc unzip file
+endif
+
+
+%_info:
+	@echo
+	@cat $(BR_EXT_DIR)/board/$(subst _info,,$@)/config | grep RAM_LINUX_SIZE
+	$(eval VENDOR 	:= $(shell echo $@ | cut -d "_" -f 1))
+	$(eval FAMILY 	:= $(shell cat $(BR_EXT_DIR)/board/$(subst _info,,$@)/config | grep FAMILY | cut -d "=" -f 2))
+	$(eval CHIP	:= $(shell echo $@ | cut -d "_" -f 3))
+	@cat $(BR_EXT_DIR)/board/$(FAMILY)/$(CHIP).config
+
+buildroot-version:
+	@echo $(BR_VER)
+
+has-nand:
+	@sed -rn "s/^BR2_TARGET_ROOTFS_UBI=(y)/\1/p" $(FULL_PATH)
+
+toolname:
+	@$(SCRIPTS_DIR)/show_toolchains.sh $(FULL_PATH) $(BR_VER)
+
+list-configs:
+	@echo
+	@ls -1 $(BR_EXT_DIR)/configs
+
+
+# -------------------------------------------------------------------------------------------------
+OUT_DIR ?= $(ROOT_DIR)/output
+
+# Buildroot considers relative paths relatively to its' own root directory. So we use absolute paths
+# to avoid ambiguity
+override OUT_DIR := $(abspath $(OUT_DIR))
+BOARD_MAKE := $(MAKE) -C $(BR_DIR) BR2_EXTERNAL=$(BR_EXT_DIR) O=$(OUT_DIR)
+
+define CREATE_TOOLCHAIN_PARAMS
+    eval $$($(BOARD_MAKE) -s --no-print-directory VARS=GNU_TARGET_NAME printvars) \
+    && $(SCRIPTS_DIR)/create_toolchain_binding.sh $(OUT_DIR)/host/bin $$GNU_TARGET_NAME \
+    > $(OUT_DIR)/toolchain-params.mk
+endef
+
+# -------------------------------------------------------------------------------------------------
+$(OUT_DIR)/.config:
+ifndef BOARD
+	@echo "Variable BOARD must be defined to initialize output directory" >&2 && exit 1
+endif
+	$(BOARD_MAKE) BR2_DEFCONFIG=$(BR_EXT_DIR)/configs/$(BOARD)_defconfig defconfig
+
+
+$(OUT_DIR)/toolchain-params.mk: $(OUT_DIR)/.config $(SCRIPTS_DIR)/create_toolchain_binding.sh
+	$(CREATE_TOOLCHAIN_PARAMS)
+
+
+# -------------------------------------------------------------------------------------------------
+# build all needed for a board
+all: $(OUT_DIR)/.config $(OUT_DIR)/toolchain-params.mk
+	$(BOARD_MAKE) all
+
+
+# -------------------------------------------------------------------------------------------------
+# re-create params file
+toolchain-params:
+	$(CREATE_TOOLCHAIN_PARAMS)
+
+# -------------------------------------------------------------------------------------------------
+# create rootfs image that contains original Buildroot target dir overlayed by some custom layers
+# space-separated list of overlays
+
+ROOTFS_OVERLAYS ?=
+# overlayed rootfs directory
+ROOTFS_OVERLAYED_DIR ?= $(OUT_DIR)/target-overlayed
+# overlayed rootfs image's name (without prefix)
+ROOTFS_OVERLAYED_IMAGE ?= rootfs-overlayed
+
+overlayed-rootfs-%: $(OUT_DIR)/.config
+	$(SCRIPTS_DIR)/create_overlayed_rootfs.sh $(ROOTFS_OVERLAYED_DIR) $(OUT_DIR)/target $(ROOTFS_OVERLAYS)
+	$(BOARD_MAKE) $(subst overlayed-,,$@) \
+	    BASE_TARGET_DIR=$(abspath $(ROOTFS_OVERLAYED_DIR)) \
+	    ROOTFS_$(call UPPERCASE,$(subst overlayed-rootfs-,,$@))_FINAL_IMAGE_NAME=$(ROOTFS_OVERLAYED_IMAGE).$(subst overlayed-rootfs-,,$@)
+
+
+# -------------------------------------------------------------------------------------------------
+board-info:
+	@cat $(BR_EXT_DIR)/board/$(BOARD)/config | grep RAM_LINUX_SIZE
+	$(eval VENDOR := $(shell echo $(BOARD) | cut -d "_" -f 1))
+	$(eval FAMILY := $(shell cat $(BR_EXT_DIR)/board/$(BOARD)/config | grep FAMILY | cut -d "=" -f 2))
+	$(eval CHIP   := $(shell echo $(BOARD) | cut -d "_" -f 3))
+	@cat $(BR_EXT_DIR)/board/$(FAMILY)/$(CHIP).config
+	@cat $(BR_EXT_DIR)/board/$(BOARD)/config
+
+# -------------------------------------------------------------------------------------------------
+# such targets (with trimmed `br-` prefix) are passed to Buildroot's Makefile
+br-%: $(OUT_DIR)/.config
+	$(BOARD_MAKE) $(subst br-,,$@)
+
+
+# -------------------------------------------------------------------------------------------------
+run-tests:
+	$(MAKE) -C $(ROOT_DIR)/tests
+
+
+# -------------------------------------------------------------------------------------------------
+# there are some extra targets of specific packages
+include $(sort $(wildcard $(ROOT_DIR)/extra/*.mk))
+
+
+# -------------------------------------------------------------------------------------------------
+# util stuff is below
+UPPERCASE = $(shell echo $(1) | tr a-z A-Z)
diff --git a/projects/hi3516ev200_fpv/general/overlay/etc/httpd.conf b/projects/hi3516ev200_fpv/general/overlay/etc/httpd.conf
new file mode 100644
index 0000000..b232ac4
--- /dev/null
+++ b/projects/hi3516ev200_fpv/general/overlay/etc/httpd.conf
@@ -0,0 +1,8 @@
+#
+H:/var/www
+A:127.0.0.1
+A:*
+D:8.8.8.8/32
+E401:401.html
+/cgi-bin:admin:123456
+#
diff --git a/projects/hi3516ev200_fpv/general/overlay/etc/inittab b/projects/hi3516ev200_fpv/general/overlay/etc/inittab
new file mode 100644
index 0000000..cc76507
--- /dev/null
+++ b/projects/hi3516ev200_fpv/general/overlay/etc/inittab
@@ -0,0 +1,39 @@
+# /etc/inittab
+#
+# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
+#
+# Note: BusyBox init doesn't support runlevels.  The runlevels field is
+# completely ignored by BusyBox init. If you want runlevels, use
+# sysvinit.
+#
+# Format for each entry: <id>:<runlevels>:<action>:<process>
+#
+# id        == tty to run on, or empty for /dev/console
+# runlevels == ignored
+# action    == one of sysinit, respawn, askfirst, wait, and once
+# process   == program to run
+
+# Startup the system
+::sysinit:/bin/mount -t proc proc /proc
+::sysinit:/bin/mount -o remount,rw /
+::sysinit:/bin/mkdir -p /dev/pts /dev/shm
+::sysinit:/bin/mount -a
+# ::sysinit:/sbin/swapon -a
+null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd
+null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin
+null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout
+null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr
+::sysinit:/bin/hostname -F /etc/hostname
+# now run any rc scripts
+::sysinit:/etc/init.d/rcS
+
+# Put a getty on the serial port
+# console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL
+
+# Stuff to do for the 3-finger salute
+#::ctrlaltdel:/sbin/reboot
+
+# Stuff to do before rebooting
+::shutdown:/etc/init.d/rcK
+# ::shutdown:/sbin/swapoff -a
+::shutdown:/bin/umount -a -f
diff --git a/projects/hi3516ev200_fpv/general/overlay/etc/majestic.yaml b/projects/hi3516ev200_fpv/general/overlay/etc/majestic.yaml
new file mode 100644
index 0000000..5bd7c14
--- /dev/null
+++ b/projects/hi3516ev200_fpv/general/overlay/etc/majestic.yaml
@@ -0,0 +1,57 @@
+system:
+  webAdmin: enabled
+  buffer: 1024
+isp:
+  lowDelay: true
+image:
+  mirror: false
+  flip: false
+  rotate: none
+  contrast: 50
+  hue: 50
+  saturation: 50
+  luminance: 50
+osd:
+  enabled: false
+  template: "%a %e %B %Y %H:%M:%S %Z"
+nightMode:
+  enabled: false
+records:
+  enabled: false
+  path: /mnt/mmc/%Y/%m/%d/%H.mp4
+  maxUsage: 95
+video0:
+  enabled: true
+  codec: h264
+  rcMode: cbr
+  gopSize: 0.2
+video1:
+  enabled: false
+jpeg:
+  enabled: false
+mjpeg:
+  size: 640x360
+  fps: 5
+  bitrate: 1024
+audio:
+  enabled: false
+  volume: auto
+  srate: 8000
+rtsp:
+  enabled: true
+  port: 554
+hls:
+  enabled: false
+youtube:
+  enabled: false
+motionDetect:
+  enabled: false
+  visualize: true
+  debug: true
+ipeye:
+  enabled: false
+watchdog:
+  enabled: true
+  timeout: 10
+outgoing:
+- udp://127.0.0.1:5600
diff --git a/projects/hi3516ev200_fpv/general/overlay/etc/mavlink.conf b/projects/hi3516ev200_fpv/general/overlay/etc/mavlink.conf
new file mode 100644
index 0000000..979c48c
--- /dev/null
+++ b/projects/hi3516ev200_fpv/general/overlay/etc/mavlink.conf
@@ -0,0 +1,11 @@
+[General]
+TcpServerPort = 5760
+
+[UartEndpoint drone]
+Device = /dev/ttyAMA0
+Baud = 115200
+
+[UdpEndpoint telemetry_tx]
+Mode = Normal
+Address = 127.0.0.1
+Port = 14550
diff --git a/projects/hi3516ev200_fpv/general/overlay/etc/sensors/imx307_i2c_2l_1080p.ini b/projects/hi3516ev200_fpv/general/overlay/etc/sensors/imx307_i2c_2l_1080p.ini
new file mode 100644
index 0000000..92e0b61
--- /dev/null
+++ b/projects/hi3516ev200_fpv/general/overlay/etc/sensors/imx307_i2c_2l_1080p.ini
@@ -0,0 +1,149 @@
+[sensor]
+Sensor_type   =stSnsImx307_2l_Obj       ;sensor name
+Mode          =0                        ;WDR_MODE_NONE = 0
+                                        ;WDR_MODE_BUILT_IN = 1
+                                        ;WDR_MODE_QUDRA = 2
+                                        ;WDR_MODE_2To1_LINE = 3
+                                        ;WDR_MODE_2To1_FRAME = 4
+                                        ;WDR_MODE_2To1_FRAME_FULL_RATE = 5
+                                        ;WDR_MODE_3To1_LINE = 6
+                                        ;WDR_MODE_3To1_FRAME = 7
+                                        ;WDR_MODE_3To1_FRAME_FULL_RATE = 8
+                                        ;WDR_MODE_4To1_LINE = 9
+                                        ;WDR_MODE_4To1_FRAME = 10
+                                        ;WDR_MODE_4To1_FRAME_FULL_RATE = 11
+DllFile   = /usr/lib/sensors/libsns_imx307_2l.so         ;sensor lib path
+
+
+[mode]
+input_mode =0                           ;INPUT_MODE_MIPI = 0
+                                        ;INPUT_MODE_SUBLVDS = 1
+                                        ;INPUT_MODE_LVDS = 2 ...etc
+
+raw_bitness = 12
+
+[mipi]
+;----------only for mipi_dev---------
+data_type = 2                        	;raw data type: 8/10/12/14 bit
+                                        ;DATA_TYPE_RAW_8BIT = 0,
+                                        ;DATA_TYPE_RAW_10BIT,
+                                        ;DATA_TYPE_RAW_12BIT,
+                                        ;DATA_TYPE_RAW_14BIT,
+                                        ;DATA_TYPE_RAW_16BIT,
+                                        ;DATA_TYPE_YUV420_8BIT_NORMAL,
+                                        ;DATA_TYPE_YUV420_8BIT_LEGACY,
+                                        ;DATA_TYPE_YUV422_8BIT,
+lane_id = 0|2|-1|-1|-1|-1|-1|-1|      ;lane_id: -1 - disable
+
+[isp_image]
+Isp_x      =0
+Isp_y      =0
+Isp_W      =1920
+Isp_H      =1080
+Isp_FrameRate=30
+Isp_Bayer  =0   ;BAYER_RGGB=0, BAYER_GRBG=1, BAYER_GBRG=2, BAYER_BGGR=3
+
+[vi_dev]
+Input_mod = 6
+		; VI_MODE_BT656 = 0,              /* ITU-R BT.656 YUV4:2:2 */
+		; VI_MODE_BT656_PACKED_YUV,       /* ITU-R BT.656 packed YUV4:2:2 */
+		; VI_MODE_BT601,                  /* ITU-R BT.601 YUV4:2:2 */
+		; VI_MODE_DIGITAL_CAMERA,         /* digatal camera mode */
+		; VI_MODE_BT1120_STANDARD,        /* BT.1120 progressive mode */
+		; VI_MODE_BT1120_INTERLEAVED,     /* BT.1120 interstage mode */
+		; VI_MODE_MIPI,                   /* MIPI RAW mode */
+		; VI_MODE_MIPI_YUV420_NORMAL,     /* MIPI YUV420 normal mode */
+		; VI_MODE_MIPI_YUV420_LEGACY,     /* MIPI YUV420 legacy mode */
+		; VI_MODE_MIPI_YUV422,            /* MIPI YUV422 mode */
+		; VI_MODE_LVDS,                   /* LVDS mode */
+		; VI_MODE_HISPI,                  /* HiSPi mode */
+		; VI_MODE_SLVS,                   /* SLVS mode */
+Work_mod =0     ;VI_WORK_MODE_1Multiplex = 0
+                ;VI_WORK_MODE_2Multiplex,
+                ;VI_WORK_MODE_4Multiplex
+Combine_mode =0 ;Y/C composite or separation mode
+                ;VI_COMBINE_COMPOSITE = 0 /*Composite mode */
+                ;VI_COMBINE_SEPARATE,     /*Separate mode */
+Comp_mode    =0 ;Component mode (single-component or dual-component)
+                ;VI_COMP_MODE_SINGLE = 0, /*single component mode */
+                ;VI_COMP_MODE_DOUBLE = 1, /*double component mode */
+Clock_edge   =1 ;Clock edge mode (sampling on the rising or falling edge)
+                ;VI_CLK_EDGE_SINGLE_UP=0, /*rising edge */
+                ;VI_CLK_EDGE_SINGLE_DOWN, /*falling edge */
+Mask_num     =2 ;Component mask
+Mask_0       =0xFFF00000
+Mask_1       =0x0
+Scan_mode    = 1;VI_SCAN_INTERLACED = 0
+                ;VI_SCAN_PROGRESSIVE,
+Data_seq     =2 ;data sequence (ONLY for YUV format)
+                ;----2th component U/V sequence in bt1120
+                ;    VI_INPUT_DATA_VUVU = 0,
+                ;    VI_INPUT_DATA_UVUV,
+                ;----input sequence for yuv
+                ;    VI_INPUT_DATA_UYVY = 0,
+                ;    VI_INPUT_DATA_VYUY,
+                ;    VI_INPUT_DATA_YUYV,
+                ;    VI_INPUT_DATA_YVYU
+
+Vsync   =1      ; vertical synchronization signal
+                ;VI_VSYNC_FIELD = 0,
+                ;VI_VSYNC_PULSE,
+VsyncNeg=1      ;Polarity of the vertical synchronization signal
+                ;VI_VSYNC_NEG_HIGH = 0,
+                ;VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E
+Hsync  =0       ;Attribute of the horizontal synchronization signal
+                ;VI_HSYNC_VALID_SINGNAL = 0,
+                ;VI_HSYNC_PULSE,
+HsyncNeg =0     ;Polarity of the horizontal synchronization signal
+                ;VI_HSYNC_NEG_HIGH = 0,
+                ;VI_HSYNC_NEG_LOW
+VsyncValid =1   ;Attribute of the valid vertical synchronization signal
+                ;VI_VSYNC_NORM_PULSE = 0,
+                ;VI_VSYNC_VALID_SINGAL,
+VsyncValidNeg =0;Polarity of the valid vertical synchronization signal
+                ;VI_VSYNC_VALID_NEG_HIGH = 0,
+                ;VI_VSYNC_VALID_NEG_LOW
+Timingblank_HsyncHfb =0     ;Horizontal front blanking width
+Timingblank_HsyncAct =1920  ;Horizontal effetive width
+Timingblank_HsyncHbb =0     ;Horizontal back blanking width
+Timingblank_VsyncVfb =0     ;Vertical front blanking height
+Timingblank_VsyncVact =1080  ;Vertical effetive width
+Timingblank_VsyncVbb=0      ;Vertical back blanking height
+Timingblank_VsyncVbfb =0    ;Even-field vertical front blanking height(interlace, invalid progressive)
+Timingblank_VsyncVbact=0    ;Even-field vertical effetive width(interlace, invalid progressive)
+Timingblank_VsyncVbbb =0    ;Even-field vertical back blanking height(interlace, invalid progressive)
+
+;----- only for bt656 ----------
+FixCode   =0    ;BT656_FIXCODE_1 = 0,
+                ;BT656_FIXCODE_0
+FieldPolar=0    ;BT656_FIELD_POLAR_STD = 0
+                ;BT656_FIELD_POLAR_NSTD
+DataPath  =1    ;ISP enable or bypass
+                ;VI_PATH_BYPASS    = 0,/* ISP bypass */
+                ;VI_PATH_ISP       = 1,/* ISP enable */
+                ;VI_PATH_RAW       = 2,/* Capture raw data, for debug */
+InputDataType=1 ;VI_DATA_TYPE_YUV = 0,VI_DATA_TYPE_RGB = 1,
+DataRev      =FALSE ;Data reverse. FALSE = 0; TRUE = 1
+DevRect_x=200     ;
+DevRect_y=20    ;
+DevRect_w=1920  ;
+DevRect_h=1080  ;
+
+[vi_chn]
+CapRect_X    =0
+CapRect_Y    =0
+CapRect_Width=1920
+CapRect_Height=1080
+DestSize_Width=1920
+DestSize_Height=1080
+CapSel       =2 ;Frame/field select. ONLY used in interlaced mode
+                ;VI_CAPSEL_TOP = 0,                  /* top field */
+                ;VI_CAPSEL_BOTTOM,                   /* bottom field */
+                ;VI_CAPSEL_BOTH,                     /* top and bottom field */
+
+PixFormat    =26;PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 26 ...etc
+CompressMode =0 ;COMPRESS_MODE_NONE = 0
+                ;COMPRESS_MODE_SEG =1 ...etc
+
+SrcFrameRate=-1 ;Source frame rate. -1: not controll
+FrameRate   =-1 ;Target frame rate. -1: not controll
diff --git a/projects/hi3516ev200_fpv/general/overlay/etc/telemetry.conf b/projects/hi3516ev200_fpv/general/overlay/etc/telemetry.conf
new file mode 100644
index 0000000..d84ca4f
--- /dev/null
+++ b/projects/hi3516ev200_fpv/general/overlay/etc/telemetry.conf
@@ -0,0 +1,14 @@
+wlan=wlan0
+bandwidth=20
+stbc=1
+ldpc=1
+mcs_index=1
+stream_rx=1
+stream_tx=2
+port_rx=14551
+port_tx=14550
+fec_k=1
+fec_n=2
+fec_timeout=0
+guard_interval=long
+one_way=true
diff --git a/projects/hi3516ev200_fpv/general/overlay/etc/wfb.conf b/projects/hi3516ev200_fpv/general/overlay/etc/wfb.conf
new file mode 100644
index 0000000..2359d6b
--- /dev/null
+++ b/projects/hi3516ev200_fpv/general/overlay/etc/wfb.conf
@@ -0,0 +1,18 @@
+daemon=1
+driver=rtl
+wlan=wlan0
+region=BO
+channel=165
+txpower=63
+bandwidth=20
+stbc=1
+ldpc=1
+mcs_index=1
+radio_port=3
+udp_port=5600
+fec_k=8
+fec_n=12
+fec_timeout=0
+guard_interval=long
+driver_txpower_override=30
+telemetry=true
diff --git a/projects/hi3516ev200_fpv/general/overlay/usr/bin/load_goke b/projects/hi3516ev200_fpv/general/overlay/usr/bin/load_goke
new file mode 100755
index 0000000..76143a6
--- /dev/null
+++ b/projects/hi3516ev200_fpv/general/overlay/usr/bin/load_goke
@@ -0,0 +1,366 @@
+#!/bin/sh
+####################Variables Definition##########################
+
+# SoC detect
+CHIP_TYPE=$(ipcinfo --chip-name)
+
+# Dumb cpu remapping
+if [ "$CHIP_TYPE" == "gk7205v210" ]; then
+  CHIP_TYPE=gk7205v200
+fi
+
+# Memory config
+mem_start=0x40000000 # phy mem start
+
+mem_total=$(fw_printenv -n totalmem | tr -d 'M')
+mem_total=${mem_total:=64}
+
+os_mem_size=$(fw_printenv -n osmem | tr -d 'M')
+os_mem_size=${os_mem_size:=32}
+
+BOARD=demo
+YUV_TYPE0=0 # 0 -- raw, 1 --DC, 2 --bt1120, 3 --bt656
+
+cd /lib/modules/$(uname -r)/goke/
+
+##################################################################
+
+# DDR start:0x40000000, kernel start:0x40000000,  OS(32M); MMZ start:0x42000000
+#
+# echo "${chipid}: ${mem_total}/${os_mem_size} | ${mem_start}/${mmz_start} | ${mmz_size}"
+
+# GK7202V300
+#
+# mem_total=64                  # 64M, total mem
+# mem_start=0x40000000          # phy mem start
+# os_mem_size=32                # 32M, os mem
+# mmz_start=0x42000000;         # mmz start addr
+# mmz_size=32M;                 # 32M, mmz size
+
+# GK7205V200
+#
+# mem_total=64                  # 64M, total mem
+# mem_start=0x40000000          # phy mem start
+# os_mem_size=32                # 32M, os mem
+# mmz_start=0x42000000;         # mmz start addr
+# mmz_size=32M;                 # 32M, mmz size
+
+# GK7205V300
+#
+# mem_total=128                 # 128M, total mem
+# mem_start=0x40000000          # phy mem start
+# os_mem_size=32                # 32M, os mem
+# mmz_start=0x42000000;         # mmz start addr
+# mmz_size=96M;                 # 96M, mmz size
+
+# GK7605V100
+#
+# mem_total=512                 # 512M, total mem
+# mem_start=0x40000000          # phy mem start
+# os_mem_size=32                # 32M, os mem
+# mmz_start=0x42000000;         # mmz start addr
+# mmz_size=480M;                # 480M, mmz size
+
+##################################################################
+
+report_error() {
+	echo "******* Error: There's something wrong, please check! *****"
+	exit 1
+}
+
+check_allocator() {
+	allocator=$(grep mmz_allocator /proc/cmdline)
+	if [ -z "${allocator}" ]; then
+		if [ ${mem_total} -ge 128 ]; then
+			set_allocator cma
+		else
+			set_allocator gk
+		fi
+	fi
+}
+
+insert_osal() {
+	check_allocator
+
+	MMZ=$(awk -F '=' '$1=="mmz"{print $2}' RS=" " /proc/cmdline)
+	if [ -z "$MMZ" ]; then
+		modprobe open_osal anony=1 mmz_allocator=gk mmz=anonymous,0,$mmz_start,$mmz_size || report_error
+	else
+		modprobe open_osal anony=1 mmz_allocator=cma mmz=$MMZ || report_error
+	fi
+}
+
+insert_detect() {
+	modprobe open_sys_config chip=$CHIP_TYPE sensors=unknown g_cmos_yuv_flag=$YUV_TYPE0 board=$BOARD
+	insert_osal
+	insmod gk7205v200_base.ko
+	modprobe open_isp
+	modprobe open_sensor_i2c
+	modprobe open_sensor_spi
+}
+
+remove_detect() {
+	rmmod -w open_sensor_spi
+	rmmod -w open_sensor_i2c
+	rmmod -w gk7205v200_isp
+	rmmod -w gk7205v200_base
+	rmmod -w open_osal >/dev/null 2>&1
+	rmmod -w open_sys_config
+}
+
+insert_audio() {
+	insmod gk7205v200_aio.ko
+	insmod gk7205v200_ai.ko
+	insmod gk7205v200_ao.ko
+	insmod gk7205v200_aenc.ko
+	insmod gk7205v200_adec.ko
+	insmod gk7205v200_acodec.ko
+	echo "insert audio"
+}
+
+remove_audio() {
+	rmmod -w gk7205v200_acodec
+	rmmod -w gk7205v200_adec
+	rmmod -w gk7205v200_aenc
+	rmmod -w gk7205v200_ao
+	rmmod -w gk7205v200_ai
+	rmmod -w gk7205v200_aio
+	echo "remove audio"
+}
+
+insert_isp() {
+	modprobe open_isp
+}
+
+insert_sil9024() {
+	i2c_sel=2
+	if [ "$CHIP_TYPE" == "gk7205v300" ]; then
+		i2c_sel=1
+	fi
+
+	if [ "$BOARD" == "sck" ]; then
+		insmod sil9024.ko norm=12 i2c_num=$i2c_sel #1080P@30fps
+	fi
+}
+
+insert_adv7179() {
+	i2c_sel=2
+	if [ "$CHIP_TYPE" == "gk7205v300" ]; then
+		i2c_sel=1
+	fi
+
+	if [ "$BOARD" == "sck" ]; then
+		insmod adv7179.ko norm_mode=0 i2c_num=$i2c_sel # norm_mode = 0:PAL, 1:NTSC
+	fi
+}
+
+insert_isp_piris() {
+	if [ "$CHIP_TYPE" == "gk7605v100" -a "$BOARD" == "demo" ]; then
+		modprobe open_piris
+	fi
+}
+
+insert_ko() {
+	modprobe open_sys_config chip=$CHIP_TYPE sensors=$SENSOR g_cmos_yuv_flag=$YUV_TYPE0 board=$BOARD
+	insert_osal
+	insmod gk7205v200_base.ko
+	insmod gk7205v200_sys.ko
+	# insmod gk7205v200_tde.ko
+	#~ insmod gk7205v200_rgn.ko
+	insmod gk7205v200_vgs.ko
+	insmod gk7205v200_vi.ko
+	insert_isp
+	insmod gk7205v200_vpss.ko
+	# insmod gk7205v200_vo.ko                       # unused on OpenIPC
+	# insmod gfbg.ko video="gfbg:vram0_size:1620"   # unused on OpenIPC  # default fb0:D1
+	insmod gk7205v200_chnl.ko
+	insmod gk7205v200_vedu.ko
+	insmod gk7205v200_rc.ko
+	insmod gk7205v200_venc.ko
+	insmod gk7205v200_h264e.ko
+	insmod gk7205v200_h265e.ko
+	#~ insmod gk7205v200_jpege.ko
+	#~ insmod gk7205v200_ive.ko save_power=0
+	modprobe open_pwm
+	modprobe open_sensor_i2c
+	modprobe open_sensor_spi
+	# insert_isp_piris                              # unused on OpenIPC
+	# insert_sil9024;                               # unused on OpenIPC  # BT1120
+	#~ insert_audio
+	modprobe open_mipi_rx
+	# insmod gk7205v200_pm.ko                       # unused on OpenIPC
+	modprobe open_wdt
+}
+
+remove_ko() {
+	rmmod -w open_wdt
+	# rmmod -w gk7205v200_pm                           # unused on OpenIPC
+	remove_audio
+	rmmod -w open_mipi_rx
+	# rmmod -w open_piris                              # unused on OpenIPC
+	# rmmod -w sil9024 &> /dev/null                    # unused on OpenIPC
+	rmmod -w gk7205v200_ive
+	rmmod -w gk7205v200_rc
+	rmmod -w gk7205v200_jpege
+	rmmod -w gk7205v200_h264e
+	rmmod -w gk7205v200_h265e
+	rmmod -w gk7205v200_venc
+	rmmod -w gk7205v200_vedu
+	rmmod -w gk7205v200_chnl
+	# rmmod -w gfbg                                    # unused on OpenIPC
+	# rmmod -w gk7205v200_vo                           # unused on OpenIPC
+	rmmod -w gk7205v200_vpss
+	rmmod -w open_isp
+	rmmod -w gk7205v200_vi
+	rmmod -w gk7205v200_vgs
+	rmmod -w gk7205v200_rgn
+	# rmmod -w gk7205v200_tde
+	rmmod -w open_sensor_i2c &>/dev/null
+	rmmod -w open_sensor_spi &>/dev/null
+	rmmod -w open_pwm
+	rmmod -w gk7205v200_sys
+	rmmod -w gk7205v200_base
+	rmmod -w open_osal
+	rmmod -w open_sys_config
+}
+
+load_usage() {
+	echo "Usage:  ./load_goke [-option] [sensor_name]"
+	echo "options:"
+	echo "    -i                       insert modules"
+	echo "    -r                       remove modules"
+	echo "    -a                       remove modules first, then insert modules"
+	echo "    -sensor sensor_name      config sensor type [default: imx307]"
+	echo "    -h                       help information"
+	echo -e "Available sensors: gc2053 imx307 imx327 imx335 os05a sc2231 sc3235 sc4236  etc."
+	echo -e "for example: ./load_goke -i -sensor imx307 -osmem 32M -board demo -yuv0 0\n"
+}
+
+calc_mmz_info() {
+	mmz_start=$(echo "$mem_start $os_mem_size" |
+		awk 'BEGIN { temp = 0; }
+        {
+                temp = $1/1024/1024 + $2;
+        }
+        END { printf("0x%x00000\n", temp); }')
+
+	mmz_size=$(echo "$mem_total $os_mem_size" |
+		awk 'BEGIN { temp = 0; }
+        {
+                temp = $1 - $2;
+        }
+        END { printf("%dM\n", temp); }')
+	echo "mmz_start: $mmz_start, mmz_size: $mmz_size"
+}
+
+######################parse arg###################################
+b_arg_sensor0=0
+b_arg_sensor1=0
+b_arg_yuv_type0=0
+b_arg_insmod=0
+b_arg_remove=0
+b_arg_os_mem=0
+b_arg_board=0
+
+for arg in $@; do
+	if [ $b_arg_sensor0 -eq 1 ]; then
+		b_arg_sensor0=0
+		SENSOR=$arg
+	fi
+
+	if [ $b_arg_os_mem -eq 1 ]; then
+		b_arg_os_mem=0
+		os_mem_size=$arg
+
+		if [ -z $os_mem_size ]; then
+			echo "[error] os_mem_size is null"
+			exit
+		fi
+	fi
+
+	if [ $b_arg_yuv_type0 -eq 1 ]; then
+		b_arg_yuv_type0=0
+		YUV_TYPE0=$arg
+	fi
+
+	if [ $b_arg_board -eq 1 ]; then
+		b_arg_board=0
+		BOARD=$arg
+	fi
+
+	case $arg in
+	"-i")
+		b_arg_insmod=1
+		;;
+	"-r")
+		b_arg_remove=1
+		;;
+	"-a")
+		b_arg_insmod=1
+		b_arg_remove=1
+		;;
+	"-h")
+		load_usage
+		;;
+	"-sensor0")
+		b_arg_sensor0=1
+		;;
+	"-sensor")
+		b_arg_sensor0=1
+		;;
+	"-osmem")
+		b_arg_os_mem=1
+		;;
+	"-yuv0")
+		b_arg_yuv_type0=1
+		;;
+	"-board")
+		b_arg_board=1
+		;;
+	esac
+done
+#######################parse arg end########################
+if [ $os_mem_size -ge $mem_total ]; then
+	echo "[err] os_mem[$os_mem_size], over total_mem[$mem_total]"
+	exit
+fi
+
+calc_mmz_info
+
+#######################Action###############################
+
+if [ $# -lt 1 ]; then
+	load_usage
+	exit 0
+fi
+
+if [ $b_arg_insmod -eq 1 ]; then
+	if [ -n "$SENSOR" ]; then
+		logger -s -p daemon.info -t goke "SENSOR: ${SENSOR}"
+	else
+		if fw_printenv -n sensor >/dev/null; then
+			export SENSOR=$(fw_printenv -n sensor)
+			logger -s -p daemon.info -t goke "Get data from U-Boot ENV and set SENSOR as ${SENSOR}"
+		else
+			insert_detect
+			SENSOR_DETECT=$(ipcinfo --short-sensor)
+			export SENSOR=${SENSOR_DETECT:=unknown}
+			remove_detect
+			logger -s -p daemon.info -t goke "Get data from ipcinfo and set SENSOR as ${SENSOR}"
+			fw_setenv sensor $SENSOR && logger -s -p daemon.info -t goke "Writing ${SENSOR} to U-Boot ENV"
+		fi
+	fi
+fi
+
+if [ $b_arg_remove -eq 1 ]; then
+	remove_ko
+fi
+
+if [ "$SENSOR" = "unknown" ]; then
+	logger -s -p daemon.err -t goke "SENSOR is not detected, aborting..."
+	exit 1
+else
+	if [ $b_arg_insmod -eq 1 ]; then
+		insert_ko
+	fi
+fi