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-info - write to stdout information about selected board\n\ + - make BOARD= all - build all needed for a board (toolchain, kernel and rootfs images)\n\ + - make overlayed-rootfs- 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 +# +# 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 == 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