diff --git a/buildroot/DEVELOPERS b/buildroot/DEVELOPERS index 7fdc4b8db1..99c8a36980 100644 --- a/buildroot/DEVELOPERS +++ b/buildroot/DEVELOPERS @@ -589,6 +589,7 @@ F: package/fuse-overlayfs/ F: package/go/ F: package/go-bootstrap-stage1/ F: package/go-bootstrap-stage2/ +F: package/go-bootstrap-stage3/ F: package/gocryptfs/ F: package/mbpfan/ F: package/moby-buildkit/ diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S30eth b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S30eth index d30bc52c18..04186dd4f0 100755 --- a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S30eth +++ b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S30eth @@ -2,16 +2,56 @@ . /etc/profile +# /boot/eth.nodhcp for example +# ipaddr/net gw[optional] +# 192.168.0.101/24 192.168.0.1 +# 192.168.3.116/22 + +RESERVE_INET="192.168.0.1/24" + start() { printf "start ethernet: " - if [ ! -e /boot/eth.nodhcp ] + if [ -e /boot/eth.nodhcp ] then + cat /boot/eth.nodhcp | while read inet gw + do + addr=${inet%/*} + netid=${inet#*/} + [ -z $gw ] && + gw=$( echo $addr| ( IFS='.' read a b c d; echo $(( + (((((($a<<8)+$b)<<8)+$c)<<8)+$d) + & (((1<<$netid)-1)<<(32-$netid)) + )) + )) && + gw=$(($gw>>24&0xff)).$(($gw>>16&0xff)).$(($gw>>8&0xff)).$((1+( $gw>>0&0xff ))) + + arping -Dqc2 -Ieth0 $addr || continue + ip a add $inet brd + dev eth0 + ip r add default via $gw dev eth0 + cat > /etc/resolve.conf << EOF +nameserver $gw +nameserver 8.8.8.8 +nameserver 114.114.114.114 +EOF + break + done && + ip a show dev eth0|grep inet || ( + udhcpc -i eth0 -t 3 -T 1 -A 5 -b -p /run/udhcpc.eth0.pid &>/dev/null + ip a show dev eth0|grep inet + ) || ( + # failed to apply dynamic addr, need a available static addr to visit the LAN + inet=$RESERVE_INET + addr=${inet%/*} + ip a add $inet brd + dev eth0 + ) || exit 1 + else (udhcpc -i eth0 -t 10 -T 1 -A 5 -b -p /run/udhcpc.eth0.pid) & fi echo "OK" } stop() { + [[ ! -e "/run/udhcpc.eth0.pid" ]] && echo "udhcpc is not running..." && exit 1 kill `cat /run/udhcpc.eth0.pid` rm /run/udhcpc.eth0.pid } diff --git a/buildroot/configs/cvitek_SG200X_musl_riscv64_defconfig b/buildroot/configs/cvitek_SG200X_musl_riscv64_defconfig index 4c1db8b39b..13ba77f25d 100644 --- a/buildroot/configs/cvitek_SG200X_musl_riscv64_defconfig +++ b/buildroot/configs/cvitek_SG200X_musl_riscv64_defconfig @@ -579,6 +579,9 @@ BR2_PACKAGE_PYTHON_XLWT=y BR2_PACKAGE_PYTHON_XMODEM=y BR2_PACKAGE_PYTHON_ZEROCONF=y +BR2_PACKAGE_HOST_PYTHON3=y +BR2_PACKAGE_HOST_PYTHON3_SSL=y + # BR2_PACKAGE_MGBA is not set # BR2_PACKAGE_GB_TEST_ROMS is not set diff --git a/buildroot/package/Config.in b/buildroot/package/Config.in index c15ccc803a..663bc371de 100644 --- a/buildroot/package/Config.in +++ b/buildroot/package/Config.in @@ -2806,6 +2806,10 @@ menu "Sipeed" source "package/aic8800-sdio-firmware/Config.in" source "package/cvitek-riscv64-musl-sysroot/Config.in" source "package/lcdtest/Config.in" + source "package/maix-cdk/Config.in" + source "package/nanokvm-server/Config.in" + source "package/nanokvm-sg200x/Config.in" + source "package/tailscale-riscv64/Config.in" source "package/tpudemo-sg200x/Config.in" source "package/xuantie-gdb/Config.in" source "package/sg2002-codec-firmware/Config.in" diff --git a/buildroot/package/Config.in.host b/buildroot/package/Config.in.host index c80842c33a..cc3d8c1bbd 100644 --- a/buildroot/package/Config.in.host +++ b/buildroot/package/Config.in.host @@ -46,6 +46,7 @@ menu "Host utilities" source "package/go/Config.in.host" source "package/go-bootstrap-stage1/Config.in.host" source "package/go-bootstrap-stage2/Config.in.host" + source "package/go-bootstrap-stage3/Config.in.host" source "package/google-breakpad/Config.in.host" source "package/gptfdisk/Config.in.host" source "package/imagemagick/Config.in.host" diff --git a/buildroot/package/cvitek-riscv64-musl-sysroot/cvitek-riscv64-musl-sysroot.mk b/buildroot/package/cvitek-riscv64-musl-sysroot/cvitek-riscv64-musl-sysroot.mk index 3559c9f0ff..49888f11b2 100644 --- a/buildroot/package/cvitek-riscv64-musl-sysroot/cvitek-riscv64-musl-sysroot.mk +++ b/buildroot/package/cvitek-riscv64-musl-sysroot/cvitek-riscv64-musl-sysroot.mk @@ -4,8 +4,21 @@ # ################################################################################ -CVITEK_RISCV64_MUSL_SYSROOT_VERSION = fb0a6ac7409fb477c5f46ced75bf05527def7cb9 -CVITEK_RISCV64_MUSL_SYSROOT_SITE = $(call github,0x754C,cvitek-riscv64-musl-sysroot,$(CVITEK_RISCV64_MUSL_SYSROOT_VERSION)) +CVITEK_RISCV64_MUSL_SYSROOT_VERSION = 1.0.0 +CVITEK_RISCV64_MUSL_SYSROOT_SITE = $(TOPDIR)/package/cvitek-riscv64-musl-sysroot +CVITEK_RISCV64_MUSL_SYSROOT_SITE_METHOD = local + +define CVITEK_RISCV64_MUSL_SYSROOT_BUILD_CMDS + rm -f $(@D)/Config* + rm -f $(@D)/*.mk + mkdir -pv $(@D)/usr/lib/ + if [ ! -e $(@D)/lib ]; then \ + ln -s usr/lib $(@D)/lib ; \ + fi + if [ -e $(realpath $(TOOLCHAIN_EXTERNAL_BIN)../sysroot/lib) ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(realpath $(TOOLCHAIN_EXTERNAL_BIN)../sysroot/lib)/ld-*.so* $(@D)/usr/lib/ ; \ + fi +endef define CVITEK_RISCV64_MUSL_SYSROOT_INSTALL_TARGET_CMDS rsync -av ${@D}/* $(TARGET_DIR)/ diff --git a/buildroot/package/go-bootstrap-stage2/go-bootstrap-stage2.hash b/buildroot/package/go-bootstrap-stage2/go-bootstrap-stage2.hash index 6d4c718a40..d61663cac9 100644 --- a/buildroot/package/go-bootstrap-stage2/go-bootstrap-stage2.hash +++ b/buildroot/package/go-bootstrap-stage2/go-bootstrap-stage2.hash @@ -1,3 +1,3 @@ # From https://go.dev/dl -sha256 e25c9ab72d811142b7f41ff6da5165fec2d1be5feec3ef2c66bc0bdecb431489 go1.19.11.src.tar.gz +sha256 ccf36b53fb0024a017353c3ddb22c1f00bc7a8073c6aac79042da24ee34434d3 go1.19.13.src.tar.gz sha256 2d36597f7117c38b006835ae7f537487207d8ec407aa9d9980794b2030cbc067 LICENSE diff --git a/buildroot/package/go-bootstrap-stage2/go-bootstrap-stage2.mk b/buildroot/package/go-bootstrap-stage2/go-bootstrap-stage2.mk index 72f3200a2e..98bf624b57 100644 --- a/buildroot/package/go-bootstrap-stage2/go-bootstrap-stage2.mk +++ b/buildroot/package/go-bootstrap-stage2/go-bootstrap-stage2.mk @@ -6,7 +6,7 @@ # Use last Go version that go-bootstrap-stage1 can build: v1.19.x # See https://golang.org/doc/install/source#bootstrapFromSource -GO_BOOTSTRAP_STAGE2_VERSION = 1.19.11 +GO_BOOTSTRAP_STAGE2_VERSION = 1.19.13 GO_BOOTSTRAP_STAGE2_SITE = https://storage.googleapis.com/golang GO_BOOTSTRAP_STAGE2_SOURCE = go$(GO_BOOTSTRAP_STAGE2_VERSION).src.tar.gz diff --git a/buildroot/package/go-bootstrap-stage3/0001-cmd-dist-set-buildvcs-false-when-building-go-bootstr.patch b/buildroot/package/go-bootstrap-stage3/0001-cmd-dist-set-buildvcs-false-when-building-go-bootstr.patch new file mode 100644 index 0000000000..58f4581b02 --- /dev/null +++ b/buildroot/package/go-bootstrap-stage3/0001-cmd-dist-set-buildvcs-false-when-building-go-bootstr.patch @@ -0,0 +1,71 @@ +From 6b05378097c6a386ed9912d2471976dc39504e86 Mon Sep 17 00:00:00 2001 +From: Christian Stewart +Date: Thu, 27 Jul 2023 21:28:47 -0700 +Subject: [PATCH] cmd/dist: set buildvcs=false when building go-bootstrap + +When building go-bootstrap as part of the make.bash process, the cmd/dist +invokes the bootstrap Go compiler to build the go_bootstrap tool: + +${GOROOT_BOOTSTRAP}/bin/go install -tags=math_big_pure_go compiler_bootstrap purego bootstrap/cmd/... + +If there is an invalid .git directory in a parent of ${GOROOT_BOOTSTRAP}, +make.bash will fail. Reproduction of the issue: + + mkdir go-issue-61620 + cd ./go-issue-61620 + wget https://go.dev/dl/go1.19.11.src.tar.gz + mkdir go-bootstrap + tar -xf go1.19.11.src.tar.gz -C ./go-bootstrap --strip-components=1 + cd ./go-bootstrap/src/ + bash make.bash + cd ../../ + wget https://go.dev/dl/go1.20.6.src.tar.gz + mkdir go + tar -xf go1.20.6.src.tar.gz -C ./go/ --strip-components=1 + printf "gitdir: ../../does/not/exist/.git" > ./.git + cd ./go/src/ + GOROOT_BOOTSTRAP=$(pwd)/../../go-bootstrap/ bash make.bash + +The build fails with the following error: + + Building Go toolchain1 using [snip]/go-1.19.10. + error obtaining VCS status: exit status 128 + Use -buildvcs=false to disable VCS stamping. + go tool dist: FAILED: [snip]/go-1.19.10/bin/go install -tags=math_big_pure_go \ + compiler_bootstrap purego bootstrap/cmd/...: exit status 1 + +This change unconditionally sets -buildvcs=false when compiling go-bootstrap. We +don't need the revision information in those binaries anyway. Setting this flag +was previously not done as we were unsure if the go-bootstrap compiler would be +new enough to support the buildvcs build flag. Since Go 1.20.x, Go 1.19.x is the +minimum version for go-bootstrap, and supports -buildvcs=false. We can now set +-buildvcs=false without worrying about compatibility. + +Related: https://github.com/golang/go/issues/54852 +Fixes: https://github.com/golang/go/issues/61620 + +Upstream: https://github.com/golang/go/pull/61621 + +Signed-off-by: Christian Stewart +Signed-off-by: Romain Naour +--- + src/cmd/dist/buildtool.go | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go +index a528d7aa76..3b411d6ebb 100644 +--- a/src/cmd/dist/buildtool.go ++++ b/src/cmd/dist/buildtool.go +@@ -221,6 +221,9 @@ func bootstrapBuildTools() { + cmd := []string{ + pathf("%s/bin/go", goroot_bootstrap), + "install", ++ // Fixes cases where an invalid .git is present in a parent of GOROOT_BOOTSTRAP. ++ // See: https://github.com/golang/go/issues/61620 ++ "-buildvcs=false", + "-tags=math_big_pure_go compiler_bootstrap purego", + } + if vflag > 0 { +-- +2.41.0 + diff --git a/buildroot/package/go-bootstrap-stage3/Config.in.host b/buildroot/package/go-bootstrap-stage3/Config.in.host new file mode 100644 index 0000000000..1714c2fb15 --- /dev/null +++ b/buildroot/package/go-bootstrap-stage3/Config.in.host @@ -0,0 +1,4 @@ +config BR2_PACKAGE_HOST_GO_BOOTSTRAP_STAGE3_ARCH_SUPPORTS + bool + default y + depends on BR2_PACKAGE_HOST_GO_BOOTSTRAP_STAGE2_ARCH_SUPPORTS diff --git a/buildroot/package/go-bootstrap-stage3/go-bootstrap-stage3.hash b/buildroot/package/go-bootstrap-stage3/go-bootstrap-stage3.hash new file mode 100644 index 0000000000..b1aed10c7c --- /dev/null +++ b/buildroot/package/go-bootstrap-stage3/go-bootstrap-stage3.hash @@ -0,0 +1,3 @@ +# From https://go.dev/dl +sha256 dc806cf75a87e1414b5b4c3dcb9dd3e9cc98f4cfccec42b7af617d5a658a3c43 go1.21.8.src.tar.gz +sha256 2d36597f7117c38b006835ae7f537487207d8ec407aa9d9980794b2030cbc067 LICENSE diff --git a/buildroot/package/go-bootstrap-stage3/go-bootstrap-stage3.mk b/buildroot/package/go-bootstrap-stage3/go-bootstrap-stage3.mk new file mode 100644 index 0000000000..bdc8459595 --- /dev/null +++ b/buildroot/package/go-bootstrap-stage3/go-bootstrap-stage3.mk @@ -0,0 +1,54 @@ +################################################################################ +# +# go-bootstrap-stage3 +# +################################################################################ + +# Use last Go version that go-bootstrap-stage2 can build: v1.21.x +# See https://go.dev/doc/go1.22#bootstrap +GO_BOOTSTRAP_STAGE3_VERSION = 1.21.8 +GO_BOOTSTRAP_STAGE3_SITE = https://storage.googleapis.com/golang +GO_BOOTSTRAP_STAGE3_SOURCE = go$(GO_BOOTSTRAP_STAGE3_VERSION).src.tar.gz + +GO_BOOTSTRAP_STAGE3_LICENSE = BSD-3-Clause +GO_BOOTSTRAP_STAGE3_LICENSE_FILES = LICENSE + +# Use go-bootstrap-stage2 to bootstrap. +HOST_GO_BOOTSTRAP_STAGE3_DEPENDENCIES = host-go-bootstrap-stage2 + +HOST_GO_BOOTSTRAP_STAGE3_ROOT = $(HOST_DIR)/lib/go-$(GO_BOOTSTRAP_STAGE3_VERSION) + +# The go build system is not compatible with ccache, so use +# HOSTCC_NOCCACHE. See https://github.com/golang/go/issues/11685. +HOST_GO_BOOTSTRAP_STAGE3_MAKE_ENV = \ + GO111MODULE=off \ + GOCACHE=$(HOST_GO_HOST_CACHE) \ + GOROOT_BOOTSTRAP=$(HOST_GO_BOOTSTRAP_STAGE2_ROOT) \ + GOROOT_FINAL=$(HOST_GO_BOOTSTRAP_STAGE3_ROOT) \ + GOROOT="$(@D)" \ + GOBIN="$(@D)/bin" \ + GOOS=linux \ + CC=$(HOSTCC_NOCCACHE) \ + CXX=$(HOSTCXX_NOCCACHE) \ + CGO_ENABLED=0 + +define HOST_GO_BOOTSTRAP_STAGE3_BUILD_CMDS + cd $(@D)/src && \ + $(HOST_GO_BOOTSTRAP_STAGE3_MAKE_ENV) ./make.bash $(if $(VERBOSE),-v) +endef + +define HOST_GO_BOOTSTRAP_STAGE3_INSTALL_CMDS + $(INSTALL) -D -m 0755 $(@D)/bin/go $(HOST_GO_BOOTSTRAP_STAGE3_ROOT)/bin/go + $(INSTALL) -D -m 0755 $(@D)/bin/gofmt $(HOST_GO_BOOTSTRAP_STAGE3_ROOT)/bin/gofmt + + cp -a $(@D)/lib $(HOST_GO_BOOTSTRAP_STAGE3_ROOT)/ + + mkdir -p $(HOST_GO_BOOTSTRAP_STAGE3_ROOT)/pkg + cp -a $(@D)/pkg/include $(HOST_GO_BOOTSTRAP_STAGE3_ROOT)/pkg/ + cp -a $(@D)/pkg/tool $(HOST_GO_BOOTSTRAP_STAGE3_ROOT)/pkg/ + + # The Go sources must be installed to the host/ tree for the Go stdlib. + cp -a $(@D)/src $(HOST_GO_BOOTSTRAP_STAGE3_ROOT)/ +endef + +$(eval $(host-generic-package)) diff --git a/buildroot/package/go/Config.in.host b/buildroot/package/go/Config.in.host index b87b862cec..0d89e875ad 100644 --- a/buildroot/package/go/Config.in.host +++ b/buildroot/package/go/Config.in.host @@ -2,7 +2,7 @@ config BR2_PACKAGE_HOST_GO_TARGET_ARCH_SUPPORTS bool default y - depends on BR2_PACKAGE_HOST_GO_BOOTSTRAP_STAGE2_ARCH_SUPPORTS + depends on BR2_PACKAGE_HOST_GO_BOOTSTRAP_STAGE3_ARCH_SUPPORTS # See https://go.dev/doc/install/source#environment # See src/go/build/syslist.go for the list of supported architectures depends on (BR2_arm && BR2_TOOLCHAIN_SUPPORTS_PIE) || BR2_aarch64 \ @@ -30,4 +30,4 @@ config BR2_PACKAGE_HOST_GO_TARGET_CGO_LINKING_SUPPORTS config BR2_PACKAGE_HOST_GO_HOST_ARCH_SUPPORTS bool default y - depends on BR2_PACKAGE_HOST_GO_BOOTSTRAP_STAGE2_ARCH_SUPPORTS + depends on BR2_PACKAGE_HOST_GO_BOOTSTRAP_STAGE3_ARCH_SUPPORTS diff --git a/buildroot/package/go/go.hash b/buildroot/package/go/go.hash index d008019e94..d300f6e2c9 100644 --- a/buildroot/package/go/go.hash +++ b/buildroot/package/go/go.hash @@ -1,3 +1,3 @@ # From https://go.dev/dl -sha256 00197ab20f33813832bff62fd93cca1c42a08cc689a32a6672ca49591959bff6 go1.21.7.src.tar.gz +sha256 ac9c723f224969aee624bc34fd34c9e13f2a212d75c71c807de644bb46e112f6 go1.22.5.src.tar.gz sha256 2d36597f7117c38b006835ae7f537487207d8ec407aa9d9980794b2030cbc067 LICENSE diff --git a/buildroot/package/go/go.mk b/buildroot/package/go/go.mk index 9efd4a3123..e6f61d643b 100644 --- a/buildroot/package/go/go.mk +++ b/buildroot/package/go/go.mk @@ -4,7 +4,7 @@ # ################################################################################ -GO_VERSION = 1.21.7 +GO_VERSION = 1.22.5 GO_SITE = https://storage.googleapis.com/golang GO_SOURCE = go$(GO_VERSION).src.tar.gz @@ -12,7 +12,7 @@ GO_LICENSE = BSD-3-Clause GO_LICENSE_FILES = LICENSE GO_CPE_ID_VENDOR = golang -HOST_GO_DEPENDENCIES = host-go-bootstrap-stage2 +HOST_GO_DEPENDENCIES = host-go-bootstrap-stage3 HOST_GO_GOPATH = $(HOST_DIR)/share/go-path HOST_GO_HOST_CACHE = $(HOST_DIR)/share/host-go-cache HOST_GO_ROOT = $(HOST_DIR)/lib/go @@ -128,7 +128,7 @@ HOST_GO_HOST_ENV = \ HOST_GO_MAKE_ENV = \ GO111MODULE=off \ GOCACHE=$(HOST_GO_HOST_CACHE) \ - GOROOT_BOOTSTRAP=$(HOST_GO_BOOTSTRAP_STAGE2_ROOT) \ + GOROOT_BOOTSTRAP=$(HOST_GO_BOOTSTRAP_STAGE3_ROOT) \ GOROOT_FINAL=$(HOST_GO_ROOT) \ GOROOT="$(@D)" \ GOBIN="$(@D)/bin" \ diff --git a/buildroot/package/maix-cdk/0000-add-distapps.sh.patch b/buildroot/package/maix-cdk/0000-add-distapps.sh.patch new file mode 100644 index 0000000000..2a9b93f78e --- /dev/null +++ b/buildroot/package/maix-cdk/0000-add-distapps.sh.patch @@ -0,0 +1,61 @@ +From 41f213a4fff2ea878ee888c99d38ed47cbe93476 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Sun, 27 Oct 2024 07:24:26 +0100 +Subject: [PATCH] add distapps.sh + +--- + distapps.sh | 42 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + create mode 100755 distapps.sh + +diff --git a/distapps.sh b/distapps.sh +new file mode 100755 +index 0000000..723b1d7 +--- /dev/null ++++ b/distapps.sh +@@ -0,0 +1,42 @@ ++#!/bin/sh ++m=`dirname $0` ++t=${m}/dist ++rm -rf ${t}/maixapp/ ++mkdir -p ${t} ++t=${t}/maixapp ++mkdir ${t} ++mkdir ${t}/lib ++mkdir ${t}/tmp ++l=${t}/lib ++echo "projects:" ++for d in $m/projects/app_* ; do ++ a=`dirname $d` ++ b=`basename $d | cut -d '_' -f 2-` ++ #if [ ! -e ${d}/dist/${b}_release/${b} ]; then ++ if [ -e ${a}/apps/${b}/${b} ]; then ++ echo $b ++ mkdir ${t}/${b} ++ rsync -avpPxH ${a}/apps/${b}/ ${t}/${b}/ ++ chmod +x ${t}/${b}/${b} ++ if [ -d ${t}/${b}/dl_lib ]; then ++ rsync -avpPxH ${a}/apps/${b}/dl_lib/ ${l}/ ++ rm -rf ${t}/${b}/dl_lib/ ++ ln -s ../lib ${t}/${b}/dl_lib ++ fi ++ fi ++done ++echo "examples:" ++for d in $m/examples/* ; do ++ b=`basename $d` ++ if [ -e ${d}/dist/${b}_release/${b} ]; then ++ echo $b ++ mkdir ${t}/${b} ++ rsync -avpPxH ${d}/dist/${b}_release/ ${t}/${b}/ ++ chmod +x ${t}/${b}/${b} ++ if [ -d ${t}/${b}/dl_lib ]; then ++ rsync -avpPxH ${d}/dist/${b}_release/dl_lib/ ${l}/ ++ rm -rf ${t}/${b}/dl_lib/ ++ ln -s ../lib ${t}/${b}/dl_lib ++ fi ++ fi ++done +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0001-genconfig-disable-menuconfig.patch b/buildroot/package/maix-cdk/0001-genconfig-disable-menuconfig.patch new file mode 100644 index 0000000000..e11f4fd45a --- /dev/null +++ b/buildroot/package/maix-cdk/0001-genconfig-disable-menuconfig.patch @@ -0,0 +1,34 @@ +From 482d93cbf4ac61a420ee41f25acc4c32745459c3 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Tue, 29 Oct 2024 01:42:41 +0100 +Subject: [PATCH] genconfig: disable menuconfig + +--- + tools/kconfig/genconfig.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/kconfig/genconfig.py b/tools/kconfig/genconfig.py +index 8d58f7b..c787cd7 100644 +--- a/tools/kconfig/genconfig.py ++++ b/tools/kconfig/genconfig.py +@@ -10,7 +10,7 @@ kconfig_lib_path = sys.path[0]+"/Kconfiglib" + sys.path.append(kconfig_lib_path) + + import kconfiglib +-from menuconfig import menuconfig ++#from menuconfig import menuconfig + + + def _cmake_contents(kconfig, header): +@@ -153,7 +153,7 @@ else: + kconfig.load_config() + + if args.menuconfig == "True": +- menuconfig(kconfig) ++ print("menuconfig(kconfig) disabled!") + + # write back + for fmt, filename in out_format.items(): +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0101-examples-decoder_demo-encode_demo-include-fcntl.h.patch b/buildroot/package/maix-cdk/0101-examples-decoder_demo-encode_demo-include-fcntl.h.patch new file mode 100644 index 0000000000..ec5449a484 --- /dev/null +++ b/buildroot/package/maix-cdk/0101-examples-decoder_demo-encode_demo-include-fcntl.h.patch @@ -0,0 +1,37 @@ +From 41b264803974f080fec5d9826641a3f0aaaff320 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Sun, 27 Oct 2024 08:09:34 +0100 +Subject: [PATCH] examples: decoder_demo/encode_demo: include fcntl.h + +--- + examples/decoder_demo/main/src/main.cpp | 1 + + examples/encode_demo/main/src/main.cpp | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/examples/decoder_demo/main/src/main.cpp b/examples/decoder_demo/main/src/main.cpp +index 6c5b551..fe7f011 100644 +--- a/examples/decoder_demo/main/src/main.cpp ++++ b/examples/decoder_demo/main/src/main.cpp +@@ -4,6 +4,7 @@ + #include "sophgo_middleware.hpp" + using namespace maix; + extern "C" { ++#include + #include + #include + #include +diff --git a/examples/encode_demo/main/src/main.cpp b/examples/encode_demo/main/src/main.cpp +index decb7b5..ed6fda0 100644 +--- a/examples/encode_demo/main/src/main.cpp ++++ b/examples/encode_demo/main/src/main.cpp +@@ -10,6 +10,7 @@ + using namespace maix; + + extern "C" { ++#include + #include + #include + #include +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0102-set-_bind_camera-initial-value-to-false.patch b/buildroot/package/maix-cdk/0102-set-_bind_camera-initial-value-to-false.patch new file mode 100644 index 0000000000..d828855ef6 --- /dev/null +++ b/buildroot/package/maix-cdk/0102-set-_bind_camera-initial-value-to-false.patch @@ -0,0 +1,25 @@ +From 56d7136f3068e8e0a1c9cc10571eb8601b6ffe96 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Sat, 30 Nov 2024 00:39:36 +0100 +Subject: [PATCH] set _bind_camera initial value to false + +--- + components/vision/port/maixcam/maix_video_mmf.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/components/vision/port/maixcam/maix_video_mmf.cpp b/components/vision/port/maixcam/maix_video_mmf.cpp +index 7f0fc60..a99ba26 100644 +--- a/components/vision/port/maixcam/maix_video_mmf.cpp ++++ b/components/vision/port/maixcam/maix_video_mmf.cpp +@@ -231,7 +231,7 @@ namespace maix::video + _need_capture = capture; + _capture_image = NULL; + _camera = NULL; +- _bind_camera = NULL; ++ _bind_camera = false; + _start_encode_ms = 0; + _encode_started = false; + _block = block; +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0104-peripheral-spi-use-size_t-for-data-size.patch b/buildroot/package/maix-cdk/0104-peripheral-spi-use-size_t-for-data-size.patch new file mode 100644 index 0000000000..ab45c47a17 --- /dev/null +++ b/buildroot/package/maix-cdk/0104-peripheral-spi-use-size_t-for-data-size.patch @@ -0,0 +1,25 @@ +From 3220370590a7efe5b8b2721838ad0e79fb9c46ff Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Thu, 26 Dec 2024 01:58:35 +0100 +Subject: [PATCH 2/3] peripheral: spi: use size_t for data size + +--- + components/peripheral/port/maixcam/maix_spi.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/components/peripheral/port/maixcam/maix_spi.cpp b/components/peripheral/port/maixcam/maix_spi.cpp +index 89527cc..030059b 100755 +--- a/components/peripheral/port/maixcam/maix_spi.cpp ++++ b/components/peripheral/port/maixcam/maix_spi.cpp +@@ -197,7 +197,7 @@ namespace maix::peripheral::spi + if (read_len <= 0) + return nullptr; + +- unsigned long w_size = 0; ++ size_t w_size = 0; + if (nullptr != data) + w_size = data->size(); + size_t len = std::max(w_size, static_cast(read_len)); +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0105-vision-rtmp-rtsp-fix-SEEK_CUR-not-defined-for-ffmpeg.patch b/buildroot/package/maix-cdk/0105-vision-rtmp-rtsp-fix-SEEK_CUR-not-defined-for-ffmpeg.patch new file mode 100644 index 0000000000..7261a24405 --- /dev/null +++ b/buildroot/package/maix-cdk/0105-vision-rtmp-rtsp-fix-SEEK_CUR-not-defined-for-ffmpeg.patch @@ -0,0 +1,57 @@ +From e3e6abeb59c12612a6fd2795fdce90e29ffb0b21 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Thu, 26 Dec 2024 01:59:38 +0100 +Subject: [PATCH 3/3] vision: rtmp/rtsp: fix SEEK_CUR not defined for ffmpeg + +--- + components/vision/port/maixcam/maix_rtmp_maixcam.cpp | 11 ++++++----- + components/vision/port/maixcam/maix_rtsp_maixcam.cpp | 2 +- + 2 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/components/vision/port/maixcam/maix_rtmp_maixcam.cpp b/components/vision/port/maixcam/maix_rtmp_maixcam.cpp +index 72adcc2..16e3da9 100644 +--- a/components/vision/port/maixcam/maix_rtmp_maixcam.cpp ++++ b/components/vision/port/maixcam/maix_rtmp_maixcam.cpp +@@ -1,8 +1,3 @@ +-#include "maix_rtmp.hpp" +- +-#include "maix_video.hpp" +-#include "maix_basic.hpp" +-#include "sophgo_middleware.hpp" + #include + #include + #include +@@ -22,6 +17,12 @@ extern "C" { + #include + } + ++#include "maix_rtmp.hpp" ++ ++#include "maix_video.hpp" ++#include "maix_basic.hpp" ++#include "sophgo_middleware.hpp" ++ + using namespace maix; + + class RTMPClient +diff --git a/components/vision/port/maixcam/maix_rtsp_maixcam.cpp b/components/vision/port/maixcam/maix_rtsp_maixcam.cpp +index 9f82334..c1e2f4c 100644 +--- a/components/vision/port/maixcam/maix_rtsp_maixcam.cpp ++++ b/components/vision/port/maixcam/maix_rtsp_maixcam.cpp +@@ -5,12 +5,12 @@ + * @update 2023.9.8: Add framework, create this file. + */ + ++#include "maix_ffmpeg.hpp" + #include "maix_rtsp.hpp" + #include "maix_err.hpp" + #include "maix_basic.hpp" + #include "maix_audio.hpp" + #include "maix_video.hpp" +-#include "maix_ffmpeg.hpp" + #include + #include "sophgo_middleware.hpp" + #include "maix_rtsp_server.hpp" +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0106-app_camera-fix-SEEK_CUR-not-defined-for-ffmpeg.patch b/buildroot/package/maix-cdk/0106-app_camera-fix-SEEK_CUR-not-defined-for-ffmpeg.patch new file mode 100644 index 0000000000..2f576cc164 --- /dev/null +++ b/buildroot/package/maix-cdk/0106-app_camera-fix-SEEK_CUR-not-defined-for-ffmpeg.patch @@ -0,0 +1,34 @@ +From 13c8df2d23effd3ada2eacb2e5395c4c1dcf6cd6 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Thu, 26 Dec 2024 04:30:40 +0100 +Subject: [PATCH] app_camera: fix SEEK_CUR not defined for ffmpeg + +--- + projects/app_camera/main/app/app.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/projects/app_camera/main/app/app.cpp b/projects/app_camera/main/app/app.cpp +index 93c83b8..76447ec 100644 +--- a/projects/app_camera/main/app/app.cpp ++++ b/projects/app_camera/main/app/app.cpp +@@ -1,7 +1,8 @@ + #include "lvgl.h" +-#include "app.hpp" + #include "stdio.h" + #include "unistd.h" ++#include "maix_ffmpeg.hpp" ++#include "app.hpp" + #include "maix_basic.hpp" + #include "maix_util.hpp" + #include "maix_image.hpp" +@@ -10,7 +11,6 @@ + #include "maix_gpio.hpp" + #include "maix_fs.hpp" + #include "maix_vision.hpp" +-#include "maix_ffmpeg.hpp" + #include "region.hpp" + #include "sophgo_middleware.hpp" + #include +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0107-app_photos-fix-PhotoVideoInfo-ininitialization.patch b/buildroot/package/maix-cdk/0107-app_photos-fix-PhotoVideoInfo-ininitialization.patch new file mode 100644 index 0000000000..15806078df --- /dev/null +++ b/buildroot/package/maix-cdk/0107-app_photos-fix-PhotoVideoInfo-ininitialization.patch @@ -0,0 +1,50 @@ +From 21da43ab2f8d26a16cfb169b5707a20abe48111b Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Thu, 26 Dec 2024 05:28:44 +0100 +Subject: [PATCH] app_photos: fix PhotoVideoInfo ininitialization + +--- + projects/app_photos/main/app/app.cpp | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/projects/app_photos/main/app/app.cpp b/projects/app_photos/main/app/app.cpp +index 1f918ad..45a424f 100644 +--- a/projects/app_photos/main/app/app.cpp ++++ b/projects/app_photos/main/app/app.cpp +@@ -316,11 +316,11 @@ public: + std::string picture_full_path = picture_path + "/" + picture; + if (_picture_path_is_valid(picture_full_path)) { + std::string thumbnail_path = picture_path + "/.thumbnail/" + picture; +- PhotoVideoInfo new_info = { +- .type = 0, +- .date = date, +- .path = picture_full_path, +- .thumbnail_path = thumbnail_path}; ++ PhotoVideoInfo new_info( ++ 0, ++ date, ++ picture_full_path, ++ thumbnail_path); + push_video_photo_info(date, new_info); + // _print_video_photo_info(&new_info); + } +@@ -340,11 +340,11 @@ public: + size_t pos = thumbnail_path.rfind(".mp4"); + if (pos != std::string::npos) { + thumbnail_path.replace(pos, 4, ".jpg"); +- PhotoVideoInfo new_info = { +- .type = 1, +- .date = date, +- .path = video_full_path, +- .thumbnail_path = thumbnail_path}; ++ PhotoVideoInfo new_info( ++ 1, ++ date, ++ video_full_path, ++ thumbnail_path); + push_video_photo_info(date, new_info); + // _print_video_photo_info(&new_info); + } +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0108-app_uvc_camera-add-lrt-on-glibc-builds.patch b/buildroot/package/maix-cdk/0108-app_uvc_camera-add-lrt-on-glibc-builds.patch new file mode 100644 index 0000000000..b5dcf03096 --- /dev/null +++ b/buildroot/package/maix-cdk/0108-app_uvc_camera-add-lrt-on-glibc-builds.patch @@ -0,0 +1,27 @@ +From ccbe5e27f4f9d31da620d97b85fe9f33a5848d0f Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Wed, 1 Jan 2025 05:57:56 +0100 +Subject: [PATCH] app_uvc_camera: add -lrt on glibc builds + +--- + projects/app_uvc_camera/main/CMakeLists.txt | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/projects/app_uvc_camera/main/CMakeLists.txt b/projects/app_uvc_camera/main/CMakeLists.txt +index 452f67b..4f6a8c9 100644 +--- a/projects/app_uvc_camera/main/CMakeLists.txt ++++ b/projects/app_uvc_camera/main/CMakeLists.txt +@@ -52,6 +52,10 @@ list(APPEND ADD_REQUIREMENTS basic nn vision) + ############ Add static libs ################## + #### Update parent's variables like CMAKE_C_LINK_FLAGS + # set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--start-group libmaix/libtest.a -ltest2 -Wl,--end-group" PARENT_SCOPE) ++if(NOT CONFIG_TOOLCHAIN_PATH MATCHES "musl") ++set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--start-group -lrt -Wl,--end-group" PARENT_SCOPE) ++set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,--start-group -lrt -Wl,--end-group" PARENT_SCOPE) ++endif() + ############################################### + + ######### Add files need to download ######### +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0109-uvc_demo-add-lrt-on-glibc-builds.patch b/buildroot/package/maix-cdk/0109-uvc_demo-add-lrt-on-glibc-builds.patch new file mode 100644 index 0000000000..8e57a2cbe0 --- /dev/null +++ b/buildroot/package/maix-cdk/0109-uvc_demo-add-lrt-on-glibc-builds.patch @@ -0,0 +1,27 @@ +From 5f5f1ba6063cc54745913c65e1c4e083c0e6a54f Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Wed, 1 Jan 2025 08:00:20 +0100 +Subject: [PATCH] uvc_demo: add -lrt on glibc builds + +--- + examples/uvc_demo/main/CMakeLists.txt | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/examples/uvc_demo/main/CMakeLists.txt b/examples/uvc_demo/main/CMakeLists.txt +index f79dc77..5bdc074 100644 +--- a/examples/uvc_demo/main/CMakeLists.txt ++++ b/examples/uvc_demo/main/CMakeLists.txt +@@ -52,6 +52,10 @@ list(APPEND ADD_REQUIREMENTS vision) + ############ Add static libs ################## + #### Update parent's variables like CMAKE_C_LINK_FLAGS + # set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--start-group libmaix/libtest.a -ltest2 -Wl,--end-group" PARENT_SCOPE) ++if(NOT CONFIG_TOOLCHAIN_PATH MATCHES "musl") ++set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--start-group -lrt -Wl,--end-group" PARENT_SCOPE) ++set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,--start-group -lrt -Wl,--end-group" PARENT_SCOPE) ++endif() + ############################################### + + ######### Add files need to download ######### +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0111-basic-sys-ignore-dts-model-on-maixcam-platform.patch b/buildroot/package/maix-cdk/0111-basic-sys-ignore-dts-model-on-maixcam-platform.patch new file mode 100644 index 0000000000..75b91131a7 --- /dev/null +++ b/buildroot/package/maix-cdk/0111-basic-sys-ignore-dts-model-on-maixcam-platform.patch @@ -0,0 +1,25 @@ +From af308d33c3924bdb19c93afba0784f4dead5d36f Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Mon, 6 Jan 2025 00:51:25 +0100 +Subject: [PATCH] basic: sys: ignore dts model on maixcam platform + +--- + components/basic/src/maix_sys.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/components/basic/src/maix_sys.cpp b/components/basic/src/maix_sys.cpp +index 8ffc4e5..32720cb 100644 +--- a/components/basic/src/maix_sys.cpp ++++ b/components/basic/src/maix_sys.cpp +@@ -260,7 +260,7 @@ namespace maix::sys + // 包含 maixcam 或者 licheerv nano (不区分大小写,先把 model 转换为小写) + std::string model_lower = model; + std::transform(model.begin(), model.end(), model_lower.begin(), ::tolower); +- if (model_lower.find("maixcam") != std::string::npos || model_lower.find("licheerv nano") != std::string::npos) ++ //if (model_lower.find("maixcam") != std::string::npos || model_lower.find("licheerv nano") != std::string::npos) + { + fclose(file); + auto it = _device_configs.find("id"); +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0112-vision-camera-make-i2c-id-dynamic.patch b/buildroot/package/maix-cdk/0112-vision-camera-make-i2c-id-dynamic.patch new file mode 100644 index 0000000000..f3167d3dc5 --- /dev/null +++ b/buildroot/package/maix-cdk/0112-vision-camera-make-i2c-id-dynamic.patch @@ -0,0 +1,73 @@ +From 35fab08e8c2ceed8f2dbcd111767b51e9c01be9e Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Sat, 11 Jan 2025 16:29:12 +0100 +Subject: [PATCH] vision: camera: make i2c id dynamic + +--- + .../vision/port/maixcam/maix_camera_mmf.cpp | 20 ++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +diff --git a/components/vision/port/maixcam/maix_camera_mmf.cpp b/components/vision/port/maixcam/maix_camera_mmf.cpp +index c60d098..e8b348f 100644 +--- a/components/vision/port/maixcam/maix_camera_mmf.cpp ++++ b/components/vision/port/maixcam/maix_camera_mmf.cpp +@@ -19,6 +19,7 @@ + namespace maix::camera + { + static bool set_regs_flag = false; ++ static int i2c_id = 4; + + std::vector list_devices() + { +@@ -285,10 +286,19 @@ namespace maix::camera + } + int retry_count = 0; + char name[30]; +- peripheral::i2c::I2C i2c_obj(4, peripheral::i2c::Mode::MASTER); ++ peripheral::i2c::I2C *i2c_obj = nullptr; ++ try { ++ i2c_obj = new peripheral::i2c::I2C(i2c_id, peripheral::i2c::Mode::MASTER); ++ } catch (const std::exception &e) { ++ i2c_obj = nullptr; ++ } ++ if (!i2c_obj) { ++ i2c_id = 2; ++ i2c_obj = new peripheral::i2c::I2C(i2c_id, peripheral::i2c::Mode::MASTER); ++ } + + _retry: +- if (retry_count < 1) { ++ if (i2c_id == 4 && retry_count < 1) { + int mclk_id = _get_mclk_id(); + if (mclk_id == 0) { + system("devmem 0x0300116C 32 0x5"); // MIPI RX 4N PINMUX MCLK0 +@@ -304,7 +314,7 @@ _retry: + goto _retry; + } + +- std::vector addr_list = i2c_obj.scan(); ++ std::vector addr_list = i2c_obj->scan(); + for (size_t i = 0; i < addr_list.size(); i++) { + // log::info("i2c4 addr: 0x%02x", addr_list[i]); + switch (addr_list[i]) { +@@ -1589,7 +1599,7 @@ _error: + { + camera_priv_t *priv = (camera_priv_t *)_param; + (void)bit_width; +- peripheral::i2c::I2C i2c_obj(4, peripheral::i2c::Mode::MASTER); ++ peripheral::i2c::I2C i2c_obj(i2c_id, peripheral::i2c::Mode::MASTER); + uint8_t temp[1]; + temp[0] = (uint8_t)data; + i2c_obj.writeto_mem(priv->i2c_addr, addr, temp, sizeof(temp), 16); +@@ -1600,7 +1610,7 @@ _error: + { + camera_priv_t *priv = (camera_priv_t *)_param; + (void)bit_width; +- peripheral::i2c::I2C i2c_obj(4, peripheral::i2c::Mode::MASTER); ++ peripheral::i2c::I2C i2c_obj(i2c_id, peripheral::i2c::Mode::MASTER); + Bytes *data = i2c_obj.readfrom_mem(priv->i2c_addr, addr, 1, 16); + int out = -1;log::info("addr:%#x", priv->i2c_addr); + if (data) { +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0113-vision-camera-add-support-for-gc2083.patch b/buildroot/package/maix-cdk/0113-vision-camera-add-support-for-gc2083.patch new file mode 100644 index 0000000000..814fa074e2 --- /dev/null +++ b/buildroot/package/maix-cdk/0113-vision-camera-add-support-for-gc2083.patch @@ -0,0 +1,82 @@ +From 86c80c3308fca7f6fcb8a502b6861bb0c3efe2c0 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Sat, 11 Jan 2025 16:30:55 +0100 +Subject: [PATCH] vision: camera: add support for gc2083 + +--- + .../vision/port/maixcam/maix_camera_mmf.cpp | 26 +++++++++++++++++-- + 1 file changed, 24 insertions(+), 2 deletions(-) + +diff --git a/components/3rd_party/sophgo-middleware/CMakeLists.txt b/components/3rd_party/sophgo-middleware/CMakeLists.txt +index 44eabee..85b70b8 100644 +--- a/components/3rd_party/sophgo-middleware/CMakeLists.txt ++++ b/components/3rd_party/sophgo-middleware/CMakeLists.txt +@@ -20,6 +20,7 @@ append_srcs_dir(middleware_src_dir ${middleware_src_path}/v2/sample/common + ${middleware_src_path}/v2/component/isp/sensor/sg200x/lontium_lt6911 + ${middleware_src_path}/v2/component/isp/sensor/sg200x/ov_os04a10 + ${middleware_src_path}/v2/component/isp/sensor/sg200x/gcore_gc02m1 ++ ${middleware_src_path}/v2/component/isp/sensor/sg200x/gcore_gc2083 + ) + list(APPEND ADD_SRCS ${middleware_src_dir}) + set_property(SOURCE ${middleware_src_dir} PROPERTY GENERATED 1) +@@ -72,4 +72,5 @@ list(APPEND ADD_DEFINITIONS_PRIVATE -DSENSOR_OV_OV2685) + list(APPEND ADD_DEFINITIONS_PRIVATE -DSENSOR_LONTIUM_LT6911) + list(APPEND ADD_DEFINITIONS_PRIVATE -DSENSOR_OV_OS04A10) + list(APPEND ADD_DEFINITIONS_PRIVATE -DSENSOR_GCORE_GC02M1) ++list(APPEND ADD_DEFINITIONS_PRIVATE -DSENSOR_GCORE_GC2083) + register_component(DYNAMIC) +\ No newline at end of file +diff --git a/components/vision/port/maixcam/maix_camera_mmf.cpp b/components/vision/port/maixcam/maix_camera_mmf.cpp +index e8b348f..7db069c 100644 +--- a/components/vision/port/maixcam/maix_camera_mmf.cpp ++++ b/components/vision/port/maixcam/maix_camera_mmf.cpp +@@ -335,8 +335,8 @@ _retry: + snprintf(name, sizeof(name), "ov_os04a10"); + return {true, name}; + case 0x37: +- // log::info("find ov_os04a10, addr %#x", addr_list[i]); +- snprintf(name, sizeof(name), "gcore_gc02m1"); ++ // log::info("find gcore_gc2083, addr %#x", addr_list[i]); ++ snprintf(name, sizeof(name), "gcore_gc2083"); + return {true, name}; + case 0x48:// fall through + case 0x3c: +@@ -540,6 +540,17 @@ _retry: + sensor_cfg.exptime_min = 33333; + vi_format = PIXEL_FORMAT_NV21; + vi_vpss_format = PIXEL_FORMAT_NV21; ++ } else if (!strcmp(sensor_name, "gcore_gc2083")) { ++ sensor_cfg.sns_type = GCORE_GC2083_MIPI_2M_30FPS_10BIT; ++ sensor_cfg.lane_id = {1, 0, 2, -1, -1}; ++ sensor_cfg.pn_swap = {0, 0, 0, 0, 0}; ++ sensor_cfg.mclk_en = 1; ++ sensor_cfg.i2c_addr = 0x37; ++ sensor_cfg.exptime_max = 363636; ++ sensor_cfg.exptime_min = 33333; ++ vi_format = PIXEL_FORMAT_NV21; ++ vi_vpss_format = PIXEL_FORMAT_NV21; ++ err::check_bool_raise(!CVI_BIN_SetBinName(WDR_MODE_NONE, "/mnt/cfg/param/cvi_sdr_bin_GC2083"), "set config path failed!"); + } else { // default is gcore_gc4653 + if (width <= 1280 && height <= 720 && fps > 30) { + sensor_cfg.sns_type = GCORE_GC4653_MIPI_720P_60FPS_10BIT; +@@ -609,6 +620,17 @@ _retry: + sensor_cfg.exptime_min = 33333; + vi_format = PIXEL_FORMAT_NV21; + vi_vpss_format = PIXEL_FORMAT_NV21; ++ } else if (!strcmp(sensor_name, "gcore_gc2083")) { ++ sensor_cfg.sns_type = GCORE_GC2083_MIPI_2M_30FPS_10BIT; ++ sensor_cfg.lane_id = {1, 0, 2, -1, -1}; ++ sensor_cfg.pn_swap = {0, 0, 0, 0, 0}; ++ sensor_cfg.mclk_en = 1; ++ sensor_cfg.i2c_addr = 0x37; ++ sensor_cfg.exptime_max = 363636; ++ sensor_cfg.exptime_min = 33333; ++ vi_format = PIXEL_FORMAT_NV21; ++ vi_vpss_format = PIXEL_FORMAT_NV21; ++ err::check_bool_raise(!CVI_BIN_SetBinName(WDR_MODE_NONE, "/mnt/cfg/param/cvi_sdr_bin_GC2083"), "set config path failed!"); + } else { // default is gcore_gc4653 + if (width <= 1280 && height <= 720 && fps > 30) { + sensor_cfg.sns_type = GCORE_GC4653_MIPI_720P_60FPS_10BIT; +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/0201-omv-imlib-fmath-disable-asm-on-aarch64.patch b/buildroot/package/maix-cdk/0201-omv-imlib-fmath-disable-asm-on-aarch64.patch new file mode 100644 index 0000000000..bac18a1dd8 --- /dev/null +++ b/buildroot/package/maix-cdk/0201-omv-imlib-fmath-disable-asm-on-aarch64.patch @@ -0,0 +1,25 @@ +From b711dacb71fd6d7c1b40927d7d2a1097e02d6b71 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Fri, 27 Dec 2024 17:14:46 +0100 +Subject: [PATCH] omv: imlib: fmath: disable asm on aarch64 + +--- + components/3rd_party/omv/omv/imlib/fmath.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/components/3rd_party/omv/omv/imlib/fmath.c b/components/3rd_party/omv/omv/imlib/fmath.c +index c08c34f..1b3e71b 100644 +--- a/components/3rd_party/omv/omv/imlib/fmath.c ++++ b/components/3rd_party/omv/omv/imlib/fmath.c +@@ -19,7 +19,7 @@ const float __atanf_lut[4] = { + +0.9997878412794807f //p1 + }; + +-#if (__ARM_ARCH < 7) ++#if (__ARM_ARCH < 7) || defined(__aarch64__) + #include + float OMV_ATTR_ALWAYS_INLINE fast_sqrtf(float x) { + return sqrtf(x); +-- +2.34.1 + diff --git a/buildroot/package/maix-cdk/Config.in b/buildroot/package/maix-cdk/Config.in new file mode 100644 index 0000000000..7b0e1be7cc --- /dev/null +++ b/buildroot/package/maix-cdk/Config.in @@ -0,0 +1,27 @@ +config BR2_PACKAGE_MAIX_CDK + bool "maix-cdk" + select BR2_PACKAGE_HOST_CMAKE + select BR2_PACKAGE_HOST_PYTHON3 + select BR2_PACKAGE_HOST_PYTHON3_SSL + select BR2_PACKAGE_ALSA_LIB + select BR2_PACKAGE_FFMPEG + select BR2_PACKAGE_HARFBUZZ + select BR2_PACKAGE_OPENCV4 + help + MaixCDK. + +if BR2_PACKAGE_MAIX_CDK + +config BR2_PACKAGE_MAIX_CDK_ALL_PROJECTS + bool "All MaixCDK projects" + default y + help + Build all MaixCDK projects. + +config BR2_PACKAGE_MAIX_CDK_ALL_EXAMPLES + bool "All MaixCDK examples" + default n + help + Build all MaixCDK examples. + +endif diff --git a/buildroot/package/maix-cdk/maix-cdk.mk b/buildroot/package/maix-cdk/maix-cdk.mk new file mode 100644 index 0000000000..002ec82e20 --- /dev/null +++ b/buildroot/package/maix-cdk/maix-cdk.mk @@ -0,0 +1,201 @@ +################################################################################ +# +# maix-cdk +# +################################################################################ + +MAIX_CDK_VERSION = c703fbd65661a3ce866d9eb524a4e90ed15c6a74 +MAIX_CDK_SITE = $(call github,sipeed,MaixCDK,$(MAIX_CDK_VERSION)) + +MAIX_CDK_SAMPLE = rtsp_demo + +MAIX_CDK_DEPENDENCIES =\ + host-cmake \ + host-pkgconf \ + host-python3 \ + host-python-pip \ + host-python-setuptools \ + alsa-lib \ + ffmpeg \ + harfbuzz \ + opencv4 + +# maixcam pre-built binaries are only for riscv64 +# MaixCDK searches for "musl" or "glibc" in toolchain path +MAIX_CDK_TOOLCHAIN_ARCH := $(BR2_ARCH) +MAIX_CDK_TOOLCHAIN_LIBC := $(findstring musl,$(realpath $(TOOLCHAIN_EXTERNAL_BIN))) + +MAIX_CDK_HARFBUZZ_VER = 8.2.1 +MAIX_CDK_OPENCV_VER = 4.9.0 + +MAIX_CDK_EXT_MIDDLEWARE = $(realpath $(TOPDIR)/../middleware) +MAIX_CDK_EXT_MAIXCAM_LIB = sample/test_mmf/maixcam_lib/release.linux/libmaixcam_lib.so +MAIX_CDK_EXT_OSDRV = $(realpath $(TOPDIR)/../osdrv) + +MAIX_CDK_MIDDLEWARE = components/3rd_party/sophgo-middleware/sophgo-middleware + +MAIX_CDK_MAIXCAM_DIST = examples/$(MAIX_CDK_SAMPLE)/dist/$(MAIX_CDK_SAMPLE)_release + +define MAIX_CDK_POST_EXTRACT_FIXUP + mv $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2 $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2-cdk + mkdir $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2 + if [ -e $(MAIX_CDK_EXT_MIDDLEWARE)/Makefile -a ! -e $(MAIX_CDK_EXT_MIDDLEWARE)/v2/Makefile ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(MAIX_CDK_EXT_MIDDLEWARE)/ $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/ ; \ + else \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(MAIX_CDK_EXT_MIDDLEWARE)/v2/ $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/ ; \ + fi + mkdir $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/uapi + if [ -e $(MAIX_CDK_EXT_OSDRV)/interdrv/include -a ! -e $(MAIX_CDK_EXT_OSDRV)/interdrv/v2/include ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(MAIX_CDK_EXT_OSDRV)/interdrv/include/common/uapi/ $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/uapi/ ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(MAIX_CDK_EXT_OSDRV)/interdrv/include/chip/mars/uapi/ $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/uapi/ ; \ + else \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(MAIX_CDK_EXT_OSDRV)/interdrv/v2/include/common/uapi/ $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/uapi/ ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(MAIX_CDK_EXT_OSDRV)/interdrv/v2/include/chip/mars/uapi/ $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/uapi/ ; \ + fi + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2-cdk/sample/vio/ $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/sample/vio/ + sed -i s/' dummy isp_light '/' '/g $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/modules/Makefile + rm -rf $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/modules/dummy/ + rm -rf $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/modules/isp_light/ + if grep -q stSnsGc02m1_Obj $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/sample/common/sample_common_sensor.c ; then \ + if ! grep -q stSnsGc02m1_Obj $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/include/cvi_sns_ctrl.h ; then \ + sed -i s/stSnsGc02m1b_Obj/stSnsGc02m1_Obj/g $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/include/cvi_sns_ctrl.h ; \ + fi ; \ + fi + if [ ! -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/3rd/libcli.so ]; then \ + sed -i /'$${mmf_lib_dir}.3rd.libcli.so'/d $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i /'$${mmf_lib_dir}.3rd.libcli.so'/d $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi + if [ -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libcvi_dnvqe.so -a ! -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libdnvqe.so ]; then \ + sed -i s/'libdnvqe.so'/'libcvi_dnvqe.so'/g $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i s/'libdnvqe.so'/'libcvi_dnvqe.so'/g $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi + if [ -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libcvi_ssp2.so ]; then \ + sed -i 's|$${mmf_lib_dir}/libcvi_dnvqe.so|\$${mmf_lib_dir}/libcvi_dnvqe.so $${mmf_lib_dir}/libcvi_ssp2.so|g' $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i 's|$${mmf_lib_dir}/libcvi_dnvqe.so|\$${mmf_lib_dir}/libcvi_dnvqe.so $${mmf_lib_dir}/libcvi_ssp2.so|g' $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi + if [ -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libgdc.so -a ! -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libosdc.so ]; then \ + sed -i s/'libosdc.so'/'libgdc.so'/g $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i s/'libosdc.so'/'libgdc.so'/g $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi + if [ -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libvi.so -a ! -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libvpu.so ]; then \ + sed -i s/'libvpu.so'/'libvi.so'/g $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i s/'libvpu.so'/'libvi.so'/g $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi + if [ -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libvo.so -a \ + -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/libvpss.so -a \ + -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/lib/librgn.so ]; then \ + sed -i 's|$${mmf_lib_dir}/libvi.so|\$${mmf_lib_dir}/libvi.so $${mmf_lib_dir}/libvo.so $${mmf_lib_dir}/libvpss.so $${mmf_lib_dir}/librgn.so|g' $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i 's|$${mmf_lib_dir}/libvi.so|\$${mmf_lib_dir}/libvi.so $${mmf_lib_dir}/libvo.so $${mmf_lib_dir}/libvpss.so $${mmf_lib_dir}/librgn.so|g' $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi + if [ -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/uapi/linux/cvi_cv181x_defines.h ]; then \ + sed -i 's|^list.APPEND ADD_INCLUDE $${middleware_include_dir}.|list(APPEND ADD_INCLUDE $${middleware_include_dir})\n\nlist(APPEND ADD_DEFINITIONS -D__CV181X__)|g' $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i 's|^list.APPEND ADD_INCLUDE "include".|list(APPEND ADD_INCLUDE "include")\n\nlist(APPEND ADD_DEFINITIONS -D__CV181X__)|g' $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi + if [ -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/component/isp/common/sensor_list.h ]; then \ + sed -i 's|^ $${middleware_src_path}/v2/component/panel/sg200x| $${middleware_src_path}/v2/component/isp/common\n $${middleware_src_path}/v2/component/panel/sg200x|g' $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i 's|^append_srcs_dir(middleware_src_dir $${middleware_src_path}/v2/sample/common|append_srcs_dir(middleware_src_dir $${middleware_src_path}/v2/sample/common\n $${middleware_src_path}/v2/component/isp/common|g' $(@D)/components/3rd_party/sophgo-middleware/CMakeLists.txt ; \ + sed -i 's|^ $${middleware_src_path}/v2/component/panel/sg200x| $${middleware_src_path}/v2/component/isp/common\n $${middleware_src_path}/v2/component/panel/sg200x|g' $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + sed -i 's|^ append_srcs_dir(middleware_src_dir $${middleware_src_path}/v2/sample/common| append_srcs_dir(middleware_src_dir $${middleware_src_path}/v2/component/isp/common\n $${middleware_src_path}/v2/sample/common|g' $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi + if [ -e $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/$(MAIX_CDK_EXT_MAIXCAM_LIB) ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(@D)/$(MAIX_CDK_MIDDLEWARE)/v2/$(MAIX_CDK_EXT_MAIXCAM_LIB) ${@D}/components/maixcam_lib/lib/ ; \ + fi + if [ "$(MAIX_CDK_TOOLCHAIN_ARCH)-$(MAIX_CDK_TOOLCHAIN_LIBC)" != "riscv64-musl" ]; then \ + sed -i 's|set(alsa_lib_dir "lib")|set(alsa_lib_dir "$(TARGET_DIR)/usr/lib")|g' $(@D)/components/3rd_party/alsa_lib/CMakeLists.txt ; \ + sed -i 's|set(alsa_lib_include_dir "include")|set(alsa_lib_include_dir "$(TARGET_DIR)/usr/include")|g' $(@D)/components/3rd_party/alsa_lib/CMakeLists.txt ; \ + sed -i 's|set(src_path "$${ffmpeg_unzip_path}/ffmpeg")|set(src_path "$(TARGET_DIR)/usr")|g' $(@D)/components/3rd_party/FFmpeg/CMakeLists.txt ; \ + sed -i 's| $${src_path}/lib/libswscale.so| $${src_path}/lib/libswscale.so\n $${src_path}/lib/libz.so.1\n $${src_path}/lib/libbz2.so.1.0\n $${src_path}/lib/libssl.so.3\n $${src_path}/lib/libcrypto.so.3|g' $(@D)/components/3rd_party/FFmpeg/CMakeLists.txt ; \ + sed -i s/'default n'/'default y'/g $(@D)/components/3rd_party/opencv/Kconfig ; \ + mkdir -pv $(@D)/dl/extracted/harfbuzz_srcs/harfbuzz-$(MAIX_CDK_HARFBUZZ_VER)/ ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(@D)/../harfbuzz-$(HARFBUZZ_VERSION)/ $(@D)/dl/extracted/harfbuzz_srcs/harfbuzz-$(MAIX_CDK_HARFBUZZ_VER)/ ; \ + mkdir -pv $(@D)/dl/extracted/opencv/opencv4/opencv-$(MAIX_CDK_OPENCV_VER)/ ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(@D)/../opencv4-$(OPENCV4_VERSION)/ $(@D)/dl/extracted/opencv/opencv4/opencv-$(MAIX_CDK_OPENCV_VER)/ ; \ + sed -i /'list.APPEND ADD_REQUIREMENTS cvi_tpu.'/d $(@D)/components/maixcam_lib/CMakeLists.txt ; \ + fi +endef +MAIX_CDK_POST_EXTRACT_HOOKS += MAIX_CDK_POST_EXTRACT_FIXUP + +define MAIX_CDK_BUILD_CMDS + sed -i s/'^ url: .*'/' url:'/g $(@D)/platforms/maixcam.yaml + sed -i s/'^ sha256sum: .*'/' sha256sum:'/g $(@D)/platforms/maixcam.yaml + sed -i s/'^ filename: .*'/' filename:'/g $(@D)/platforms/maixcam.yaml + sed -i s/'^ path: .*'/' path:'/g $(@D)/platforms/maixcam.yaml + sed -i 's|^ bin_path: .*| bin_path: '$(realpath $(TOOLCHAIN_EXTERNAL_BIN))'|g' $(@D)/platforms/maixcam.yaml ; \ + sed -i "s|^ prefix: .*| prefix: $(TOOLCHAIN_EXTERNAL_PREFIX)-|g" $(@D)/platforms/maixcam.yaml + sed -i "s|^ c_flags: .*| c_flags: $(TARGET_LDFLAGS)|g" $(@D)/platforms/maixcam.yaml + sed -i "s|^ cxx_flags: .*| cxx_flags: $(TARGET_LDFLAGS)|g" $(@D)/platforms/maixcam.yaml + sed -i 's|COMMAND python |COMMAND '$(HOST_DIR)/bin/python3' |g' $(@D)/tools/cmake/*.cmake + sed -i 's|COMMAND python3 |COMMAND '$(HOST_DIR)/bin/python3' |g' $(@D)/tools/cmake/*.cmake + sed -i 's|set.$${python} python3 |set($${python} '$(HOST_DIR)/bin/python3' |g' $(@D)/tools/cmake/*.cmake + cd $(@D)/ ; \ + $(HOST_DIR)/bin/python3 -m pip install -r requirements.txt + cd $(@D)/examples/$(MAIX_CDK_SAMPLE)/ ; \ + PATH=$(BR_PATH) $(HOST_DIR)/bin/maixcdk build -p maixcam + rm -rf $(@D)/projects/app_classifier/ + rm -rf $(@D)/projects/app_detector/ + rm -rf $(@D)/projects/app_self_learn_tracker/ + rm -rf $(@D)/projects/app_speech/ + if [ -e $(@D)/projects/app_uvc_camera/main/CMakeLists.txt ]; then \ + sed -i s/'basic nn vision'/'basic vision'/g $(@D)/projects/app_uvc_camera/main/CMakeLists.txt ; \ + fi + if [ "X$(BR2_PACKAGE_MAIX_CDK_ALL_PROJECTS)" = "Xy" -a -e $(@D)/distapps.sh -a -e $(@D)/projects/build_all.sh ]; then \ + chmod +x $(@D)/projects/build_all.sh ; \ + cd $(@D)/projects/ ; \ + PATH=$(BR_PATH) ./build_all.sh ; \ + fi + rm -rf $(@D)/examples/bytetrack_demo/ + rm -rf $(@D)/examples/nn_*/ + rm -rf $(@D)/examples/rtsp_yolo_demo/ + if [ -e $(@D)/examples/maix_bm8563/app.yaml ]; then \ + sed -i s/bm8653/bm8563/g $(@D)/examples/maix_bm8563/app.yaml ; \ + fi + if [ -e $(@D)/examples/mlx90640/app.yaml ]; then \ + sed -i s/mlx90640_$$/mlx90640/g $(@D)/examples/mlx90640/app.yaml ; \ + fi + if [ -e $(@D)/examples/i18n/app.yaml ]; then \ + if grep -q 'id: i18n_demo' $(@D)/examples/i18n/app.yaml ; then \ + mv $(@D)/examples/i18n $(@D)/examples/i18n_demo ; \ + fi ; \ + fi + if [ -e $(@D)/examples/peripheral_gpio/app.yaml ]; then \ + if grep -q 'id: switch_led' $(@D)/examples/peripheral_gpio/app.yaml ; then \ + mv $(@D)/examples/peripheral_gpio $(@D)/examples/switch_led ; \ + fi ; \ + fi + if [ "X$(BR2_PACKAGE_MAIX_CDK_ALL_EXAMPLES)" = "Xy" -a -e $(@D)/distapps.sh -a -e $(@D)/test/test_examples/test_cases.sh ]; then \ + chmod +x $(@D)/test/test_examples/test_cases.sh ; \ + cd $(@D)/test/test_examples/ ; \ + PATH=$(BR_PATH) ./test_cases.sh maixcam 0 ; \ + fi + if [ -e $(@D)/distapps.sh ]; then \ + chmod +x $(@D)/distapps.sh ; \ + cd $(@D)/ ; \ + PATH=$(BR_PATH) ./distapps.sh ; \ + fi +endef + +define MAIX_CDK_INSTALL_TARGET_CMDS + if [ ! -e ${@D}/$(MAIX_CDK_MAIXCAM_DIST)/dl_lib/libmaixcam_lib.so ] ; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/components/maixcam_lib/lib/libmaixcam_lib.so ${@D}/$(MAIX_CDK_MAIXCAM_DIST)/dl_lib/ ; \ + fi + if [ -e ${@D}/dist/maixapp/lib -a ! -e ${@D}/dist/maixapp/lib/libmaixcam_lib.so ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/components/maixcam_lib/lib/libmaixcam_lib.so ${@D}/dist/maixapp/lib/ ; \ + fi + #mkdir -pv $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ + #rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/$(MAIX_CDK_MAIXCAM_DIST)/dl_lib/libmaixcam_lib.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ + mkdir -pv $(TARGET_DIR)/maixapp/lib + mkdir -pv $(TARGET_DIR)/maixapp/tmp + if [ -e ${@D}/dist/maixapp ]; then \ + mkdir -pv $(TARGET_DIR)/maixapp/ ; \ + rsync -r --verbose --links --safe-links --hard-links ${@D}/dist/maixapp/ $(TARGET_DIR)/maixapp/ ; \ + else \ + mkdir -pv $(TARGET_DIR)/maixapp/$(MAIX_CDK_SAMPLE)/ ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/$(MAIX_CDK_MAIXCAM_DIST)/ $(TARGET_DIR)/maixapp/$(MAIX_CDK_SAMPLE)/ ; \ + rm -rf $(TARGET_DIR)/maixapp/$(MAIX_CDK_SAMPLE)/dl_lib ; \ + ln -s ../lib $(TARGET_DIR)/maixapp/$(MAIX_CDK_SAMPLE)/dl_lib ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/$(MAIX_CDK_MAIXCAM_DIST)/dl_lib/ $(TARGET_DIR)/maixapp/lib/ ; \ + fi + #rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(MAIX_CDK_PKGDIR)/overlay/ $(TARGET_DIR)/ +endef + +$(eval $(generic-package)) diff --git a/buildroot/package/nanokvm-server/0011-Revert-Add-mocks-to-remove-the-need-for-a-physical-d.patch b/buildroot/package/nanokvm-server/0011-Revert-Add-mocks-to-remove-the-need-for-a-physical-d.patch new file mode 100644 index 0000000000..afec30461b --- /dev/null +++ b/buildroot/package/nanokvm-server/0011-Revert-Add-mocks-to-remove-the-need-for-a-physical-d.patch @@ -0,0 +1,427 @@ +From b92aa0065152b2bdd11dd2d58d022df31451cf00 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Tue, 10 Dec 2024 00:53:42 +0100 +Subject: [PATCH] Revert "Add mocks to remove the need for a physical device" + +This reverts commit 7e976e069ff18b9231760daf811c797a6e987907. +--- + web/package.json | 9 +- + web/public/mockServiceWorker.js | 293 -------------------------------- + web/src/main.tsx | 49 +++--- + web/src/mocks/browser.ts | 14 -- + 4 files changed, 20 insertions(+), 345 deletions(-) + delete mode 100644 web/public/mockServiceWorker.js + delete mode 100644 web/src/mocks/browser.ts + +diff --git a/web/package.json b/web/package.json +index 130e803..328342d 100644 +--- a/web/package.json ++++ b/web/package.json +@@ -5,7 +5,6 @@ + "type": "module", + "scripts": { + "dev": "vite", +- "mocked": "vite --mode mocked", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" +@@ -52,7 +51,6 @@ + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.16", +- "msw": "^2.6.0", + "postcss": "^8.4.47", + "prettier": "^3.4.2", + "prettier-plugin-tailwindcss": "^0.6.9", +@@ -60,10 +58,5 @@ + "typescript": "^5.6.3", + "vite": "^5.4.14", + "vite-tsconfig-paths": "^4.3.2" +- }, +- "msw": { +- "workerDirectory": [ +- "public" +- ] + } +-} +\ No newline at end of file ++} +diff --git a/web/public/mockServiceWorker.js b/web/public/mockServiceWorker.js +deleted file mode 100644 +index 6eb8052..0000000 +--- a/web/public/mockServiceWorker.js ++++ /dev/null +@@ -1,293 +0,0 @@ +-/* eslint-disable */ +-/* tslint:disable */ +- +-/** +- * Mock Service Worker. +- * @see https://github.com/mswjs/msw +- * - Please do NOT modify this file. +- * - Please do NOT serve this file on production. +- */ +- +-const PACKAGE_VERSION = '2.6.0' +-const INTEGRITY_CHECKSUM = '07a8241b182f8a246a7cd39894799a9e' +-const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') +-const activeClientIds = new Set() +- +-self.addEventListener('install', function () { +- self.skipWaiting() +-}) +- +-self.addEventListener('activate', function (event) { +- event.waitUntil(self.clients.claim()) +-}) +- +-self.addEventListener('message', async function (event) { +- const clientId = event.source.id +- +- if (!clientId || !self.clients) { +- return +- } +- +- const client = await self.clients.get(clientId) +- +- if (!client) { +- return +- } +- +- const allClients = await self.clients.matchAll({ +- type: 'window', +- }) +- +- switch (event.data) { +- case 'KEEPALIVE_REQUEST': { +- sendToClient(client, { +- type: 'KEEPALIVE_RESPONSE', +- }) +- break +- } +- +- case 'INTEGRITY_CHECK_REQUEST': { +- sendToClient(client, { +- type: 'INTEGRITY_CHECK_RESPONSE', +- payload: { +- packageVersion: PACKAGE_VERSION, +- checksum: INTEGRITY_CHECKSUM, +- }, +- }) +- break +- } +- +- case 'MOCK_ACTIVATE': { +- activeClientIds.add(clientId) +- +- sendToClient(client, { +- type: 'MOCKING_ENABLED', +- payload: { +- client: { +- id: client.id, +- frameType: client.frameType, +- }, +- }, +- }) +- break +- } +- +- case 'MOCK_DEACTIVATE': { +- activeClientIds.delete(clientId) +- break +- } +- +- case 'CLIENT_CLOSED': { +- activeClientIds.delete(clientId) +- +- const remainingClients = allClients.filter((client) => { +- return client.id !== clientId +- }) +- +- // Unregister itself when there are no more clients +- if (remainingClients.length === 0) { +- self.registration.unregister() +- } +- +- break +- } +- } +-}) +- +-self.addEventListener('fetch', function (event) { +- const { request } = event +- +- // Bypass navigation requests. +- if (request.mode === 'navigate') { +- return +- } +- +- // Opening the DevTools triggers the "only-if-cached" request +- // that cannot be handled by the worker. Bypass such requests. +- if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { +- return +- } +- +- // Bypass all requests when there are no active clients. +- // Prevents the self-unregistered worked from handling requests +- // after it's been deleted (still remains active until the next reload). +- if (activeClientIds.size === 0) { +- return +- } +- +- // Generate unique request ID. +- const requestId = crypto.randomUUID() +- event.respondWith(handleRequest(event, requestId)) +-}) +- +-async function handleRequest(event, requestId) { +- const client = await resolveMainClient(event) +- const response = await getResponse(event, client, requestId) +- +- // Send back the response clone for the "response:*" life-cycle events. +- // Ensure MSW is active and ready to handle the message, otherwise +- // this message will pend indefinitely. +- if (client && activeClientIds.has(client.id)) { +- ;(async function () { +- const responseClone = response.clone() +- +- sendToClient( +- client, +- { +- type: 'RESPONSE', +- payload: { +- requestId, +- isMockedResponse: IS_MOCKED_RESPONSE in response, +- type: responseClone.type, +- status: responseClone.status, +- statusText: responseClone.statusText, +- body: responseClone.body, +- headers: Object.fromEntries(responseClone.headers.entries()), +- }, +- }, +- [responseClone.body], +- ) +- })() +- } +- +- return response +-} +- +-// Resolve the main client for the given event. +-// Client that issues a request doesn't necessarily equal the client +-// that registered the worker. It's with the latter the worker should +-// communicate with during the response resolving phase. +-async function resolveMainClient(event) { +- const client = await self.clients.get(event.clientId) +- +- if (activeClientIds.has(event.clientId)) { +- return client +- } +- +- if (client?.frameType === 'top-level') { +- return client +- } +- +- const allClients = await self.clients.matchAll({ +- type: 'window', +- }) +- +- return allClients +- .filter((client) => { +- // Get only those clients that are currently visible. +- return client.visibilityState === 'visible' +- }) +- .find((client) => { +- // Find the client ID that's recorded in the +- // set of clients that have registered the worker. +- return activeClientIds.has(client.id) +- }) +-} +- +-async function getResponse(event, client, requestId) { +- const { request } = event +- +- // Clone the request because it might've been already used +- // (i.e. its body has been read and sent to the client). +- const requestClone = request.clone() +- +- function passthrough() { +- const headers = Object.fromEntries(requestClone.headers.entries()) +- +- // Remove internal MSW request header so the passthrough request +- // complies with any potential CORS preflight checks on the server. +- // Some servers forbid unknown request headers. +- delete headers['x-msw-intention'] +- +- return fetch(requestClone, { headers }) +- } +- +- // Bypass mocking when the client is not active. +- if (!client) { +- return passthrough() +- } +- +- // Bypass initial page load requests (i.e. static assets). +- // The absence of the immediate/parent client in the map of the active clients +- // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet +- // and is not ready to handle requests. +- if (!activeClientIds.has(client.id)) { +- return passthrough() +- } +- +- // Notify the client that a request has been intercepted. +- const requestBuffer = await request.arrayBuffer() +- const clientMessage = await sendToClient( +- client, +- { +- type: 'REQUEST', +- payload: { +- id: requestId, +- url: request.url, +- mode: request.mode, +- method: request.method, +- headers: Object.fromEntries(request.headers.entries()), +- cache: request.cache, +- credentials: request.credentials, +- destination: request.destination, +- integrity: request.integrity, +- redirect: request.redirect, +- referrer: request.referrer, +- referrerPolicy: request.referrerPolicy, +- body: requestBuffer, +- keepalive: request.keepalive, +- }, +- }, +- [requestBuffer], +- ) +- +- switch (clientMessage.type) { +- case 'MOCK_RESPONSE': { +- return respondWithMock(clientMessage.data) +- } +- +- case 'PASSTHROUGH': { +- return passthrough() +- } +- } +- +- return passthrough() +-} +- +-function sendToClient(client, message, transferrables = []) { +- return new Promise((resolve, reject) => { +- const channel = new MessageChannel() +- +- channel.port1.onmessage = (event) => { +- if (event.data && event.data.error) { +- return reject(event.data.error) +- } +- +- resolve(event.data) +- } +- +- client.postMessage( +- message, +- [channel.port2].concat(transferrables.filter(Boolean)), +- ) +- }) +-} +- +-async function respondWithMock(response) { +- // Setting response status code to 0 is a no-op. +- // However, when responding with a "Response.error()", the produced Response +- // instance will have status code set to 0. Since it's not possible to create +- // a Response instance with status code 0, handle that use-case separately. +- if (response.status === 0) { +- return Response.error() +- } +- +- const mockedResponse = new Response(response.body, response) +- +- Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { +- value: true, +- enumerable: true, +- }) +- +- return mockedResponse +-} +diff --git a/web/src/main.tsx b/web/src/main.tsx +index a3f4f9a..1501b4a 100644 +--- a/web/src/main.tsx ++++ b/web/src/main.tsx +@@ -11,33 +11,22 @@ import { router } from './router'; + import './i18n'; + import './assets/styles/index.css'; + +-const renderApp = () => { +- return ReactDOM.createRoot(document.getElementById('root')!).render( +- +- +- +- +- } +- > +- +- +- +- +- +- +- +- +- +- ); +-}; +- +-if (import.meta.env.MODE === 'mocked') { +- const { worker } = await import('./mocks/browser') +- worker.start().then(() => { +- return renderApp(); +- }); +-} +- +-renderApp(); ++ReactDOM.createRoot(document.getElementById('root')!).render( ++ ++ ++ ++ ++ } ++ > ++ ++ ++ ++ ++ ++ ++ ++ ++ ++); +diff --git a/web/src/mocks/browser.ts b/web/src/mocks/browser.ts +deleted file mode 100644 +index 3cb0487..0000000 +--- a/web/src/mocks/browser.ts ++++ /dev/null +@@ -1,14 +0,0 @@ +-import { setupWorker } from 'msw/browser' +-import { http, HttpResponse } from 'msw' +- +-export const handlers = [ +- http.post('/api/auth/login', () => { +- return HttpResponse.json({ +- code: 0, +- data: { +- token: 'mocked_token', +- }, +- }) +- }), +-] +-export const worker = setupWorker(...handlers) +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0020-support-kvm_system-fix-const-char-and-std-nullptr_t-.patch b/buildroot/package/nanokvm-server/0020-support-kvm_system-fix-const-char-and-std-nullptr_t-.patch new file mode 100644 index 0000000000..9dda0e077b --- /dev/null +++ b/buildroot/package/nanokvm-server/0020-support-kvm_system-fix-const-char-and-std-nullptr_t-.patch @@ -0,0 +1,53 @@ +From 9ca04cdc9f39f51e890ad9d4ed1ee6c53689d738 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Fri, 17 Jan 2025 22:40:52 +0100 +Subject: [PATCH] support: kvm_system: fix 'const char' and 'std::nullptr_t' + comparsion + +--- + support/sg2002/kvm_system/main/lib/system_state/system_state.cpp | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/support/sg2002/kvm_system/main/lib/system_state/system_state.cpp b/support/sg2002/kvm_system/main/lib/system_state/system_state.cpp +index be0461f..953a805 100644 +--- a/support/sg2002/kvm_system/main/lib/system_state/system_state.cpp ++++ b/support/sg2002/kvm_system/main/lib/system_state/system_state.cpp +@@ -13,7 +13,7 @@ int get_ip_addr(ip_addr_t ip_type) + switch (ip_type){ + case ETH_IP: // eth_addr + if(strcmp(ip_address()["eth0"].c_str(), (char*)kvm_sys_state.eth_addr) != 0){ +- if(*(ip_address()["eth0"].c_str()) == NULL){ ++ if(*(ip_address()["eth0"].c_str()) == 0){ + printf("can`t get ip addr\r\n"); + kvm_sys_state.eth_addr[0] = 0; + return 0; +@@ -28,7 +28,7 @@ int get_ip_addr(ip_addr_t ip_type) + return 1; + case WiFi_IP: // wifi_addr + if(strcmp(ip_address()["wlan0"].c_str(), (char*)kvm_sys_state.wifi_addr) != 0){ +- if(*(ip_address()["wlan0"].c_str()) == NULL){ ++ if(*(ip_address()["wlan0"].c_str()) == 0){ + printf("can`t get ip addr\r\n"); + kvm_sys_state.wifi_addr[0] = 0; + return 0; +@@ -42,7 +42,7 @@ int get_ip_addr(ip_addr_t ip_type) + } + return 1; + case Tailscale_IP: // tail_addr +- if(*(ip_address()["tailscale0"].c_str()) == NULL){ ++ if(*(ip_address()["tailscale0"].c_str()) == 0){ + printf("can`t get ip addr\r\n"); + kvm_sys_state.tail_addr[0] = 0; + return 0; +@@ -55,7 +55,7 @@ int get_ip_addr(ip_addr_t ip_type) + printf("\r\n"); + return 1; + case RNDIS_IP: // rndis_addr +- if(*(ip_address()["usb0"].c_str()) == NULL){ ++ if(*(ip_address()["usb0"].c_str()) == 0){ + printf("can`t get ip addr\r\n"); + kvm_sys_state.rndis_addr[0] = 0; + return 0; +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0031-vison-fix-gen_api.patch b/buildroot/package/nanokvm-server/0031-vison-fix-gen_api.patch new file mode 100644 index 0000000000..e894a991fe --- /dev/null +++ b/buildroot/package/nanokvm-server/0031-vison-fix-gen_api.patch @@ -0,0 +1,25 @@ +From 1cab2a7402d27039f89c70ae184dea61a16c3a03 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Wed, 19 Feb 2025 19:08:49 +0100 +Subject: [PATCH 1/3] vison: fix gen_api + +--- + vision/sg2002/components/vision/include/maix_image_def.hpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vision/sg2002/components/vision/include/maix_image_def.hpp b/vision/sg2002/components/vision/include/maix_image_def.hpp +index aa84e45..f4f2759 100644 +--- a/vision/sg2002/components/vision/include/maix_image_def.hpp ++++ b/vision/sg2002/components/vision/include/maix_image_def.hpp +@@ -171,7 +171,7 @@ namespace maix::image + * @param index 0 for width, 1 for height + * @return int& width or height + * @maixpy maix.image.Size.__getitem__ +- * @maixcdk maix.image.Size.[] ++ * @maixcdk maix.image.Size.operator[] + */ + int &operator[](int index) + { +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0032-vison-kvm_mmf-use-sys_ion_data2.patch b/buildroot/package/nanokvm-server/0032-vison-kvm_mmf-use-sys_ion_data2.patch new file mode 100644 index 0000000000..4bf5d6b791 --- /dev/null +++ b/buildroot/package/nanokvm-server/0032-vison-kvm_mmf-use-sys_ion_data2.patch @@ -0,0 +1,48 @@ +From 11903edfbc2b46bb17af8efba631a86e21639b87 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Wed, 19 Feb 2025 19:09:47 +0100 +Subject: [PATCH 2/3] vison: kvm_mmf: use sys_ion_data2 + +--- + vision/sg2002/components/kvm_mmf/src/kvm_mmf.cpp | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/vision/sg2002/components/kvm_mmf/src/kvm_mmf.cpp b/vision/sg2002/components/kvm_mmf/src/kvm_mmf.cpp +index 054d812..b83cff6 100644 +--- a/vision/sg2002/components/kvm_mmf/src/kvm_mmf.cpp ++++ b/vision/sg2002/components/kvm_mmf/src/kvm_mmf.cpp +@@ -11,6 +11,13 @@ + #include + + #include /* low-level i/o */ ++#ifdef __cplusplus ++extern "C" { ++#endif ++extern int ionFree(struct sys_ion_data *para); ++#ifdef __cplusplus ++} ++#endif + #include "cvi_buffer.h" + #include "cvi_ae_comm.h" + #include "cvi_awb_comm.h" +@@ -297,7 +304,7 @@ static int _free_leak_memory_of_ion(void) + if (strcmp(buffer_name, "VI_DMA_BUF") + && strcmp(buffer_name, "ISP_SHARED_BUFFER_0")) + continue; +- struct sys_ion_data_new ion_data = { ++ struct sys_ion_data2 ion_data = { + .cached = 1, + .dmabuf_fd = (uint32_t)-1, + }; +@@ -315,7 +322,7 @@ static int _free_leak_memory_of_ion(void) + + printf("ion_data.size:%d, ion_data.addr_p:%#x, ion_data.name:%s\r\n", ion_data.size, (int)ion_data.addr_p, ion_data.name); + +- int res = ionFree(&ion_data); ++ int res = ionFree((struct sys_ion_data *)&ion_data); + if (res) { + printf("ionFree failed! res:%#x\r\n", res); + mmf_deinit(); +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0033-vison-kvm_mmf-update-middleware-includes.patch b/buildroot/package/nanokvm-server/0033-vison-kvm_mmf-update-middleware-includes.patch new file mode 100644 index 0000000000..b02a176fb3 --- /dev/null +++ b/buildroot/package/nanokvm-server/0033-vison-kvm_mmf-update-middleware-includes.patch @@ -0,0 +1,42 @@ +From 3fd61f7a542169330cba6c090792e2b503348c1a Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Wed, 19 Feb 2025 19:20:57 +0100 +Subject: [PATCH] vison: kvm_mmf: update middleware includes + +--- + vision/sg2002/components/kvm_mmf/CMakeLists.txt | 37 ++++-------------------- + 1 file changed, 5 insertions(+), 32 deletions(-) + +diff --git a/vision/sg2002/components/kvm_mmf/CMakeLists.txt b/vision/sg2002/components/kvm_mmf/CMakeLists.txt +index a0e5813..db3984c 100644 +--- a/vision/sg2002/components/kvm_mmf/CMakeLists.txt ++++ b/vision/sg2002/components/kvm_mmf/CMakeLists.txt +@@ -5,7 +5,8 @@ list(APPEND ADD_INCLUDE "include") + # sophgo-middleware + set(middleware_version_str "${CONFIG_SOPHGO_MIDDLEWARE_VERSION_MAJOR}.${CONFIG_SOPHGO_MIDDLEWARE_VERSION_MINOR}.${CONFIG_SOPHGO_MIDDLEWARE_VERSION_PATCH}") + set(middleware_unzip_path "${DL_EXTRACTED_PATH}/sophgo-middleware") +-set(middleware_src_path "${middleware_unzip_path}/sophgo-middleware-${middleware_version_str}") ++set(middleware_src_path "${CMAKE_CURRENT_SOURCE_DIR}/../3rd_party/sophgo-middleware/sophgo-middleware") ++list(APPEND ADD_DEFINITIONS -D__CV181X__) + + + set(source_dir "src") +@@ -16,6 +17,7 @@ set(middleware_include_dir . + ${middleware_src_path}/v2/component/panel/${CONFIG_SOPHGO_MIDDLEWARE_CHIP} + ${middleware_src_path}/v2/include + ${middleware_src_path}/v2/include/isp/${CONFIG_SOPHGO_MIDDLEWARE_CHIP} ++ ${middleware_src_path}/v2/component/isp/common + ${middleware_src_path}/v2/sample/common + ${middleware_src_path}/v2/uapi + ${middleware_src_path}/v2/3rdparty/inih +@@ -25,6 +27,7 @@ list(APPEND ADD_INCLUDE ${middleware_include_dir}) + set_property(SOURCE ${middleware_include_dir} PROPERTY GENERATED 1) + + append_srcs_dir(middleware_src_dir ${middleware_src_path}/v2/sample/common ++ ${middleware_src_path}/v2/component/isp/common + ${middleware_src_path}/v2/component/isp/sensor/sg200x/lontium_lt6911 + ) + list(APPEND ADD_SRCS ${middleware_src_dir} +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0034-vision-disable-opencv.patch b/buildroot/package/nanokvm-server/0034-vision-disable-opencv.patch new file mode 100644 index 0000000000..ffc36e596a --- /dev/null +++ b/buildroot/package/nanokvm-server/0034-vision-disable-opencv.patch @@ -0,0 +1,222 @@ +From c949fff8470f23ed87a7dea9c7a3a98e549ddedd Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Wed, 19 Feb 2025 23:30:54 +0100 +Subject: [PATCH] vision: disable opencv + +--- + vision/sg2002/components/vision/CMakeLists.txt | 4 +++- + .../components/vision/include/maix_camera.hpp | 2 ++ + vision/sg2002/components/vision/src/maix_camera.cpp | 4 ++++ + vision/sg2002/components/vision/src/maix_image.cpp | 20 +++++++++++++++++++ + .../components/vision/src/maix_image_ops.cpp | 2 ++ + 5 files changed, 31 insertions(+), 1 deletion(-) + +diff --git a/vision/sg2002/components/vision/CMakeLists.txt b/vision/sg2002/components/vision/CMakeLists.txt +index c683409..13edc3a 100644 +--- a/vision/sg2002/components/vision/CMakeLists.txt ++++ b/vision/sg2002/components/vision/CMakeLists.txt +@@ -33,7 +33,8 @@ endif() + + + ###### Add required/dependent components ###### +-list(APPEND ADD_REQUIREMENTS basic opencv opencv_freetype websocket peripheral) ++#list(APPEND ADD_REQUIREMENTS basic opencv opencv_freetype websocket peripheral) ++list(APPEND ADD_REQUIREMENTS basic websocket peripheral) + list(APPEND ADD_REQUIREMENTS omv) + list(APPEND ADD_REQUIREMENTS kvm_mmf) + ############################################### +@@ -65,6 +66,7 @@ list(APPEND ADD_REQUIREMENTS kvm_mmf) + #### and components denpend on this component + # list(APPEND ADD_DEFINITIONS -DAAAAA222=1 + # -DAAAAA333=1) ++list(APPEND ADD_DEFINITIONS -fopenmp) + ############################################### + + ############ Add static libs ################## +diff --git a/vision/sg2002/components/vision/include/maix_camera.hpp b/vision/sg2002/components/vision/include/maix_camera.hpp +index ef15de3..08a6cc9 100644 +--- a/vision/sg2002/components/vision/include/maix_camera.hpp ++++ b/vision/sg2002/components/vision/include/maix_camera.hpp +@@ -16,7 +16,9 @@ + #include + #include + #include ++#ifdef HAVE_OPENCV + #include ++#endif + + /** + * @brief maix.camera module, access camera device and get image from it +diff --git a/vision/sg2002/components/vision/src/maix_camera.cpp b/vision/sg2002/components/vision/src/maix_camera.cpp +index 8dab65c..3116164 100644 +--- a/vision/sg2002/components/vision/src/maix_camera.cpp ++++ b/vision/sg2002/components/vision/src/maix_camera.cpp +@@ -64,6 +64,7 @@ namespace maix::camera + return err::ERR_NONE; + } + ++#ifdef HAVE_OPENCV + static void generate_colorbar(image::Image &img) + { + int width = img.width(); +@@ -88,6 +89,7 @@ namespace maix::camera + color += color_step; + } + } ++#endif + #ifdef PLATFORM_LINUX + static char * _get_device(const char *device) + { +@@ -343,7 +345,9 @@ namespace maix::camera + + if (_show_colorbar) { + image::Image *img = new image::Image(_width, _height); ++#ifdef HAVE_OPENCV + generate_colorbar(*img); ++#endif + err::check_null_raise(img, "camera read failed"); + return img; + } else { +diff --git a/vision/sg2002/components/vision/src/maix_image.cpp b/vision/sg2002/components/vision/src/maix_image.cpp +index 9405b4a..286ea2e 100644 +--- a/vision/sg2002/components/vision/src/maix_image.cpp ++++ b/vision/sg2002/components/vision/src/maix_image.cpp +@@ -6,8 +6,10 @@ + */ + + #include "maix_image.hpp" ++#ifdef HAVE_OPENCV + #include "opencv2/opencv.hpp" + #include "opencv2/freetype.hpp" ++#endif + #include + #include + #include +@@ -20,7 +22,9 @@ + namespace maix::image + { + ++#ifdef HAVE_OPENCV + static void _get_cv_format_color(image::Format _format, const image::Color &color_in, int *ch_format, cv::Scalar &cv_color); ++#endif + + static uint8_t _get_char_size(const uint8_t c) + { +@@ -43,6 +47,7 @@ namespace maix::image + } + + ++#ifdef HAVE_OPENCV + image::Image *load(const char *path, image::Format format) + { + cv::Mat mat; +@@ -138,6 +143,7 @@ namespace maix::image + memcpy(img->data(), mat.data, mat.cols * mat.rows * mat.channels()); + return img; + } ++#endif + + image::Image *from_bytes(int width, int height, image::Format format, Bytes *data, bool copy) + { +@@ -145,6 +151,7 @@ namespace maix::image + return new image::Image(width, height, format, data->data, data->size(), copy); + } + ++#ifdef HAVE_OPENCV + static std::map> fonts_info; + static std::map fonts_size_info; + static std::string curr_font_name = "hershey_plain"; +@@ -273,6 +280,7 @@ namespace maix::image + cv::putText(img, text, point_tmp, font_id, scale, color, thickness > 0 ? thickness : -thickness, cv::LINE_AA, false); + } + } ++#endif + + void Image::_create_image(int width, int height, image::Format format, uint8_t *data, int data_size, bool copy) + { +@@ -414,8 +422,10 @@ namespace maix::image + throw err::Exception(err::ERR_ARGS, "convert format failed, already the format"); + } + ++#ifdef HAVE_OPENCV + cv::Mat src(_height, _width, CV_8UC((int)image::fmt_size[_format]), _data); + cv::ColorConversionCodes cvt_code; ++#endif + if(format == image::FMT_JPEG) // compress + { + switch (_format) { +@@ -518,6 +528,7 @@ namespace maix::image + } + + } ++#ifdef HAVE_OPENCV + else if(format == image::FMT_PNG) + { + image::Image *p_img = nullptr; +@@ -722,6 +733,9 @@ namespace maix::image + } + + return img; ++#else ++ return nullptr; ++#endif + } + + +@@ -733,7 +747,9 @@ namespace maix::image + image::Image *Image::to_jpeg(int quality) + { + image::Format format = image::Format::FMT_JPEG; ++#ifdef HAVE_OPENCV + cv::Mat src(_height, _width, CV_8UC((int)image::fmt_size[_format]), _data); ++#endif + switch (_format) { + case image::FMT_YVU420SP: + { +@@ -811,6 +827,7 @@ namespace maix::image + return nullptr; + } + ++#ifdef HAVE_OPENCV + image::Image *Image::draw_image(int x, int y, image::Image &img) + { + image::Format fmt = img.format(); +@@ -1301,6 +1318,7 @@ namespace maix::image + cv::warpAffine(img, dst, warp_mat, dst.size(), (cv::InterpolationFlags)method); + return ret; + } ++#endif + + image::Image *Image::copy() + { +@@ -1310,6 +1328,7 @@ namespace maix::image + return ret; + } + ++#ifdef HAVE_OPENCV + image::Image *Image::crop(int x, int y, int w, int h) + { + image::Image *ret = new image::Image(w, h, _format); +@@ -1651,4 +1670,5 @@ namespace maix::image + int h = std::min(roi[1] + roi[3], src_y + src_h) - y; + return std::vector{x, y, w, h}; + } ++#endif + } // namespace maix::image +diff --git a/vision/sg2002/components/vision/src/maix_image_ops.cpp b/vision/sg2002/components/vision/src/maix_image_ops.cpp +index dd3eb17..c1e4c7e 100644 +--- a/vision/sg2002/components/vision/src/maix_image_ops.cpp ++++ b/vision/sg2002/components/vision/src/maix_image_ops.cpp +@@ -9,7 +9,9 @@ + #include "maix_image_util.hpp" + #include "maix_err.hpp" + #include ++#ifdef HAVE_OPENCV + #include ++#endif + + namespace maix::image { + void convert_to_imlib_image(image::Image *image, image_t *imlib_image) { +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0036-vison-kvm-enable-venc_auto_recyc-by-default.patch b/buildroot/package/nanokvm-server/0036-vison-kvm-enable-venc_auto_recyc-by-default.patch new file mode 100644 index 0000000000..85ece10336 --- /dev/null +++ b/buildroot/package/nanokvm-server/0036-vison-kvm-enable-venc_auto_recyc-by-default.patch @@ -0,0 +1,25 @@ +From bcabaf5f034591da8931fcae42ee8950ea4e5af2 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Wed, 26 Feb 2025 02:44:18 +0100 +Subject: [PATCH] vison: kvm: enable venc_auto_recyc by default + +--- + vision/sg2002/components/kvm/src/kvm_vision.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vision/sg2002/components/kvm/src/kvm_vision.cpp b/vision/sg2002/components/kvm/src/kvm_vision.cpp +index 6642a99..7202a92 100644 +--- a/vision/sg2002/components/kvm/src/kvm_vision.cpp ++++ b/vision/sg2002/components/kvm/src/kvm_vision.cpp +@@ -83,7 +83,7 @@ typedef struct { + uint8_t hdmi_reading_flag = 0; + uint8_t hdmi_mode = 0; + uint8_t vi_detect_state = 0; +- uint8_t venc_auto_recyc = 0; ++ uint8_t venc_auto_recyc = 1; + } kvmv_cfg_t; + + typedef struct { +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0039-vison-kvm-show-test-picture-if-no-input-signal-is-de.patch b/buildroot/package/nanokvm-server/0039-vison-kvm-show-test-picture-if-no-input-signal-is-de.patch new file mode 100644 index 0000000000..7ceee0fd4c --- /dev/null +++ b/buildroot/package/nanokvm-server/0039-vison-kvm-show-test-picture-if-no-input-signal-is-de.patch @@ -0,0 +1,237 @@ +From c74bba730f952a274b6cb92c52ea015c2b8a8e0d Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Sat, 22 Feb 2025 17:05:25 +0100 +Subject: [PATCH] vison: kvm: show test picture if no input signal is detected + +--- + vision/sg2002/components/kvm/src/kvm_vision.cpp | 181 +++++++++++++++++++++++ + 1 file changed, 181 insertions(+) + +diff --git a/vision/sg2002/components/kvm/src/kvm_vision.cpp b/vision/sg2002/components/kvm/src/kvm_vision.cpp +index 0afd8f8..8f7af14 100644 +--- a/vision/sg2002/components/kvm/src/kvm_vision.cpp ++++ b/vision/sg2002/components/kvm/src/kvm_vision.cpp +@@ -9,6 +9,9 @@ + * // deinit时free全部内存 + * // free 错内存时会炸的问题 + */ ++ ++#include "cvi_buffer.h" ++ + #include "kvm_vision.h" + + #define default_venc_chn 1 +@@ -79,6 +82,7 @@ typedef struct { + uint8_t hdmi_mode = 0; + uint8_t vi_detect_state = 0; + uint8_t venc_auto_recyc = 1; ++ image::Image *no_signal_img = NULL; + } kvmv_cfg_t; + + typedef struct { +@@ -138,6 +142,170 @@ kvmv_data_t* get_save_buffer() + return NULL; + } + ++static void _rgb888_to_nv21(uint8_t* data, uint32_t w, uint32_t h, uint8_t* yuv) ++{ ++ uint32_t row_bytes; ++ uint8_t* uv; ++ uint8_t* y; ++ uint8_t r, g, b; ++ uint8_t y_val, u_val, v_val; ++ ++ uint8_t * img; ++ uint32_t i, j; ++ y = yuv; ++ uv = yuv + w * h; ++ ++ row_bytes = (w * 3 ); ++ h = h & ~1; ++ //先转换Y ++ for (i = 0; i < h; i++) ++ { ++ img = data + row_bytes * i; ++ for (j = 0; j =254&&g>=254&&b>=254) ++ { ++ y_val=254; ++ *y++ = y_val; ++ continue; ++ } ++ y_val = (uint8_t)(((int)(299 * r) + (int)(597 * g) + (int)(114 * b)) / 1000); ++ *y++ = y_val; ++ } ++ } ++ //转换uv ++ for (i = 0; i 0) { ++ int seg_w = (remain_width > segment_width) ? segment_width : remain_width; ++ uint8_t r,g,b; ++ switch (idx) { ++ case 0: r = 0xff, g = 0x00, b = 0x00; break; ++ case 1: r = 0x00, g = 0xff, b = 0x00; break; ++ case 2: r = 0x00, g = 0x00, b = 0xff; break; ++ case 3: r = 0xff, g = 0xff, b = 0x00; break; ++ case 4: r = 0xff, g = 0x00, b = 0xff; break; ++ case 5: r = 0x00, g = 0xff, b = 0xff; break; ++ default: r = 0x00, g = 0x00, b = 0x00; break; ++ } ++ idx ++; ++ for (int i = 0; i < height; i ++) { ++ for (int j = 0; j < seg_w; j ++) { ++ rgb_data[(i * width + x_oft + j) * 3 + 0] = r; ++ rgb_data[(i * width + x_oft + j) * 3 + 1] = g; ++ rgb_data[(i * width + x_oft + j) * 3 + 2] = b; ++ } ++ } ++ x_oft += seg_w; ++ remain_width -= seg_w; ++ } ++ ++ for (int i = 0; i < height; i ++) { ++ uint8_t *buff = &rgb_data[(i * width + i) * 3]; ++ buff[0] = 0xff; ++ buff[1] = 0xff; ++ buff[2] = 0xff; ++ } ++ for (int i = 0; i < height; i ++) { ++ uint8_t *buff = &rgb_data[(i * width + i + width - height) * 3]; ++ buff[0] = 0xff; ++ buff[1] = 0xff; ++ buff[2] = 0xff; ++ } ++ ++ return rgb_data; ++ } ++ case PIXEL_FORMAT_ARGB_8888: ++ { ++ uint8_t *rgb_data = (uint8_t *)malloc(width * height * 4); ++ memset(rgb_data, 0x00, width * height * 4); ++ int x_oft = 0; ++ int remain_width = width; ++ int segment_width = width / 6; ++ int idx = 0; ++ while (remain_width > 0) { ++ int seg_w = (remain_width > segment_width) ? segment_width : remain_width; ++ uint8_t r,g,b,a; ++ switch (idx) { ++ case 0: r = 0xff, g = 0x00, b = 0x00; a = 0x10; break; ++ case 1: r = 0x00, g = 0xff, b = 0x00; a = 0x20; break; ++ case 2: r = 0x00, g = 0x00, b = 0xff; a = 0x40; break; ++ case 3: r = 0xff, g = 0xff, b = 0x00; a = 0x60; break; ++ case 4: r = 0xff, g = 0x00, b = 0xff; a = 0x80; break; ++ case 5: r = 0x00, g = 0xff, b = 0xff; a = 0xA0; break; ++ default: r = 0x00, g = 0x00, b = 0x00; a = 0xC0; break; ++ } ++ idx ++; ++ for (int i = 0; i < height; i ++) { ++ for (int j = 0; j < seg_w; j ++) { ++ rgb_data[(i * width + x_oft + j) * 4 + 0] = r; ++ rgb_data[(i * width + x_oft + j) * 4 + 1] = g; ++ rgb_data[(i * width + x_oft + j) * 4 + 2] = b; ++ rgb_data[(i * width + x_oft + j) * 4 + 3] = a; ++ } ++ } ++ x_oft += seg_w; ++ remain_width -= seg_w; ++ } ++ ++ // for (int i = 0; i < height; i ++) { ++ // uint8_t *buff = &rgb_data[(i * width + i) * 4]; ++ // buff[0] = 0xff; ++ // buff[1] = 0xff; ++ // buff[2] = 0xff; ++ // } ++ // for (int i = 0; i < height; i ++) { ++ // uint8_t *buff = &rgb_data[(i * width + i + width - height) * 4]; ++ // buff[0] = 0xff; ++ // buff[1] = 0xff; ++ // buff[2] = 0xff; ++ // } ++ ++ return rgb_data; ++ } ++ case PIXEL_FORMAT_NV21: ++ { ++ uint8_t *rgb_data = _prepare_image(width, height, PIXEL_FORMAT_RGB_888); ++ uint8_t *nv21 = (uint8_t *)malloc(width * height * 3 / 2); ++ _rgb888_to_nv21(rgb_data, width, height, nv21); ++ free(rgb_data); ++ return nv21; ++ } ++ break; ++ default: ++ debug("[kvmv]%s: Only support PIXEL_FORMAT_RGB_888\r\n", __func__); ++ break; ++ } ++ return NULL; ++} ++ + // ====HDMI RES================================================== + + uint16_t hdmi_res_list[][2] = { +@@ -1408,11 +1576,22 @@ int kvmv_read_img(uint16_t _width, uint16_t _height, uint8_t _type, uint16_t _ql + if (kvmv_cfg.reinit_flag == 1) { + cam->hmirror(1); + cam->vflip(1); ++ if (kvmv_cfg.no_signal_img != NULL) delete kvmv_cfg.no_signal_img; ++ kvmv_cfg.no_signal_img = new image::Image(kvmv_cfg.vpss_width, kvmv_cfg.vpss_height, image::Format::FMT_YVU420SP); ++ if (kvmv_cfg.no_signal_img) { ++ uint8_t *rgb_data = _prepare_image(kvmv_cfg.no_signal_img->width(), kvmv_cfg.no_signal_img->height(), PIXEL_FORMAT_RGB_888); ++ _rgb888_to_nv21(rgb_data, kvmv_cfg.no_signal_img->width(), kvmv_cfg.no_signal_img->height(), (uint8_t*)kvmv_cfg.no_signal_img->data()); ++ free(rgb_data); ++ } ++ + kvmv_cfg.reinit_flag = 0; + } + // debug("[kvmv]befor read img: %d \r\n", (int)(time::time_ms() - start_time)); + image::Image *img = cam->read(); + // debug("[kvmv]read img: %d \r\n", (int)(time::time_ms() - start_time)); ++ if(img == NULL && kvmv_cfg.no_signal_img != NULL) { ++ img = kvmv_cfg.no_signal_img->copy(); ++ } + if(img != NULL){ + if(kvmv_cfg.cam_state == 0) { + kvmv_cfg.cam_state = 1; +@@ -1729,6 +1729,8 @@ void free_all_kvmv_data() + if(kvmv_PPS_buffer.p_img_data != NULL) free(kvmv_PPS_buffer.p_img_data); + kvmv_SPS_buffer.p_img_data = NULL; + kvmv_PPS_buffer.p_img_data = NULL; ++ if (kvmv_cfg.no_signal_img != NULL) delete kvmv_cfg.no_signal_img; ++ kvmv_cfg.no_signal_img = NULL; + } + + void kvmv_deinit() +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0040-vison-kvm-use-mmf_vi_aligned_width.patch b/buildroot/package/nanokvm-server/0040-vison-kvm-use-mmf_vi_aligned_width.patch new file mode 100644 index 0000000000..1b7637f5eb --- /dev/null +++ b/buildroot/package/nanokvm-server/0040-vison-kvm-use-mmf_vi_aligned_width.patch @@ -0,0 +1,43 @@ +From 4778ca650d9cf43ecba917b260453baa350e5670 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Sun, 23 Feb 2025 18:11:09 +0100 +Subject: [PATCH] vison: kvm: use mmf_vi_aligned_width + +--- + vision/sg2002/components/kvm/src/kvm_vision.cpp | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/vision/sg2002/components/kvm/src/kvm_vision.cpp b/vision/sg2002/components/kvm/src/kvm_vision.cpp +index b8c5b99..ecff9fe 100644 +--- a/vision/sg2002/components/kvm/src/kvm_vision.cpp ++++ b/vision/sg2002/components/kvm/src/kvm_vision.cpp +@@ -1550,6 +1550,11 @@ int kvmv_read_img(uint16_t _width, uint16_t _height, uint8_t _type, uint16_t _ql + uint8_t try_num = 0; + do { + if(kvmv_cfg.vpss_width != _width || kvmv_cfg.vpss_height != _height){ ++ uint16_t _new_width = _width; ++ uint16_t _new_height = _height; ++ int vi_al = mmf_vi_aligned_width(0); ++ if (vi_al > 0) ++ _new_width = ALIGN(_width, vi_al); + if(_width == 0 || _height == 0){ + // Follow the HDMI output + kvmv_cfg.vpss_width = kvmv_cfg.vi_width; +@@ -1561,11 +1566,11 @@ int kvmv_read_img(uint16_t _width, uint16_t _height, uint8_t _type, uint16_t _ql + kvmv_cfg.reinit_flag = 1; + } + +- } else { ++ } else if(kvmv_cfg.vpss_width != _new_width || kvmv_cfg.vpss_height != _new_height){ + kvmv_cfg.Auto_res = 0; + // Set the output +- kvmv_cfg.vpss_width = _width; +- kvmv_cfg.vpss_height = _height; ++ kvmv_cfg.vpss_width = _new_width; ++ kvmv_cfg.vpss_height = _new_height; + + cam->set_resolution(kvmv_cfg.vpss_width, kvmv_cfg.vpss_height); + kvmv_cfg.reinit_flag = 1; +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/0041-support-kvm_system-add-return-value-to-get_ping_allo.patch b/buildroot/package/nanokvm-server/0041-support-kvm_system-add-return-value-to-get_ping_allo.patch new file mode 100644 index 0000000000..c91daa594e --- /dev/null +++ b/buildroot/package/nanokvm-server/0041-support-kvm_system-add-return-value-to-get_ping_allo.patch @@ -0,0 +1,33 @@ +From 3585f6dbb96eac2665d8ba2d7619164a2e93dc97 Mon Sep 17 00:00:00 2001 +From: scpcom +Date: Sat, 1 Mar 2025 02:11:22 +0100 +Subject: [PATCH] support: kvm_system: add return value to get_ping_allow_state + and ion_free_space + +--- + .../sg2002/kvm_system/main/lib/system_state/system_state.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/support/sg2002/kvm_system/main/lib/system_state/system_state.cpp b/support/sg2002/kvm_system/main/lib/system_state/system_state.cpp +index bf7e00e..4372dcd 100644 +--- a/support/sg2002/kvm_system/main/lib/system_state/system_state.cpp ++++ b/support/sg2002/kvm_system/main/lib/system_state/system_state.cpp +@@ -63,6 +63,8 @@ int get_ping_allow_state() + } else { + kvm_sys_state.ping_allow = 1; + } ++ ++ return kvm_sys_state.ping_allow; + } + + // net_port +@@ -485,4 +487,6 @@ void kvm_update_tailscale_state(void) + uint8_t ion_free_space(void) + { + //cat /sys/kernel/debug/ion/cvi_carveout_heap_dump/summary | grep "usage rate:" | awk '{print $2}' ++ ++ return 0; + } +-- +2.34.1 + diff --git a/buildroot/package/nanokvm-server/Config.in b/buildroot/package/nanokvm-server/Config.in new file mode 100644 index 0000000000..016a735d5c --- /dev/null +++ b/buildroot/package/nanokvm-server/Config.in @@ -0,0 +1,10 @@ +config BR2_PACKAGE_NANOKVM_SERVER + bool "nanokvm-server" + depends on BR2_PACKAGE_HOST_GO_TARGET_ARCH_SUPPORTS + depends on BR2_PACKAGE_HOST_NODEJS_BIN_ARCH_SUPPORTS + select BR2_PACKAGE_HOST_NODEJS + select BR2_PACKAGE_HOST_NODEJS_COREPACK + select BR2_PACKAGE_HOST_PYTHON3 + select BR2_PACKAGE_HOST_PYTHON3_SSL + help + nanokvm server diff --git a/buildroot/package/nanokvm-server/nanokvm-server.mk b/buildroot/package/nanokvm-server/nanokvm-server.mk new file mode 100644 index 0000000000..04462d728b --- /dev/null +++ b/buildroot/package/nanokvm-server/nanokvm-server.mk @@ -0,0 +1,211 @@ +################################################################################ +# +# nanokvm-server +# +################################################################################ + +NANOKVM_SERVER_VERSION = 8d8c57bc48a3db696e41adacc3dac176af956d34 +NANOKVM_SERVER_SITE = $(call github,sipeed,NanoKVM,$(NANOKVM_SERVER_VERSION)) + +NANOKVM_SERVER_DEPENDENCIES = host-go host-nodejs host-python3 + +ifeq ($(BR2_PACKAGE_MAIX_CDK),y) +# Use MaixCDK to build kvm_system. +NANOKVM_SERVER_DEPENDENCIES += maix-cdk +endif + +GO_BIN = $(HOST_DIR)/bin/go + +NANOKVM_SERVER_GO_ENV = $(HOST_GO_CROSS_ENV) + +HOST_NODEJS_BIN_ENV = $(HOST_CONFIGURE_OPTS) \ + LDFLAGS="$(NODEJS_LDFLAGS)" \ + LD="$(HOST_CXX)" \ + PATH=$(BR_PATH) \ + npm_config_build_from_source=true \ + npm_config_nodedir=$(HOST_DIR)/usr \ + npm_config_prefix=$(HOST_DIR)/usr \ + npm_config_cache=$(BUILD_DIR)/.npm-cache + +HOST_COREPACK = $(HOST_NODEJS_BIN_ENV) $(HOST_DIR)/bin/corepack + +NANOKVM_SERVER_PNPM_VERSION = 9.15.5 +NANOKVM_SERVER_PNPM_SHA_SUM = cb1f6372ef64e2ba352f2f46325adead1c99ff8f + +NANOKVM_SERVER_GOMOD = server + +NANOKVM_SERVER_EXT_MIDDLEWARE = $(realpath $(TOPDIR)/../middleware/v2) +NANOKVM_SERVER_EXT_KVM_MMF = sample/test_mmf/kvm_mmf/release.linux/libkvm_mmf.so +NANOKVM_SERVER_EXT_KVM_VISION = sample/test_mmf/kvm_vision/release.linux/libkvm.so +NANOKVM_SERVER_EXT_MAIXCAM_LIB = sample/test_mmf/maixcam_lib/release.linux/libmaixcam_lib.so + +NANOKVM_SERVER_REQUIRED_LIBS = \ + libae.so \ + libaf.so \ + libawb.so \ + libcvi_bin_isp.so \ + libcvi_bin.so \ + libcvi_ive.so \ + libini.so \ + libisp_algo.so \ + libisp.so \ + libmipi_tx.so \ + libmisc.so \ + libraw_dump.so \ + libsys.so \ + libvdec.so \ + libvenc.so + +NANOKVM_SERVER_VPU_LIBS = \ + libosdc.so \ + libvpu.so \ + libgdc.so \ + librgn.so \ + libvi.so \ + libvo.so \ + libvpss.so + +NANOKVM_SERVER_UNUSED_LIBS = \ + libcli.so \ + libjson-c.so.5 \ + libcvi_ispd2.so \ + libaaccomm2.so \ + libaacdec2.so \ + libaacenc2.so \ + libaacsbrdec2.so \ + libaacsbrenc2.so \ + libcvi_RES1.so \ + libcvi_VoiceEngine.so \ + libcvi_audio.so \ + libcvi_ssp.so \ + libcvi_vqe.so \ + libdnvqe.so \ + libtinyalsa.so + +NANOKVM_SERVER_DUMMY_LIBS = \ + libae.so \ + libaf.so \ + libawb.so + +define NANOKVM_SERVER_BUILD_CMDS + if [ -e $(@D)/kvmapp ]; then \ + rm -f $(@D)/kvmapp/jpg_stream/jpg_stream ; \ + rm -rf $(@D)/kvmapp/kvm_system/ ; \ + rm -rf $(@D)/kvmapp/system/ko/ ; \ + fi + mkdir -pv $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ + rm -f $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/libopencv_*.so* + if [ -e $(NANOKVM_SERVER_EXT_MIDDLEWARE)/$(NANOKVM_SERVER_EXT_KVM_MMF) ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/$(NANOKVM_SERVER_EXT_KVM_MMF) $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ ; \ + elif [ -e $(NANOKVM_SERVER_EXT_MIDDLEWARE)/$(NANOKVM_SERVER_EXT_MAIXCAM_LIB) ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/$(NANOKVM_SERVER_EXT_MAIXCAM_LIB) $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ ; \ + fi + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/3rd/libini.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ + for l in $(NANOKVM_SERVER_REQUIRED_LIBS) ; do \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/$$l $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ ; \ + done + for l in $(NANOKVM_SERVER_VPU_LIBS) ; do \ + if [ -e $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/$$l ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/$$l $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ ; \ + fi ; \ + done + for l in $(NANOKVM_SERVER_UNUSED_LIBS) ; do \ + rm -f $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + ln -s libmisc.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + done + if [ -e $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/libcvi_dummy.so ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/libcvi_dummy.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ ; \ + for l in $(NANOKVM_SERVER_DUMMY_LIBS) ; do \ + rm -f $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + ln -s libcvi_dummy.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + done ; \ + fi + if [ -e $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/libcvi_bin_light.so -a \ + -e $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/libisp_light.so ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/libcvi_bin_light.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ ; \ + for l in libcvi_bin.so ; do \ + rm -f $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + ln -s libcvi_bin_light.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + done ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/lib/libisp_light.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ ; \ + for l in libcvi_bin_isp.so libisp.so ; do \ + rm -f $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + ln -s libisp_light.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + done ; \ + for l in libisp_algo.so ; do \ + rm -f $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + ln -s libmisc.so $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/$$l ; \ + done ; \ + fi + if [ -e $(NANOKVM_SERVER_EXT_MIDDLEWARE)/$(NANOKVM_SERVER_EXT_KVM_VISION) -a \ + -e $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/libkvm.so ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SERVER_EXT_MIDDLEWARE)/$(NANOKVM_SERVER_EXT_KVM_VISION) $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/ ; \ + chmod ugo+rx $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/libkvm.so ; \ + fi + if [ -e $(@D)/vision/sg2002/components -a -e $(HOST_DIR)/bin/maixcdk ]; then \ + if [ ! -e $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/_off/vision ]; then \ + mkdir $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/_off ; \ + mv $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/components/vision $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/_off/ ; \ + else \ + rm -rf $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/components/vision ; \ + fi ; \ + rsync -avpPxH $(@D)/vision/sg2002/components/ $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/components/ ; \ + rm -rf $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/examples/kvm_vision_test ; \ + rsync -avpPxH $(@D)/vision/sg2002/kvm_vision_test $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/examples/ ; \ + cd $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/examples/kvm_vision_test/ ; \ + PATH=$(BR_PATH) $(HOST_DIR)/bin/maixcdk build -p maixcam ; \ + rm -rf $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/components/vision ; \ + mv $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/_off/vision $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/components/ ; \ + rmdir $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/_off ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/examples/kvm_vision_test/dist/kvm_vision_test_release/dl_lib/libkvm*.so ${@D}/server/dl_lib/ ; \ + fi + if [ -e $(@D)/support/sg2002/kvm_system -a -e $(HOST_DIR)/bin/maixcdk ]; then \ + rm -rf $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/examples/kvm_system ; \ + rsync -avpPxH $(@D)/support/sg2002/kvm_system $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/examples/ ; \ + cd $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/examples/kvm_system/ ; \ + PATH=$(BR_PATH) $(HOST_DIR)/bin/maixcdk build -p maixcam ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(@D)/../maix-cdk-$(MAIX_CDK_VERSION)/examples/kvm_system/dist/kvm_system_release/kvm_system $(@D)/support/sg2002/kvm_system/ ; \ + fi + cd $(@D)/$(NANOKVM_SERVER_GOMOD) ; \ + GOPROXY=direct GOSUMDB="sum.golang.org" $(GO_BIN) mod tidy + cd $(@D)/$(NANOKVM_SERVER_GOMOD) ; \ + sed -i 's|-L../dl_lib -lkvm|-L../dl_lib -L$(TARGET_DIR)/usr/lib -lkvm|g' common/cgo.go ; \ + sed -i s/' -lkvm$$'/' -lkvm -lmaixcam_lib -latomic -lae -laf -lawb -lcvi_bin -lcvi_bin_isp -lini -lisp -lisp_algo -lsys -lvdec -lvenc -lvpu'/g common/cgo.go + if [ -e $(@D)/$(NANOKVM_SERVER_GOMOD)/dl_lib/libkvm_mmf.so ]; then \ + cd $(@D)/$(NANOKVM_SERVER_GOMOD) ; \ + sed -i s/'maixcam_lib'/'kvm_mmf'/g common/cgo.go ; \ + fi + cd $(@D)/$(NANOKVM_SERVER_GOMOD) ; \ + CGO_ENABLED=1 $(NANOKVM_SERVER_GO_ENV) $(GO_BIN) build -x -ldflags="-extldflags '-Wl,-rpath,\$$ORIGIN/dl_lib'" + cd $(@D)/web ; \ + $(HOST_COREPACK) install -g pnpm@$(NANOKVM_SERVER_PNPM_VERSION)+sha1.$(NANOKVM_SERVER_PNPM_SHA_SUM) ; \ + $(HOST_COREPACK) use pnpm@$(NANOKVM_SERVER_PNPM_VERSION) ; \ + $(HOST_COREPACK) pnpm install + cd $(@D)/web ; \ + $(HOST_COREPACK) pnpm build +endef + +define NANOKVM_SERVER_INSTALL_TARGET_CMDS + if [ "X$(BR2_PACKAGE_TAILSCALE_RISCV64)" = "Xy" ]; then \ + rm -f $(TARGET_DIR)/etc/tailscale_disabled ; \ + else \ + mkdir -pv $(TARGET_DIR)/etc/ ; \ + touch $(TARGET_DIR)/etc/tailscale_disabled ; \ + fi + mkdir -pv $(TARGET_DIR)/kvmapp/ + #touch $(TARGET_DIR)/kvmapp/force_dl_lib + mkdir -pv $(TARGET_DIR)/kvmapp/server/ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/server/NanoKVM-Server $(TARGET_DIR)/kvmapp/server/ + if [ -e ${@D}/support/sg2002/kvm_system/kvm_system ]; then \ + mkdir -pv $(TARGET_DIR)/kvmapp/kvm_system/ ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/support/sg2002/kvm_system/kvm_system $(TARGET_DIR)/kvmapp/kvm_system/ ; \ + else \ + rm -f $(TARGET_DIR)/kvmapp/kvm_system/kvm_system ; \ + fi + mkdir -pv $(TARGET_DIR)/kvmapp/server/dl_lib/ + rsync -r --verbose --links --safe-links --hard-links ${@D}/server/dl_lib/ $(TARGET_DIR)/kvmapp/server/dl_lib/ + mkdir -pv $(TARGET_DIR)/kvmapp/server/web/ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/web/dist/ $(TARGET_DIR)/kvmapp/server/web/ +endef + +$(eval $(generic-package)) diff --git a/buildroot/package/nanokvm-sg200x/0001-nanokvm-fix-ntp.patch b/buildroot/package/nanokvm-sg200x/0001-nanokvm-fix-ntp.patch new file mode 100644 index 0000000000..d91d80c551 --- /dev/null +++ b/buildroot/package/nanokvm-sg200x/0001-nanokvm-fix-ntp.patch @@ -0,0 +1,13 @@ +diff --git a/system/init.d/S95nanokvm b/system/init.d/S95nanokvm +index 056508f..3bda390 100755 +--- a/kvmapp/system/init.d/S95nanokvm ++++ b/kvmapp/system/init.d/S95nanokvm +@@ -44,6 +44,8 @@ case "$1" in + + cp -r /kvmapp/server /tmp/ + /tmp/server/NanoKVM-Server & ++ ++ /etc/init.d/S49ntp restart + ;; + stop) + killall kvm_system diff --git a/buildroot/package/nanokvm-sg200x/Config.in b/buildroot/package/nanokvm-sg200x/Config.in new file mode 100644 index 0000000000..6181387f40 --- /dev/null +++ b/buildroot/package/nanokvm-sg200x/Config.in @@ -0,0 +1,5 @@ +config BR2_PACKAGE_NANOKVM_SG200X + bool "nanokvm-sg200x" + select BR2_PACKAGE_NANOKVM_SERVER + help + nanokvm web server for sg200x diff --git a/buildroot/package/nanokvm-sg200x/nanokvm-sg200x.mk b/buildroot/package/nanokvm-sg200x/nanokvm-sg200x.mk new file mode 100644 index 0000000000..d40b9646df --- /dev/null +++ b/buildroot/package/nanokvm-sg200x/nanokvm-sg200x.mk @@ -0,0 +1,184 @@ +################################################################################ +# +# nanokvm-sg200x +# +################################################################################ + +NANOKVM_SG200X_VERSION = 2.2.1 +NANOKVM_SG200X_BASE = nanokvm-skeleton-$(NANOKVM_SG200X_VERSION) +NANOKVM_SG200X_SOURCE = v$(NANOKVM_SG200X_VERSION).zip +NANOKVM_SG200X_SITE = https://github.com/scpcom/nanokvm-skeleton/archive/refs/tags + +NANOKVM_SG200X_DEPENDENCIES += nanokvm-server + +NANOKVM_SG200X_EXT_MIDDLEWARE = $(realpath $(TOPDIR)/../middleware/v2) +NANOKVM_SG200X_EXT_KVM_SYSTEM = sample/kvm_system/kvm_system +NANOKVM_SG200X_EXT_KVM_STREAM = sample/kvm_stream/kvm_stream +NANOKVM_SG200X_EXT_KVM_MMF = sample/test_mmf/kvm_mmf/release.linux/libkvm_mmf.so +NANOKVM_SG200X_EXT_KVM_VISION = sample/test_mmf/kvm_vision/release.linux/libkvm.so +NANOKVM_SG200X_EXT_MAIXCAM_LIB = sample/test_mmf/maixcam_lib/release.linux/libmaixcam_lib.so +NANOKVM_SG200X_EXT_OVERLAY = $(BR2_ROOTFS_OVERLAY) + +NANOKVM_SG200X_REQUIRED_LIBS = \ + libae.so \ + libaf.so \ + libawb.so \ + libcvi_bin_isp.so \ + libcvi_bin.so \ + libcvi_ive.so \ + libini.so \ + libisp_algo.so \ + libisp.so \ + libmipi_tx.so \ + libmisc.so \ + libraw_dump.so \ + libsys.so \ + libvdec.so \ + libvenc.so + +NANOKVM_SG200X_VPU_LIBS = \ + libosdc.so \ + libvpu.so \ + libgdc.so \ + librgn.so \ + libvi.so \ + libvo.so \ + libvpss.so + +NANOKVM_SG200X_UNUSED_LIBS = \ + libcli.so \ + libjson-c.so.5 \ + libcvi_ispd2.so \ + libaaccomm2.so \ + libaacdec2.so \ + libaacenc2.so \ + libaacsbrdec2.so \ + libaacsbrenc2.so \ + libcvi_RES1.so \ + libcvi_VoiceEngine.so \ + libcvi_audio.so \ + libcvi_ssp.so \ + libcvi_vqe.so \ + libdnvqe.so \ + libtinyalsa.so + +NANOKVM_SG200X_DUMMY_LIBS = \ + libae.so \ + libaf.so \ + libawb.so + +define NANOKVM_SG200X_EXTRACT_CMDS + $(UNZIP) -d $(@D) \ + $(NANOKVM_SG200X_DL_DIR)/$(NANOKVM_SG200X_SOURCE) + mv $(@D)/$(NANOKVM_SG200X_BASE) $(@D)/kvmapp + rm -f ${@D}/kvmapp/server/NanoKVM-Server + rm -rf ${@D}//kvmapp/server/web/ +endef + +define NANOKVM_SG200X_INSTALL_TARGET_CMDS + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_PKGDIR)/overlay/ $(TARGET_DIR)/ + if [ -e $(TARGET_DIR)/kvmapp/kvm_system/kvm_system ]; then \ + rm -f ${@D}/kvmapp/kvm_system/kvm_system ; \ + touch ${@D}/.maixcdk_kvm_system ; \ + else \ + rm -f ${@D}/.maixcdk_kvm_system ; \ + fi + mkdir -pv $(TARGET_DIR)/kvmapp/ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/kvmapp/ $(TARGET_DIR)/kvmapp/ + echo 0 > $(TARGET_DIR)/kvmapp/kvm/now_fps + echo 30 > $(TARGET_DIR)/kvmapp/kvm/fps + echo -n 80 > $(TARGET_DIR)/kvmapp/kvm/qlty + echo -n 720 > $(TARGET_DIR)/kvmapp/kvm/res + echo mjpeg > $(TARGET_DIR)/kvmapp/kvm/type + echo 0 > $(TARGET_DIR)/kvmapp/kvm/state + mkdir -pv $(TARGET_DIR)/kvmapp/kvm_system/ + if [ -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_KVM_SYSTEM) -a ! -e ${@D}/.maixcdk_kvm_system ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_KVM_SYSTEM) $(TARGET_DIR)/kvmapp/kvm_system/ ; \ + fi + mkdir -pv $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ + if [ -e $(TARGET_DIR)/kvmapp/server/dl_lib/libkvm_mmf.so -a -e ${@D}/.maixcdk_kvm_system ]; then \ + touch ${@D}/.maixcdk_kvm_mmf ; \ + elif [ -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_KVM_MMF) ]; then \ + rm -f ${@D}/.maixcdk_kvm_mmf ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_KVM_MMF) $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + elif [ -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_MAIXCAM_LIB) ]; then \ + rm -f ${@D}/.maixcdk_kvm_mmf ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_MAIXCAM_LIB) $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + fi + for l in $(NANOKVM_SG200X_REQUIRED_LIBS) ; do \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/$$l $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + done + for l in $(NANOKVM_SG200X_VPU_LIBS) ; do \ + if [ -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/$$l ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/$$l $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + fi ; \ + done + for l in $(NANOKVM_SG200X_UNUSED_LIBS) ; do \ + if [ -e $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ]; then \ + rm -f $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + ln -s libmisc.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + fi ; \ + done + if [ -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/libcvi_dummy.so ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/libcvi_dummy.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + for l in $(NANOKVM_SG200X_DUMMY_LIBS) ; do \ + rm -f $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + ln -s libcvi_dummy.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + done ; \ + fi + if [ -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/libcvi_bin_light.so -a \ + -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/libisp_light.so ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/libcvi_bin_light.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + for l in libcvi_bin.so ; do \ + rm -f $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + ln -s libcvi_bin_light.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + done ; \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/lib/libisp_light.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + for l in libcvi_bin_isp.so libisp.so ; do \ + rm -f $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + ln -s libisp_light.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + done ; \ + for l in libisp_algo.so ; do \ + rm -f $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + ln -s libmisc.so $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/$$l ; \ + done ; \ + fi + if [ -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_KVM_STREAM) ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_KVM_STREAM) $(TARGET_DIR)/kvmapp/kvm_system/ ; \ + fi + if [ -e $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/libmaixcam_lib.so -a \ + -e $(TARGET_DIR)/kvmapp/kvm_system/kvm_stream -a \ + ! -e $(TARGET_DIR)/kvmapp/kvm_stream ]; then \ + rm -rf $(TARGET_DIR)/kvmapp/jpg_stream/ ; \ + mkdir -pv $(TARGET_DIR)/kvmapp/kvm_stream/ ; \ + mv $(TARGET_DIR)/kvmapp/kvm_system/kvm_stream $(TARGET_DIR)/kvmapp/kvm_stream/ ; \ + mkdir -pv $(TARGET_DIR)/kvmapp/kvm_stream/dl_lib/ ; \ + rsync -avpPxH $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ $(TARGET_DIR)/kvmapp/kvm_stream/dl_lib/ ; \ + fi + if [ -e $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_KVM_VISION) -a \ + -e $(TARGET_DIR)/kvmapp/server/dl_lib/libkvm.so -a \ + ! -e ${@D}/.maixcdk_kvm_mmf ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(NANOKVM_SG200X_EXT_MIDDLEWARE)/$(NANOKVM_SG200X_EXT_KVM_VISION) $(TARGET_DIR)/kvmapp/server/dl_lib/ ; \ + chmod ugo+rx $(TARGET_DIR)/kvmapp/server/dl_lib/libkvm.so ; \ + fi + if [ -e $(TARGET_DIR)/kvmapp/server/dl_lib/libkvm.so ]; then \ + rm -rf $(TARGET_DIR)/kvmapp/kvm_stream/ ; \ + rm -rf $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + mkdir -pv $(TARGET_DIR)/kvmapp/kvm_system/dl_lib/ ; \ + fi + if [ ! -e ${@D}/.maixcdk_kvm_system ]; then \ + sed -i 's|# cp -r /kvmapp/server|cp -r /kvmapp/server|g' $(TARGET_DIR)/kvmapp/system/init.d/S95nanokvm ; \ + sed -i 's|# /tmp/server/NanoKVM-Server|/tmp/server/NanoKVM-Server|g' $(TARGET_DIR)/kvmapp/system/init.d/S95nanokvm ; \ + fi + rm -f $(TARGET_DIR)/kvmapp/system/ko/*.ko + if [ "X$(BR2_PACKAGE_TAILSCALE_RISCV64)" != "Xy" ]; then \ + rm -f $(TARGET_DIR)/kvmapp/system/init.d/S??tailscaled ; \ + fi + mkdir -pv $(TARGET_DIR)/etc/init.d/ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(TARGET_DIR)/kvmapp/system/init.d/ $(TARGET_DIR)/etc/init.d/ + if [ -e $(NANOKVM_SG200X_EXT_OVERLAY)/etc/init.d ]; then \ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links $(TARGET_DIR)/kvmapp/system/init.d/ $(NANOKVM_SG200X_EXT_OVERLAY)/etc/init.d/ ; \ + fi +endef + +$(eval $(generic-package)) diff --git a/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.LT b/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.LT new file mode 100644 index 0000000000..cfa56912f4 --- /dev/null +++ b/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.LT @@ -0,0 +1,34 @@ +[source] + +;type = SOURCE_USER_FE + +dev_num = 1 + +; section for sensor + +[sensor] + +; sensor name +name = LONTIUM_LT6911_2M_60FPS_8BIT + +bus_id = 4 + +sns_i2c_addr = ff + +mipi_dev = 0 + +lane_id = 2, 4, 3, 1, 0 + +pn_swap = 0, 0, 0, 0, 0 + +mclk_en = 0 + +mclk = 0 + +;port = 0 + +;pin = 2 + +;pol = 1 + +fps = 60 diff --git a/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.OA b/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.OA new file mode 100755 index 0000000000..e6299a2639 --- /dev/null +++ b/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.OA @@ -0,0 +1,34 @@ +[source] + +;type = SOURCE_USER_FE + +dev_num = 1 + +; section for sensor + +[sensor] + +; sensor name +name = OV_OS04A10_MIPI_4M_1440P_30FPS_12BIT + +bus_id = 4 + +sns_i2c_addr = 36 + +mipi_dev = 0 + +lane_id = 2, 1, 3, 0, 4 + +pn_swap = 0, 0, 0, 0, 0 + +mclk_en = 0 + +mclk = 0 + +;port = 0 + +;pin = 2 + +;pol = 1 + +;fps = 30 diff --git a/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.SC035 b/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.SC035 new file mode 100755 index 0000000000..bbcad58c4c --- /dev/null +++ b/buildroot/package/nanokvm-sg200x/overlay/mnt/data/sensor_cfg.ini.SC035 @@ -0,0 +1,34 @@ +[source] + +;type = SOURCE_USER_FE + +dev_num = 1 + +; section for sensor + +[sensor] + +; sensor name +name = SMS_SC035GS_MIPI_480P_120FPS_12BIT + +bus_id = 4 + +sns_i2c_addr = 30 + +mipi_dev = 0 + +lane_id = 4, 3, 2, -1, -1 + +pn_swap = 0, 0, 0, 0, 0 + +mclk_en = 1 + +mclk = 1 + +;port = 0 + +;pin = 2 + +;pol = 1 + +;fps = 30 diff --git a/buildroot/package/tailscale-riscv64/Config.in b/buildroot/package/tailscale-riscv64/Config.in new file mode 100644 index 0000000000..c4ea0ae5b4 --- /dev/null +++ b/buildroot/package/tailscale-riscv64/Config.in @@ -0,0 +1,5 @@ +config BR2_PACKAGE_TAILSCALE_RISCV64 + bool "tailscale-riscv64" + depends on BR2_PACKAGE_HOST_GO_TARGET_ARCH_SUPPORTS + help + tailscale for riscv64 diff --git a/buildroot/package/tailscale-riscv64/tailscale-riscv64.mk b/buildroot/package/tailscale-riscv64/tailscale-riscv64.mk new file mode 100644 index 0000000000..ea91ff79c0 --- /dev/null +++ b/buildroot/package/tailscale-riscv64/tailscale-riscv64.mk @@ -0,0 +1,37 @@ +################################################################################ +# +# tailscale-riscv64 +# +################################################################################ + +TAILSCALE_RISCV64_VERSION = 1.72.1 +TAILSCALE_RISCV64_COMMIT = f4a95663c +TAILSCALE_RISCV64_SITE = $(call github,tailscale,tailscale,v$(TAILSCALE_RISCV64_VERSION)) + +TAILSCALE_RISCV64_DEPENDENCIES = host-go + +GO_BIN = $(HOST_DIR)/bin/go + +TAILSCALE_RISCV64_GO_ENV = $(HOST_GO_CROSS_ENV) +TAILSCALE_RISCV64_TAGS = osusergo,netgo +TAILSCALE_RISCV64_LDFLAGS = -extldflags '-static' +TAILSCALE_RISCV64_LDFLAGS += -X tailscale.com/version.longStamp=$(TAILSCALE_RISCV64_VERSION)-t$(TAILSCALE_RISCV64_COMMIT) +TAILSCALE_RISCV64_LDFLAGS += -X tailscale.com/version.shortStamp=$(TAILSCALE_RISCV64_VERSION) + +TAILSCALE_RISCV64_BUILD_OPTS = -tags=$(TAILSCALE_RISCV64_TAGS) -ldflags="$(TAILSCALE_RISCV64_LDFLAGS)" + +define TAILSCALE_RISCV64_BUILD_CMDS + cd $(@D) ; \ + GOPROXY=direct $(TAILSCALE_RISCV64_GO_ENV) $(GO_BIN) build -v $(TAILSCALE_RISCV64_BUILD_OPTS) tailscale.com/cmd/tailscale + cd $(@D) ; \ + GOPROXY=direct $(TAILSCALE_RISCV64_GO_ENV) $(GO_BIN) build -v $(TAILSCALE_RISCV64_BUILD_OPTS) tailscale.com/cmd/tailscaled +endef + +define TAILSCALE_RISCV64_INSTALL_TARGET_CMDS + mkdir -pv $(TARGET_DIR)/usr/bin + mkdir -pv $(TARGET_DIR)/usr/sbin + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/tailscale $(TARGET_DIR)/usr/bin/ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/tailscaled $(TARGET_DIR)/usr/sbin/ +endef + +$(eval $(generic-package)) diff --git a/package/nanokvm-sg200x/0002-nanokvm-enable-lt_int.patch b/package/nanokvm-sg200x/0002-nanokvm-enable-lt_int.patch new file mode 100644 index 0000000000..1cea869951 --- /dev/null +++ b/package/nanokvm-sg200x/0002-nanokvm-enable-lt_int.patch @@ -0,0 +1,13 @@ +diff --git a/system/init.d/S15kvmhwd b/system/init.d/S15kvmhwd +index 0b414e6..2799cfa 100755 +--- a/kvmapp/system/init.d/S15kvmhwd ++++ b/kvmapp/system/init.d/S15kvmhwd +@@ -176,6 +176,8 @@ kvm_hw_detect(){ + + kvm_hw_init(){ + FIND_FILE="/etc/kvm/hw" ++ rmmod /mnt/system/ko/soph_mipi_rx.ko ++ insmod /mnt/system/ko/soph_mipi_rx.ko lt_int=1 + if [ `grep -c "alpha" $FIND_FILE` -ne '0' ] + then + echo "hw = alpha!"