From d00ed80464a14cf2fe090b7bc8da75b424711ecd Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:40:33 +0100 Subject: [PATCH 01/29] [no ci] Sigmastar: add ssc338q_fpvdev (#1634) --- .github/workflows/build.yml | 1 + .../configs/ssc338q_fpvdev_defconfig | 74 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 46f041e8..777561c4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -49,6 +49,7 @@ jobs: - {"platform": "ssc30kq", "release": "lite"} - {"platform": "ssc30kq", "release": "ultimate"} - {"platform": "ssc338q", "release": "fpv"} + - {"platform": "ssc338q", "release": "fpvdev"} - {"platform": "ssc338q", "release": "rubyfpv"} - {"platform": "ssc338q", "release": "lite"} - {"platform": "ssc338q", "release": "ultimate"} diff --git a/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig b/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig new file mode 100644 index 00000000..bbcfbf8a --- /dev/null +++ b/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig @@ -0,0 +1,74 @@ +# Architecture +BR2_arm=y +BR2_cortex_a7=y +BR2_ARM_FPU_NEON_VFPV4=y +BR2_ARM_INSTRUCTIONS_THUMB2=y + +# Toolchain +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y +BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y +BR2_TOOLCHAIN_EXTERNAL_URL="https://github.com/openipc/firmware/releases/download/$(OPENIPC_TOOLCHAIN).tgz" +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="arm-openipc-linux-gnueabihf" +BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y +# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set +BR2_TOOLCHAIN_EXTERNAL_CXX=y + +# Kernel +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_TARBALL=y +BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="https://github.com/openipc/linux/archive/$(OPENIPC_KERNEL).tar.gz" +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(EXTERNAL_VENDOR)/board/$(OPENIPC_SOC_FAMILY)/infinity6e-ssc012b.config" +BR2_LINUX_KERNEL_UIMAGE=y +BR2_LINUX_KERNEL_XZ=y + +# Filesystem +BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL)/package/busybox/busybox.config" +BR2_PACKAGE_EXFATPROGS=y +BR2_PACKAGE_UBOOT_TOOLS=y +BR2_PACKAGE_ZLIB=y +# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set +BR2_PACKAGE_WIRELESS_TOOLS=y +BR2_TARGET_ROOTFS_CPIO=y +BR2_TARGET_ROOTFS_SQUASHFS=y +BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y +BR2_TARGET_ROOTFS_UBI=y +BR2_TARGET_ROOTFS_UBI_SUBSIZE=2048 +BR2_TARGET_ROOTFS_UBI_USE_CUSTOM_CONFIG=y +BR2_TARGET_ROOTFS_UBI_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL)/scripts/ubifs/ubinize_sigmastar.cfg" +BR2_TARGET_ROOTFS_UBIFS_LEBSIZE=0x1f000 + +# OpenIPC +BR2_OPENIPC_SOC_VENDOR="sigmastar" +BR2_OPENIPC_SOC_MODEL="ssc338q" +BR2_OPENIPC_SOC_FAMILY="infinity6e" +BR2_OPENIPC_VARIANT="fpv" +BR2_OPENIPC_FLASH_SIZE="16" + +# Packages +BR2_PACKAGE_DROPBEAR_OPENIPC=y +BR2_PACKAGE_EXFAT_OPENIPC=y +BR2_PACKAGE_IPCTOOL=y +BR2_PACKAGE_JSONFILTER=y +BR2_PACKAGE_LIBCURL_OPENIPC=y +BR2_PACKAGE_LIBCURL_OPENIPC_CURL=y +# BR2_PACKAGE_LIBCURL_OPENIPC_PROXY_SUPPORT is not set +# BR2_PACKAGE_LIBCURL_OPENIPC_COOKIES_SUPPORT is not set +# BR2_PACKAGE_LIBCURL_OPENIPC_EXTRA_PROTOCOLS_FEATURES is not set +BR2_PACKAGE_LIBOGG_OPENIPC=y +BR2_PACKAGE_MAJESTIC_FONTS=y +BR2_PACKAGE_MAJESTIC_WEBUI=y +BR2_PACKAGE_MAJESTIC=y +BR2_PACKAGE_MAVFWD=y +BR2_PACKAGE_MBEDTLS_OPENIPC=y +BR2_PACKAGE_MSPOSD=y +BR2_PACKAGE_OPUS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y +BR2_PACKAGE_RTL88X2EU_OPENIPC=y +BR2_PACKAGE_RTL8812AU_OPENIPC=y +BR2_PACKAGE_SIGMASTAR_OSDRV_INFINITY6E=y +BR2_PACKAGE_VTUND_OPENIPC=y +BR2_PACKAGE_WIFIBROADCAST_NG=y +BR2_PACKAGE_YAML_CLI=y From e6dda80dc7851a93ae3c3542a2b7b30f9b1c4265 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:58:32 +0100 Subject: [PATCH 02/29] Sigmastar: update ssc338q_fpvdev_defconfig (#1635) --- br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig b/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig index bbcfbf8a..99aca27b 100644 --- a/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig +++ b/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig @@ -34,17 +34,12 @@ BR2_PACKAGE_WIRELESS_TOOLS=y BR2_TARGET_ROOTFS_CPIO=y BR2_TARGET_ROOTFS_SQUASHFS=y BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y -BR2_TARGET_ROOTFS_UBI=y -BR2_TARGET_ROOTFS_UBI_SUBSIZE=2048 -BR2_TARGET_ROOTFS_UBI_USE_CUSTOM_CONFIG=y -BR2_TARGET_ROOTFS_UBI_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL)/scripts/ubifs/ubinize_sigmastar.cfg" -BR2_TARGET_ROOTFS_UBIFS_LEBSIZE=0x1f000 # OpenIPC BR2_OPENIPC_SOC_VENDOR="sigmastar" BR2_OPENIPC_SOC_MODEL="ssc338q" BR2_OPENIPC_SOC_FAMILY="infinity6e" -BR2_OPENIPC_VARIANT="fpv" +BR2_OPENIPC_VARIANT="fpvdev" BR2_OPENIPC_FLASH_SIZE="16" # Packages From b8e4e975df960b645418f93f4b9a58d572a6be3d Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Wed, 11 Dec 2024 12:04:49 +0100 Subject: [PATCH 03/29] [no ci] Package: minor wifibroadcast-ng update (#1637) --- .../package/wifibroadcast-ng/files/tweaksys | 18 +++++++++++++ .../package/wifibroadcast-ng/files/wfb.conf | 4 +-- .../wifibroadcast-ng/files/wifibroadcast | 25 ++++++++++--------- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/general/package/wifibroadcast-ng/files/tweaksys b/general/package/wifibroadcast-ng/files/tweaksys index f35859cc..e3669d0d 100755 --- a/general/package/wifibroadcast-ng/files/tweaksys +++ b/general/package/wifibroadcast-ng/files/tweaksys @@ -6,6 +6,14 @@ finish() { reboot } +goke() { + cli -s .isp.slowShutter disabled + cli -s .video0.codec h265 + cli -s .video0.size 1920x1080 + cli -s .video0.fps 30 + cli -s .video0.rcMode cbr +} + sigmastar() { cli -s .isp.sensorConfig /etc/sensors/imx415_fpv.bin cli -s .isp.exposure 5 @@ -13,14 +21,24 @@ sigmastar() { cli -s .video0.size 1920x1080 cli -s .video0.fps 90 cli -s .video0.rcMode cbr +} + +common() { cli -s .jpeg.enabled false cli -s .outgoing.enabled true cli -s .outgoing.server udp://0.0.0.0:5600 } case "$1" in + gk7205v300) + goke + common + finish + ;; + ssc33x) sigmastar + common finish ;; diff --git a/general/package/wifibroadcast-ng/files/wfb.conf b/general/package/wifibroadcast-ng/files/wfb.conf index a160e8ff..71fa4735 100644 --- a/general/package/wifibroadcast-ng/files/wfb.conf +++ b/general/package/wifibroadcast-ng/files/wfb.conf @@ -3,7 +3,6 @@ wlan=wlan0 region=00 channel=161 txpower=1 -driver_txpower_override=1 bandwidth=20 stbc=0 ldpc=0 @@ -15,10 +14,9 @@ fec_k=8 fec_n=12 # Telemetry -router=2 +router=msposd serial=/dev/ttyS2 baud=115200 channels=8 -fps=20 port_rx=14551 port_tx=14555 diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index ceaf2ce1..62d3ff6c 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -1,9 +1,10 @@ #!/bin/sh wfb_soc=$(ipcinfo -c) wfb_key=/etc/drone.key +wfb_cfg=/etc/wfb.conf -if [ -e /etc/wfb.conf ]; then - . /etc/wfb.conf +if [ -e "$wfb_cfg" ]; then + . "$wfb_cfg" else echo "Configuration file not found" exit 1 @@ -14,7 +15,7 @@ load_modules() { case "$card" in "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") driver="88XXau" - modprobe 88XXau rtw_tx_pwr_idx_override="$driver_txpower_override" + modprobe 88XXau rtw_tx_pwr_idx_override="$txpower" ;; "0bda:a81a") @@ -22,7 +23,7 @@ load_modules() { modprobe 8812eu rtw_regd_src=1 rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0 ;; - "0bda:f72b") + "0bda:f72b" | "0bda:b733") driver="8733bu" modprobe 8733bu rtw_regd_src=1 rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0 ;; @@ -42,7 +43,7 @@ load_interface() { iwconfig "$wlan" mode monitor if [ "$driver" = "8812eu" ] || [ "$driver" = "8733bu" ]; then - iw dev "$wlan" set txpower fixed $((driver_txpower_override * 50)) + iw dev "$wlan" set txpower fixed $((txpower * 50)) fi iw reg set "$region" @@ -70,14 +71,14 @@ start_telemetry() { devmem 0x1F207890 16 0x8 fi - if [ "$router" -eq 2 ]; then - echo "Starting msposd" + if [ "$router" = "msposd" ]; then + echo "Starting $router" msposd --master "$serial" --baudrate "$baud" --channels "$channels" \ - -osd -r "$fps" --ahi 0 --out 10.5.0.1:"$port_tx" > /dev/null & - else - echo "Starting mavfwd" - mavfwd --master "$serial" --baudrate "$baud" --channels "$channels" -p 100 -t \ - -a 15 --in 0.0.0.0:"$port_rx" --out 10.5.0.1:"$port_tx" > /dev/null & + -osd -r 20 --ahi 0 --out 10.5.0.1:"$port_tx" > /dev/null & + elif [ "$router" = "mavfwd" ]; then + echo "Starting $router" + mavfwd --master "$serial" --baudrate "$baud" --channels "$channels" -p 100 \ + -t -a 15 --in 0.0.0.0:"$port_rx" --out 10.5.0.1:"$port_tx" > /dev/null & fi } From c9aeec56338371862638f8f2d196bcb9255426e8 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:33:45 +0100 Subject: [PATCH 04/29] [no ci] Package: update wifibroadcast-ng (#1638) --- general/package/mavfwd/Config.in | 5 +---- general/package/mavlink-router/Config.in | 1 - general/package/wifibroadcast-ng/Config.in | 1 + general/package/wifibroadcast-ng/files/wifibroadcast | 9 ++++----- general/package/wifibroadcast-ng/wifibroadcast-ng.mk | 7 +++++-- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/general/package/mavfwd/Config.in b/general/package/mavfwd/Config.in index d29ca286..5185126c 100644 --- a/general/package/mavfwd/Config.in +++ b/general/package/mavfwd/Config.in @@ -1,9 +1,6 @@ config BR2_PACKAGE_MAVFWD bool "mavfwd" - default n - select BR2_PACKAGE_LIBEVENT_OPENIPC - select BR2_PACKAGE_DATALINK help - mavfwd - Cool and awesome mavlink forwader for FPV + Simple mavlink forwarder. https://github.com/OpenIPC/mavfwd diff --git a/general/package/mavlink-router/Config.in b/general/package/mavlink-router/Config.in index 01810db4..666743fd 100644 --- a/general/package/mavlink-router/Config.in +++ b/general/package/mavlink-router/Config.in @@ -1,6 +1,5 @@ config BR2_PACKAGE_MAVLINK_ROUTER bool "mavlink-router" - select BR2_PACKAGE_DATALINK help MAVLink Router is an application to distribute MAVLink messages between multiple endpoints (connections). It distributes packets to a single port or multiple endpoints depending on the target address. Connections can be made via UART, UDP or TCP. diff --git a/general/package/wifibroadcast-ng/Config.in b/general/package/wifibroadcast-ng/Config.in index 32fe231a..45211e16 100644 --- a/general/package/wifibroadcast-ng/Config.in +++ b/general/package/wifibroadcast-ng/Config.in @@ -1,5 +1,6 @@ config BR2_PACKAGE_WIFIBROADCAST_NG bool "wifibroadcast-ng" + select BR2_PACKAGE_IW help Long-range packet radio link based on raw WiFi radio. https://github.com/svpcom/wfb-ng diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 62d3ff6c..30eb40ad 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -40,14 +40,13 @@ load_modules() { load_interface() { ifconfig "$wlan" up - iwconfig "$wlan" mode monitor + iw "$wlan" set type monitor + iw "$wlan" set channel "$channel" + iw reg set "$region" if [ "$driver" = "8812eu" ] || [ "$driver" = "8733bu" ]; then - iw dev "$wlan" set txpower fixed $((txpower * 50)) + iw "$wlan" set txpower fixed $((txpower * 50)) fi - - iw reg set "$region" - iwconfig "$wlan" channel "$channel" } start_wfb() { diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index b6e32a77..6d18bcf3 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -4,11 +4,11 @@ # ################################################################################ -WIFIBROADCAST_NG_VERSION = 3a053040442174e6c1ce76866c6da4b12c19dbb4 +WIFIBROADCAST_NG_VERSION = 7dbdf92919cfccffa5ff46b0b8294e243f5f5a37 WIFIBROADCAST_NG_SITE = $(call github,svpcom,wfb-ng,$(WIFIBROADCAST_NG_VERSION)) WIFIBROADCAST_NG_LICENSE = GPL-3.0 -WIFIBROADCAST_NG_DEPENDENCIES += libpcap libsodium iw +WIFIBROADCAST_NG_DEPENDENCIES += libpcap libsodium define WIFIBROADCAST_NG_BUILD_CMDS $(MAKE) CC=$(TARGET_CC) CXX=$(TARGET_CXX) LDFLAGS=-s -C $(@D) all_bin @@ -19,6 +19,9 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/drone.key $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/wfb.conf + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_NG_PKGDIR)/files/S98wifibroadcast + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_rx $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tx From 9fd6bdf23104142b198166d0c8f830aabf009745 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:37:12 +0100 Subject: [PATCH 05/29] [no ci] Package: update wifibroadcast-ng --- general/package/wifibroadcast-ng/wifibroadcast-ng.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index 6d18bcf3..5d66c7fb 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -27,6 +27,7 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tx $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tun $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/wifibroadcast + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/tweaksys endef $(eval $(generic-package)) From c32402293d7e8bbc7f49e3f159f93bfe3a91bc1a Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Thu, 12 Dec 2024 18:20:25 +0100 Subject: [PATCH 06/29] [no ci] Package: add wifibroadcast-ng bandwidth setting (#1639) --- .../package/wifibroadcast-ng/files/wfb.conf | 14 +--- .../wifibroadcast-ng/files/wifibroadcast | 67 ++++++++++++++----- 2 files changed, 52 insertions(+), 29 deletions(-) diff --git a/general/package/wifibroadcast-ng/files/wfb.conf b/general/package/wifibroadcast-ng/files/wfb.conf index 71fa4735..fd5c1a21 100644 --- a/general/package/wifibroadcast-ng/files/wfb.conf +++ b/general/package/wifibroadcast-ng/files/wfb.conf @@ -1,22 +1,10 @@ # Broadcast -wlan=wlan0 +txpower=1 region=00 channel=161 -txpower=1 bandwidth=20 -stbc=0 -ldpc=0 mcs_index=1 -stream=0 -link_id=7669206 -rcv_buf=456000 -fec_k=8 -fec_n=12 # Telemetry router=msposd serial=/dev/ttyS2 -baud=115200 -channels=8 -port_rx=14551 -port_tx=14555 diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 30eb40ad..82bc8ca6 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -3,29 +3,50 @@ wfb_soc=$(ipcinfo -c) wfb_key=/etc/drone.key wfb_cfg=/etc/wfb.conf +# Default broadcast +wlan=wlan0 +txpower=1 +region=00 +channel=161 +bandwidth=20 +mcs_index=1 +stream=0 +stbc=0 +ldpc=0 +fec_k=8 +fec_n=12 +link_id=7669206 + +# Default telemetry +router=msposd +serial=/dev/ttyS2 +baud=115200 +mav_chn=8 +osd_fps=20 +port_rx=14551 +port_tx=14555 + +# Custom configuration if [ -e "$wfb_cfg" ]; then . "$wfb_cfg" -else - echo "Configuration file not found" - exit 1 fi load_modules() { for card in $(lsusb | awk '{print $6}' | sort | uniq); do case "$card" in "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") - driver="88XXau" - modprobe 88XXau rtw_tx_pwr_idx_override="$txpower" + driver=88XXau + modprobe "$driver" rtw_tx_pwr_idx_override="$txpower" ;; "0bda:a81a") - driver="8812eu" - modprobe 8812eu rtw_regd_src=1 rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0 + driver=8812eu + modprobe "$driver" rtw_regd_src=1 rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0 ;; "0bda:f72b" | "0bda:b733") - driver="8733bu" - modprobe 8733bu rtw_regd_src=1 rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0 + driver=8733bu + modprobe "$driver" rtw_regd_src=1 rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0 ;; esac done @@ -41,17 +62,30 @@ load_modules() { load_interface() { ifconfig "$wlan" up iw "$wlan" set type monitor - iw "$wlan" set channel "$channel" - iw reg set "$region" if [ "$driver" = "8812eu" ] || [ "$driver" = "8733bu" ]; then iw "$wlan" set txpower fixed $((txpower * 50)) fi + + case "$bandwidth" in + "20") + iw_mode=HT20 + ;; + "40") + iw_mode=HT40+ + ;; + "80") + iw_mode=80MHz + ;; + esac + + iw "$wlan" set channel "$channel" "$iw_mode" + iw reg set "$region" } start_wfb() { echo "Starting wfb_tx" - wfb_tx -p "$stream" -R "$rcv_buf" -K "$wfb_key" -B "$bandwidth" -M "$mcs_index" -C 8000 \ + wfb_tx -K "$wfb_key" -M "$mcs_index" -p "$stream" -B "$bandwidth" -C 8000 \ -S "$stbc" -L "$ldpc" -k "$fec_k" -n "$fec_n" -i "$link_id" "$wlan" &> /dev/null & } @@ -72,12 +106,12 @@ start_telemetry() { if [ "$router" = "msposd" ]; then echo "Starting $router" - msposd --master "$serial" --baudrate "$baud" --channels "$channels" \ - -osd -r 20 --ahi 0 --out 10.5.0.1:"$port_tx" > /dev/null & + msposd --master "$serial" --baudrate "$baud" -osd --ahi 0 -r "$osd_fps" \ + --channels "$mav_chn" --out 10.5.0.1:"$port_tx" > /dev/null & elif [ "$router" = "mavfwd" ]; then echo "Starting $router" - mavfwd --master "$serial" --baudrate "$baud" --channels "$channels" -p 100 \ - -t -a 15 --in 0.0.0.0:"$port_rx" --out 10.5.0.1:"$port_tx" > /dev/null & + mavfwd --master "$serial" --baudrate "$baud" -p 100 -a 15 -t \ + --channels "$mav_chn" --in 0.0.0.0:"$port_rx" --out 10.5.0.1:"$port_tx" > /dev/null & fi } @@ -86,6 +120,7 @@ case "$1" in if [ ! -e /etc/system.ok ]; then echo "Preparing system tweaks for $wfb_soc..." tweaksys "$wfb_soc" + exit 0 fi load_modules From 7ea9b831bcb77f1e5242506a52a569208b9d2223 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:40:22 +0100 Subject: [PATCH 07/29] [no ci] rubyfpv: formatting and restore local tweaksys --- general/package/rubyfpv/Config.in | 3 +- general/package/rubyfpv/files/S73ruby | 35 ++--- general/package/rubyfpv/files/tweaksys | 187 +++++++++++++++++++++++++ general/package/rubyfpv/rubyfpv.mk | 27 ++-- 4 files changed, 224 insertions(+), 28 deletions(-) create mode 100755 general/package/rubyfpv/files/tweaksys diff --git a/general/package/rubyfpv/Config.in b/general/package/rubyfpv/Config.in index c029c1ba..963e8a6c 100644 --- a/general/package/rubyfpv/Config.in +++ b/general/package/rubyfpv/Config.in @@ -1,7 +1,6 @@ config BR2_PACKAGE_RUBYFPV bool "rubyfpv" - select BR2_PACKAGE_IW - default n + select BR2_PACKAGE_IW help Ruby package diff --git a/general/package/rubyfpv/files/S73ruby b/general/package/rubyfpv/files/S73ruby index 55a0e194..def3f133 100755 --- a/general/package/rubyfpv/files/S73ruby +++ b/general/package/rubyfpv/files/S73ruby @@ -6,24 +6,27 @@ chip=$(ipcinfo -c) fw=$(grep "BUILD_OPTION" "/etc/os-release" | cut -d= -f2) echo "Chip: " > /tmp/ruby_boot.log -echo ${chip} >> /tmp/ruby_boot.log +echo "$chip" >> /tmp/ruby_boot.log echo "Firmware: " >> /tmp/ruby_boot.log -echo ${fw} >> /tmp/ruby_boot.log +echo "$fw" >> /tmp/ruby_boot.log case "$1" in - start) - if ! [ -f /etc/system.ok ]; then - tweaksys ${chip} - fi + start) + if [ ! -f /etc/system.ok ]; then + tweaksys "$chip" + exit 0 + fi + echo "Starting Ruby..." >> /tmp/ruby_boot.log + /usr/sbin/ruby_start & + ;; - echo "Starting Ruby..." >> /tmp/ruby_boot.log - /usr/sbin/ruby_start & - ;; - stop) - echo "Stopping Ruby..." >> /tmp/ruby_boot.log - /usr/sbin/ruby_stop.sh - ;; - *) - echo "Usage: $0 {start|stop}" - exit 1 + stop) + echo "Stopping Ruby..." >> /tmp/ruby_boot.log + /usr/sbin/ruby_stop.sh + ;; + + *) + echo "Usage: $0 {start|stop}" + exit 1 + ;; esac diff --git a/general/package/rubyfpv/files/tweaksys b/general/package/rubyfpv/files/tweaksys new file mode 100755 index 00000000..fd6ecf83 --- /dev/null +++ b/general/package/rubyfpv/files/tweaksys @@ -0,0 +1,187 @@ +#!/bin/sh +chip=$(ipcinfo -c) +family=$(ipcinfo -f) +vendor=$(ipcinfo -v) + +if [ ! "$chip" = "hi3536dv100" ]; then + sensor=$(ipcinfo -s) +fi + +basic() { + # set boot delay + fw_setenv bootdelay 0 + + # free uart for telemetry + sed -i "s!console::respawn:/sbin/getty -L console 0 vt100 # GENERIC_SERIAL!#console::respawn:/sbin/getty -L console 0 vt100 # GENERIC_SERIAL!g" /etc/inittab + + # tune socket buffer + echo "net.core.rmem_default=512000" >> /etc/sysctl.conf +} + +prefix=${family} + +hisi_goke() { + if [ "$vendor" = "hisilicon" ]; then + prefix="open" + fi + + # remove unneeded modules + sed -i "s!insmod ${prefix}_rgn.ko!#insmod ${prefix}_rgn.ko!g" "/usr/bin/load_${vendor}" + sed -i "s!insmod ${prefix}_jpege.ko!#insmod ${prefix}_jpege.ko!g" "/usr/bin/load_${vendor}" + sed -i "s!insmod ${prefix}_ive.ko save_power=0!#insmod ${prefix}_ive.ko save_power=0!g" "/usr/bin/load_${vendor}" + sed -i "s!insmod ${prefix}_aio.ko!#insmod ${prefix}_aio.ko!g" "/usr/bin/load_${vendor}" + sed -i "s!insmod ${prefix}_ai.ko!#insmod ${prefix}_ai.ko!g" "/usr/bin/load_${vendor}" + sed -i "s!insmod ${prefix}_ao.ko!#insmod ${prefix}_ao.ko!g" "/usr/bin/load_${vendor}" + sed -i "s!insmod ${prefix}_aenc.ko!#insmod ${prefix}_aenc.ko!g" "/usr/bin/load_${vendor}" + sed -i "s!insmod ${prefix}_adec.ko!#insmod ${prefix}_adec.ko!g" "/usr/bin/load_${vendor}" + sed -i "s!insmod ${prefix}_acodec.ko!#insmod ${prefix}_acodec.ko!g" "/usr/bin/load_${vendor}" + + # change fps 25 -> 30 + sed -i "s!Isp_FrameRate=25!Isp_FrameRate=30!g" /etc/sensors/imx307_i2c_2l_1080p.ini + sed -i "s!Isp_FrameRate=25!Isp_FrameRate=30!g" /etc/sensors/smtsec_imx307_i2c_4l_1080p.ini + sed -i "s!Isp_FrameRate=25!Isp_FrameRate=30!g" /etc/sensors/imx335_i2c_4M.ini +} + +sigmastar() { + sed -i "s!serial=/dev/ttyAMA0!serial=/dev/ttyS0!g" /etc/telemetry.conf + sed -i "s!Device = /dev/ttyAMA0!Device = /dev/ttyS0!g" /etc/mavlink.conf +} + +majestic_generic() { + # digital image stabilization + #cli -s .isp.dis true + + cli -s .isp.slowShutter disabled + cli -s .image.contrast 50 + cli -s .image.luminance 50 + cli -s .video0.size 1920x1080 + cli -s .video0.fps 30 + cli -s .video0.bitrate 5120 + cli -s .video0.codec h264 + cli -s .video0.rcMode cbr + cli -s .video0.gopSize 1.5 + + # lowdelay support only imx307 sensor + if [ "$sensor" = "imx307" ]; then + cli -s .isp.lowDelay true + #cli -s .video0.sliceUnits 4 + fi + + if [ "$sensor" = "imx335" ]; then + cli -s .isp.drc 350 + cli -s .isp.sensorConfig /etc/sensors/imx335_i2c_4M.ini + fi + + cli -s .hls.enabled false + cli -s .netip.enabled false + cli -s .jpeg.enabled false +} + +majestic_sigmastar() { + cli -s .isp.sensorConfig /etc/sensors/imx415_fpv.bin + cli -s .isp.exposure 10 + cli -s .video0.codec h265 + cli -s .video0.size 1920x1080 + cli -s .video0.fps 60 + cli -s .video0.rcMode cbr + cli -s .jpeg.enabled false +} + +streamer() { + if [ -f /usr/bin/majestic ]; then + if [ "$vendor" = "sigmastar" ]; then + majestic_sigmastar + else + majestic_generic + fi + + # outgoing rtp stream + cli -s .outgoing.enabled true + cli -s .outgoing.server udp://127.0.0.1:5600 + fi + + if [ -f /usr/bin/venc ]; then + if [ "$sensor" = "imx335" ]; then + sed -i "s!version=200_imx307B!version=300_imx335B!g" /etc/venc.conf + sed -i "s!size=720p!size=1292x972!g" /etc/venc.conf + fi + fi +} + +finish() { + # complete tweaks and add flag + fw_setenv wlandev + touch /etc/system.ok + echo "Restart system to apply fpv changes..." + reboot +} + +case "$1" in + gk7205v200 | gk7205v210 | hi3516ev200) + echo "Preparing system tweaks for ${chip}..." + + # set custom config + if [ "$chip" = "gk7205v200" ] && [ "$sensor" = "imx307" ]; then + echo "switch to custom sensor config" + #cli -s .isp.sensorConfig /etc/sensors/60fps/720p_imx307_i2c_2l.ini + fi + + # fix osmem in bootargs + bootargs=$(fw_printenv -n bootargs) + if echo "$bootargs" | grep -q "32M"; then + newbootargs="mem=\${osmem} "$(echo "$bootargs" | cut -d " " -f2-) + fw_setenv bootargs "$newbootargs" + fw_setenv osmem 40M + fi + + # remove unneeded scripts + rm -f /etc/init.d/S60crond /etc/init.d/S49ntpd /etc/init.d/S02klogd + + basic + hisi_goke + streamer + finish + ;; + + gk7205v300 | hi3516ev300) + echo "Preparing system tweaks for $chip..." + + # increase osmem + mem=$(fw_printenv -n osmem) && [ "$mem" = "32M" ] && fw_setenv osmem 64M && set_allocator cma || echo "Memory allocated for the system:" "$mem" + + # set sensor config for smtsec board + if [ "$chip" = "gk7205v300" ] && [ "$sensor" = "imx307" ]; then + cli -s .isp.sensorConfig /etc/sensors/smtsec_imx307_i2c_4l_1080p.ini + fi + + basic + hisi_goke + streamer + finish + ;; + + t31l | t31n | t31x | t31zx) + echo "Preparing system tweaks for $chip..." + basic + streamer + finish + ;; + + hi3536dv100) + echo "Preparing system tweaks for $chip..." + finish + ;; + + ssc33x) + echo "Preparing system tweaks for $chip..." + basic + sigmastar + streamer + finish + ;; + + *) + echo "Usage: $0 {gk7205v200|gk7205v210|gk7205v300|hi3516ev200|hi3516ev300|t31l|t31n|t31x|t31zx|hi3536dv100|ssc33x}" + exit 1 + ;; +esac diff --git a/general/package/rubyfpv/rubyfpv.mk b/general/package/rubyfpv/rubyfpv.mk index e85d2e82..4c533f0c 100644 --- a/general/package/rubyfpv/rubyfpv.mk +++ b/general/package/rubyfpv/rubyfpv.mk @@ -1,3 +1,9 @@ +################################################################################ +# +# rubyfpv +# +################################################################################ + RUBYFPV_SITE_METHOD = git RUBYFPV_SITE = https://github.com/PetruSoroaga/RubyFPV RUBYFPV_VERSION = 5ec137401ec338c9273e48a7cb9402d96010b9dd @@ -5,8 +11,8 @@ RUBYFPV_VERSION = 5ec137401ec338c9273e48a7cb9402d96010b9dd RUBYFPV_DEPENDENCIES += libpcap iw RUBYFPV_MAKE_OPTS = \ - CC="$(TARGET_CC)" \ - CXX="$(TARGET_CXX)" + CC="$(TARGET_CC)" \ + CXX="$(TARGET_CXX)" define RUBYFPV_BUILD_CMDS $(MAKE) $(RUBYFPV_MAKE_OPTS) -C $(@D) vehicle RUBY_BUILD_ENV=openipc @@ -16,6 +22,15 @@ define RUBYFPV_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(RUBYFPV_PKGDIR)/files/S73ruby + $(INSTALL) -m 755 -d $(TARGET_DIR)/root/ruby/licenses + $(INSTALL) -m 644 -t $(TARGET_DIR)/root/ruby/licenses $(@D)/licenses/* + + $(INSTALL) -m 755 -d $(TARGET_DIR)/lib/firmware/ath9k_htc + $(INSTALL) -m 644 -t $(TARGET_DIR)/lib/firmware/ath9k_htc $(RUBYFPV_PKGDIR)/files/htc_9271.fw.3 + + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(RUBYFPV_PKGDIR)/files/tweaksys + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/sbin $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/sbin $(@D)/ruby_start $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/sbin $(@D)/ruby_logger @@ -23,14 +38,6 @@ define RUBYFPV_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/sbin $(@D)/ruby_tx_telemetry $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/sbin $(RUBYFPV_PKGDIR)/files/ruby_stop.sh $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/sbin $(RUBYFPV_PKGDIR)/files/version_ruby_base.txt - - $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin - $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(DATALINK_PKGDIR)/files/tweaksys - - $(INSTALL) -m 755 -d $(TARGET_DIR)/root/ruby/licenses - $(INSTALL) -m 644 -t $(TARGET_DIR)/root/ruby/licenses $(@D)/licenses/* - $(INSTALL) -m 755 -d $(TARGET_DIR)/lib/firmware/ath9k_htc - cp $(RUBYFPV_PKGDIR)/files/htc_9271.fw.3 $(TARGET_DIR)/lib/firmware/ath9k_htc endef $(eval $(generic-package)) From 10299bb5cc7ae724af3bbb7ef3364ad000886f12 Mon Sep 17 00:00:00 2001 From: snokvist Date: Sat, 14 Dec 2024 15:18:56 +0100 Subject: [PATCH 08/29] Update wifibroadcast (#1640) --- .../wifibroadcast-ng/files/wifibroadcast | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 82bc8ca6..5b31e004 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -10,12 +10,16 @@ region=00 channel=161 bandwidth=20 mcs_index=1 +telemetry_mcs_index=1 stream=0 stbc=0 ldpc=0 fec_k=8 fec_n=12 link_id=7669206 +bandwidth_iw_mode_20=HT20 +bandwidth_iw_mode_40=HT40+ +bandwidth_iw_mode_80=80Mhz # Default telemetry router=msposd @@ -60,27 +64,30 @@ load_modules() { } load_interface() { + iw dev "$wlan" set monitor none + iwconfig "$wlan" mode monitor ifconfig "$wlan" up - iw "$wlan" set type monitor - - if [ "$driver" = "8812eu" ] || [ "$driver" = "8733bu" ]; then - iw "$wlan" set txpower fixed $((txpower * 50)) - fi + #iw "$wlan" set type monitor case "$bandwidth" in "20") - iw_mode=HT20 + iw_mode="$bandwidth_iw_mode_20" ;; "40") - iw_mode=HT40+ + iw_mode="$bandwidth_iw_mode_40" ;; "80") - iw_mode=80MHz + iw_mode="$bandwidth_iw_mode_80" ;; esac iw "$wlan" set channel "$channel" "$iw_mode" iw reg set "$region" + + if [ "$driver" = "8812eu" ] || [ "$driver" = "8733bu" ]; then + iw "$wlan" set txpower fixed $((txpower * 50)) + fi + } start_wfb() { @@ -92,7 +99,7 @@ start_wfb() { start_tunnel() { echo "Starting wfb_tun" wfb_rx -p 160 -u 5800 -K "$wfb_key" -i "$link_id" "$wlan" &> /dev/null & - wfb_tx -p 32 -u 5801 -K "$wfb_key" -M "$mcs_index" -S "$stbc" -L "$ldpc" \ + wfb_tx -p 32 -u 5801 -K "$wfb_key" -M "$telemetry_mcs_index" -S "$stbc" -L "$ldpc" \ -k "$fec_k" -n "$fec_n" -i "$link_id" "$wlan" &> /dev/null & wfb_tun -a 10.5.0.10/24 > /dev/null & } From 99cc8f6d919d6be1cdaba874c2b438f0b8b03b15 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Sun, 15 Dec 2024 21:40:02 +0100 Subject: [PATCH 09/29] [no ci] Package: update wifibroadcast-ng settings (#1642) --- .../configs/ssc338q_fpvdev_defconfig | 2 +- .../rtl8733bu-openipc/rtl8733bu-openipc.mk | 2 +- .../package/wifibroadcast-ng/files/wfb.conf | 4 +- .../wifibroadcast-ng/files/wifibroadcast | 64 +++++++++---------- .../wifibroadcast-ng/wifibroadcast-ng.mk | 1 + 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig b/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig index 99aca27b..754119b7 100644 --- a/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig +++ b/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig @@ -61,7 +61,7 @@ BR2_PACKAGE_MBEDTLS_OPENIPC=y BR2_PACKAGE_MSPOSD=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y -BR2_PACKAGE_RTL88X2EU_OPENIPC=y +BR2_PACKAGE_RTL8733BU_OPENIPC=y BR2_PACKAGE_RTL8812AU_OPENIPC=y BR2_PACKAGE_SIGMASTAR_OSDRV_INFINITY6E=y BR2_PACKAGE_VTUND_OPENIPC=y diff --git a/general/package/rtl8733bu-openipc/rtl8733bu-openipc.mk b/general/package/rtl8733bu-openipc/rtl8733bu-openipc.mk index ce8134fb..fca2082f 100644 --- a/general/package/rtl8733bu-openipc/rtl8733bu-openipc.mk +++ b/general/package/rtl8733bu-openipc/rtl8733bu-openipc.mk @@ -5,7 +5,7 @@ ################################################################################ RTL8733BU_OPENIPC_SITE = $(call github,openipc,realtek-wlan,$(RTL8733BU_OPENIPC_VERSION)) -ifeq ($(OPENIPC_VARIANT),fpv) +ifneq ($(findstring fpv,$(OPENIPC_VARIANT)),) RTL8733BU_OPENIPC_VERSION = rtl8733bu_fpv else RTL8733BU_OPENIPC_VERSION = rtl8733bu diff --git a/general/package/wifibroadcast-ng/files/wfb.conf b/general/package/wifibroadcast-ng/files/wfb.conf index fd5c1a21..8a543bbc 100644 --- a/general/package/wifibroadcast-ng/files/wfb.conf +++ b/general/package/wifibroadcast-ng/files/wfb.conf @@ -2,8 +2,8 @@ txpower=1 region=00 channel=161 -bandwidth=20 -mcs_index=1 +mode=HT20 +index=1 # Telemetry router=msposd diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 5b31e004..05d64cca 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -8,20 +8,17 @@ wlan=wlan0 txpower=1 region=00 channel=161 -bandwidth=20 -mcs_index=1 -telemetry_mcs_index=1 +mode=HT20 +index=1 stream=0 stbc=0 ldpc=0 fec_k=8 fec_n=12 link_id=7669206 -bandwidth_iw_mode_20=HT20 -bandwidth_iw_mode_40=HT40+ -bandwidth_iw_mode_80=80Mhz # Default telemetry +tun_idx=1 router=msposd serial=/dev/ttyS2 baud=115200 @@ -56,50 +53,50 @@ load_modules() { done if [ -z "$driver" ]; then - echo "Wireless module not detected, check the usb connection" + echo "- Wireless module not detected!" exit 1 else - echo "Detected driver: $driver" + echo "- Detected driver: $driver" + fi + + if ! ifconfig "$wlan" up; then + echo "- Wireless driver not found!" + exit 1 fi } load_interface() { - iw dev "$wlan" set monitor none - iwconfig "$wlan" mode monitor - ifconfig "$wlan" up - #iw "$wlan" set type monitor - - case "$bandwidth" in - "20") - iw_mode="$bandwidth_iw_mode_20" - ;; - "40") - iw_mode="$bandwidth_iw_mode_40" - ;; - "80") - iw_mode="$bandwidth_iw_mode_80" - ;; - esac - - iw "$wlan" set channel "$channel" "$iw_mode" + iw "$wlan" set monitor none + iw "$wlan" set channel "$channel" "$mode" iw reg set "$region" if [ "$driver" = "8812eu" ] || [ "$driver" = "8733bu" ]; then iw "$wlan" set txpower fixed $((txpower * 50)) fi + case "$mode" in + "HT20") + bandwidth=20 + ;; + "HT40+" | "HT40-") + bandwidth=40 + ;; + "80Mhz") + bandwidth=80 + ;; + esac } start_wfb() { - echo "Starting wfb_tx" - wfb_tx -K "$wfb_key" -M "$mcs_index" -p "$stream" -B "$bandwidth" -C 8000 \ + echo "- Starting wfb_tx" + wfb_tx -K "$wfb_key" -M "$index" -p "$stream" -B "$bandwidth" -C 8000 \ -S "$stbc" -L "$ldpc" -k "$fec_k" -n "$fec_n" -i "$link_id" "$wlan" &> /dev/null & } start_tunnel() { - echo "Starting wfb_tun" + echo "- Starting wfb_tun" wfb_rx -p 160 -u 5800 -K "$wfb_key" -i "$link_id" "$wlan" &> /dev/null & - wfb_tx -p 32 -u 5801 -K "$wfb_key" -M "$telemetry_mcs_index" -S "$stbc" -L "$ldpc" \ + wfb_tx -p 32 -u 5801 -K "$wfb_key" -M "$tun_idx" -S "$stbc" -L "$ldpc" \ -k "$fec_k" -n "$fec_n" -i "$link_id" "$wlan" &> /dev/null & wfb_tun -a 10.5.0.10/24 > /dev/null & } @@ -112,11 +109,11 @@ start_telemetry() { fi if [ "$router" = "msposd" ]; then - echo "Starting $router" + echo "- Starting $router" msposd --master "$serial" --baudrate "$baud" -osd --ahi 0 -r "$osd_fps" \ --channels "$mav_chn" --out 10.5.0.1:"$port_tx" > /dev/null & elif [ "$router" = "mavfwd" ]; then - echo "Starting $router" + echo "- Starting $router" mavfwd --master "$serial" --baudrate "$baud" -p 100 -a 15 -t \ --channels "$mav_chn" --in 0.0.0.0:"$port_rx" --out 10.5.0.1:"$port_tx" > /dev/null & fi @@ -125,7 +122,7 @@ start_telemetry() { case "$1" in start) if [ ! -e /etc/system.ok ]; then - echo "Preparing system tweaks for $wfb_soc..." + echo "- Preparing system tweaks for $wfb_soc..." tweaksys "$wfb_soc" exit 0 fi @@ -139,6 +136,7 @@ case "$1" in ;; stop) + ifconfig "$wlan" down killall -q wfb_rx killall -q wfb_tx killall -q wfb_tun diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index 5d66c7fb..cb481505 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -25,6 +25,7 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_rx $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tx + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tx_cmd $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tun $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/wifibroadcast $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/tweaksys From e361f13e83e0b10ddc1bcd27709bdcac39556c52 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Sun, 15 Dec 2024 23:37:41 +0100 Subject: [PATCH 10/29] [no ci] wifibroadcast-ng: migrate configuration to yaml (#1643) --- .../package/wifibroadcast-ng/files/wfb.conf | 10 --- .../package/wifibroadcast-ng/files/wfb.yaml | 9 +++ .../wifibroadcast-ng/files/wifibroadcast | 69 +++++++++++-------- 3 files changed, 49 insertions(+), 39 deletions(-) delete mode 100644 general/package/wifibroadcast-ng/files/wfb.conf create mode 100644 general/package/wifibroadcast-ng/files/wfb.yaml diff --git a/general/package/wifibroadcast-ng/files/wfb.conf b/general/package/wifibroadcast-ng/files/wfb.conf deleted file mode 100644 index 8a543bbc..00000000 --- a/general/package/wifibroadcast-ng/files/wfb.conf +++ /dev/null @@ -1,10 +0,0 @@ -# Broadcast -txpower=1 -region=00 -channel=161 -mode=HT20 -index=1 - -# Telemetry -router=msposd -serial=/dev/ttyS2 diff --git a/general/package/wifibroadcast-ng/files/wfb.yaml b/general/package/wifibroadcast-ng/files/wfb.yaml new file mode 100644 index 00000000..da7379c5 --- /dev/null +++ b/general/package/wifibroadcast-ng/files/wfb.yaml @@ -0,0 +1,9 @@ +wireless: + txpower: 1 + channel: 161 + mode: HT20 +broadcast: + index: 1 +telemetry: + router: msposd + serial: /dev/ttyS2 diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 05d64cca..7b6a5868 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -1,36 +1,47 @@ #!/bin/sh wfb_soc=$(ipcinfo -c) wfb_key=/etc/drone.key -wfb_cfg=/etc/wfb.conf +wfb_cfg=/etc/wfb.yaml -# Default broadcast -wlan=wlan0 -txpower=1 -region=00 -channel=161 -mode=HT20 -index=1 -stream=0 -stbc=0 -ldpc=0 -fec_k=8 -fec_n=12 -link_id=7669206 +wfb_yaml() { + if [ -e "$wfb_cfg" ]; then + if [ "$1" = "b" ]; then + config=broadcast + elif [ "$1" = "t" ]; then + config=telemetry + elif [ "$1" = "w" ]; then + config=wireless + fi + value=$(yaml-cli -i "$wfb_cfg" -g ."$config"."$2") + fi -# Default telemetry -tun_idx=1 -router=msposd -serial=/dev/ttyS2 -baud=115200 -mav_chn=8 -osd_fps=20 -port_rx=14551 -port_tx=14555 + eval "$2"="${value:-$3}" +} -# Custom configuration -if [ -e "$wfb_cfg" ]; then - . "$wfb_cfg" -fi +load_config() { + wfb_yaml w wlan wlan0 + wfb_yaml w txpower 1 + wfb_yaml w region 00 + wfb_yaml w channel 161 + wfb_yaml w mode HT20 + + wfb_yaml b index 1 + wfb_yaml b stream 0 + wfb_yaml b stbc 0 + wfb_yaml b ldpc 0 + wfb_yaml b fec_k 8 + wfb_yaml b fec_n 12 + wfb_yaml b link_id 7669206 + + wfb_yaml t router msposd + wfb_yaml t serial /dev/ttyS2 + wfb_yaml t baud 115200 + wfb_yaml t mav_chn 8 + wfb_yaml t osd_fps 20 + wfb_yaml t tun_index 1 + wfb_yaml t port_rx 14551 + wfb_yaml t port_tx 14555 +} load_modules() { for card in $(lsusb | awk '{print $6}' | sort | uniq); do @@ -96,7 +107,7 @@ start_wfb() { start_tunnel() { echo "- Starting wfb_tun" wfb_rx -p 160 -u 5800 -K "$wfb_key" -i "$link_id" "$wlan" &> /dev/null & - wfb_tx -p 32 -u 5801 -K "$wfb_key" -M "$tun_idx" -S "$stbc" -L "$ldpc" \ + wfb_tx -p 32 -u 5801 -K "$wfb_key" -M "$tun_index" -S "$stbc" -L "$ldpc" \ -k "$fec_k" -n "$fec_n" -i "$link_id" "$wlan" &> /dev/null & wfb_tun -a 10.5.0.10/24 > /dev/null & } @@ -127,6 +138,7 @@ case "$1" in exit 0 fi + load_config load_modules load_interface @@ -136,7 +148,6 @@ case "$1" in ;; stop) - ifconfig "$wlan" down killall -q wfb_rx killall -q wfb_tx killall -q wfb_tun From ae9183c123684169648464ba53ba4e94f34b8b48 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Mon, 16 Dec 2024 13:54:00 +0100 Subject: [PATCH 11/29] Update wifibroadcast-ng.mk --- general/package/wifibroadcast-ng/wifibroadcast-ng.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index cb481505..c7105fb9 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -17,7 +17,7 @@ endef define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -d $(TARGET_DIR)/etc $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/drone.key - $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/wfb.conf + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/wfb.yaml $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_NG_PKGDIR)/files/S98wifibroadcast From 2088de7785ff9ac9c95f3dffac16f5d5555282e3 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:28:16 +0100 Subject: [PATCH 12/29] Update ssc338q_fpvdev_defconfig --- br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig b/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig index 754119b7..0c4f90c4 100644 --- a/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig +++ b/br-ext-chip-sigmastar/configs/ssc338q_fpvdev_defconfig @@ -31,6 +31,8 @@ BR2_PACKAGE_UBOOT_TOOLS=y BR2_PACKAGE_ZLIB=y # BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set BR2_PACKAGE_WIRELESS_TOOLS=y +BR2_PACKAGE_WPA_SUPPLICANT=y +BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y BR2_TARGET_ROOTFS_CPIO=y BR2_TARGET_ROOTFS_SQUASHFS=y BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y From 488f3e5a92cece13d3bea9270101dd390f962d7d Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Tue, 17 Dec 2024 21:54:01 +0100 Subject: [PATCH 13/29] [no ci] wifibroadcast-ng: add wfb_cli command (#1644) --- general/package/wifibroadcast-ng/files/wfb-cli | 2 ++ general/package/wifibroadcast-ng/files/wifibroadcast | 5 ++--- general/package/wifibroadcast-ng/wifibroadcast-ng.mk | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100755 general/package/wifibroadcast-ng/files/wfb-cli diff --git a/general/package/wifibroadcast-ng/files/wfb-cli b/general/package/wifibroadcast-ng/files/wfb-cli new file mode 100755 index 00000000..0892658b --- /dev/null +++ b/general/package/wifibroadcast-ng/files/wfb-cli @@ -0,0 +1,2 @@ +#!/bin/sh +yaml-cli -i /etc/wfb.yaml "$@" diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 7b6a5868..37988c14 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -1,10 +1,9 @@ #!/bin/sh wfb_soc=$(ipcinfo -c) wfb_key=/etc/drone.key -wfb_cfg=/etc/wfb.yaml wfb_yaml() { - if [ -e "$wfb_cfg" ]; then + if [ -e /etc/wfb.yaml ]; then if [ "$1" = "b" ]; then config=broadcast elif [ "$1" = "t" ]; then @@ -12,7 +11,7 @@ wfb_yaml() { elif [ "$1" = "w" ]; then config=wireless fi - value=$(yaml-cli -i "$wfb_cfg" -g ."$config"."$2") + value=$(wfb-cli -g ."$config"."$2") fi eval "$2"="${value:-$3}" diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index c7105fb9..f6668892 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -27,6 +27,7 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tx $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tx_cmd $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tun + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/wfb-cli $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/wifibroadcast $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/tweaksys endef From 7000421e45ba3b1b595193931b2b7e1b98c2ed53 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:51:46 +0100 Subject: [PATCH 14/29] [no ci] wifibroadcast-ng: consolidate settings --- .../package/wifibroadcast-ng/files/tweaksys | 49 ------------- .../package/wifibroadcast-ng/files/wfb.yaml | 8 ++ .../wifibroadcast-ng/files/wifibroadcast | 73 +++++++++++-------- .../wifibroadcast-ng/wifibroadcast-ng.mk | 1 - 4 files changed, 49 insertions(+), 82 deletions(-) delete mode 100755 general/package/wifibroadcast-ng/files/tweaksys diff --git a/general/package/wifibroadcast-ng/files/tweaksys b/general/package/wifibroadcast-ng/files/tweaksys deleted file mode 100755 index e3669d0d..00000000 --- a/general/package/wifibroadcast-ng/files/tweaksys +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh - -finish() { - touch /etc/system.ok - echo "Restart system to apply fpv changes..." - reboot -} - -goke() { - cli -s .isp.slowShutter disabled - cli -s .video0.codec h265 - cli -s .video0.size 1920x1080 - cli -s .video0.fps 30 - cli -s .video0.rcMode cbr -} - -sigmastar() { - cli -s .isp.sensorConfig /etc/sensors/imx415_fpv.bin - cli -s .isp.exposure 5 - cli -s .video0.codec h265 - cli -s .video0.size 1920x1080 - cli -s .video0.fps 90 - cli -s .video0.rcMode cbr -} - -common() { - cli -s .jpeg.enabled false - cli -s .outgoing.enabled true - cli -s .outgoing.server udp://0.0.0.0:5600 -} - -case "$1" in - gk7205v300) - goke - common - finish - ;; - - ssc33x) - sigmastar - common - finish - ;; - - *) - echo "Usage: $0 {ssc33x}" - exit 1 - ;; -esac diff --git a/general/package/wifibroadcast-ng/files/wfb.yaml b/general/package/wifibroadcast-ng/files/wfb.yaml index da7379c5..182c8202 100644 --- a/general/package/wifibroadcast-ng/files/wfb.yaml +++ b/general/package/wifibroadcast-ng/files/wfb.yaml @@ -1,9 +1,17 @@ wireless: txpower: 1 + region: 00 channel: 161 mode: HT20 broadcast: index: 1 + fec_k: 8 + fec_n: 12 + link_id: 7669206 telemetry: + index: 1 router: msposd serial: /dev/ttyS2 + osd_fps: 20 + port_rx: 14551 + port_tx: 14555 diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 37988c14..12ba218e 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -1,6 +1,7 @@ #!/bin/sh wfb_soc=$(ipcinfo -c) wfb_key=/etc/drone.key +wfb_dev=wlan0 wfb_yaml() { if [ -e /etc/wfb.yaml ]; then @@ -11,33 +12,27 @@ wfb_yaml() { elif [ "$1" = "w" ]; then config=wireless fi - value=$(wfb-cli -g ."$config"."$2") + value=$(wfb-cli -g ".$config.$2") fi - eval "$2"="${value:-$3}" + eval "$1_$2=${value:-$3}" } load_config() { - wfb_yaml w wlan wlan0 wfb_yaml w txpower 1 wfb_yaml w region 00 wfb_yaml w channel 161 wfb_yaml w mode HT20 wfb_yaml b index 1 - wfb_yaml b stream 0 - wfb_yaml b stbc 0 - wfb_yaml b ldpc 0 wfb_yaml b fec_k 8 wfb_yaml b fec_n 12 wfb_yaml b link_id 7669206 + wfb_yaml t index 1 wfb_yaml t router msposd wfb_yaml t serial /dev/ttyS2 - wfb_yaml t baud 115200 - wfb_yaml t mav_chn 8 wfb_yaml t osd_fps 20 - wfb_yaml t tun_index 1 wfb_yaml t port_rx 14551 wfb_yaml t port_tx 14555 } @@ -47,7 +42,7 @@ load_modules() { case "$card" in "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") driver=88XXau - modprobe "$driver" rtw_tx_pwr_idx_override="$txpower" + modprobe "$driver" rtw_tx_pwr_idx_override="$w_txpower" ;; "0bda:a81a") @@ -69,22 +64,22 @@ load_modules() { echo "- Detected driver: $driver" fi - if ! ifconfig "$wlan" up; then + if ! ifconfig "$wfb_dev" up; then echo "- Wireless driver not found!" exit 1 fi } load_interface() { - iw "$wlan" set monitor none - iw "$wlan" set channel "$channel" "$mode" - iw reg set "$region" + iw "$wfb_dev" set monitor none + iw "$wfb_dev" set channel "$w_channel" "$w_mode" + iw reg set "$w_region" if [ "$driver" = "8812eu" ] || [ "$driver" = "8733bu" ]; then - iw "$wlan" set txpower fixed $((txpower * 50)) + iw "$wfb_dev" set txpower fixed $((txpower * 50)) fi - case "$mode" in + case "$w_mode" in "HT20") bandwidth=20 ;; @@ -99,15 +94,15 @@ load_interface() { start_wfb() { echo "- Starting wfb_tx" - wfb_tx -K "$wfb_key" -M "$index" -p "$stream" -B "$bandwidth" -C 8000 \ - -S "$stbc" -L "$ldpc" -k "$fec_k" -n "$fec_n" -i "$link_id" "$wlan" &> /dev/null & + wfb_tx -K "$wfb_key" -M "$b_index" -B "$bandwidth" -C 8000 \ + -k "$b_fec_k" -n "$b_fec_n" -i "$b_link_id" "$wfb_dev" &> /dev/null & } start_tunnel() { echo "- Starting wfb_tun" - wfb_rx -p 160 -u 5800 -K "$wfb_key" -i "$link_id" "$wlan" &> /dev/null & - wfb_tx -p 32 -u 5801 -K "$wfb_key" -M "$tun_index" -S "$stbc" -L "$ldpc" \ - -k "$fec_k" -n "$fec_n" -i "$link_id" "$wlan" &> /dev/null & + wfb_rx -p 160 -u 5800 -K "$wfb_key" -i "$b_link_id" "$wfb_dev" &> /dev/null & + wfb_tx -p 32 -u 5801 -K "$wfb_key" -M "$t_index" \ + -k "$b_fec_k" -n "$b_fec_n" -i "$b_link_id" "$wfb_dev" &> /dev/null & wfb_tun -a 10.5.0.10/24 > /dev/null & } @@ -118,23 +113,37 @@ start_telemetry() { devmem 0x1F207890 16 0x8 fi - if [ "$router" = "msposd" ]; then - echo "- Starting $router" - msposd --master "$serial" --baudrate "$baud" -osd --ahi 0 -r "$osd_fps" \ - --channels "$mav_chn" --out 10.5.0.1:"$port_tx" > /dev/null & - elif [ "$router" = "mavfwd" ]; then - echo "- Starting $router" - mavfwd --master "$serial" --baudrate "$baud" -p 100 -a 15 -t \ - --channels "$mav_chn" --in 0.0.0.0:"$port_rx" --out 10.5.0.1:"$port_tx" > /dev/null & + if [ "$t_router" = "msposd" ]; then + echo "- Starting $t_router" + msposd --baudrate 115200 ---channels 8 -osd --ahi 0 -r "$t_osd_fps" \ + --master "$t_serial" --out 10.5.0.1:"$t_port_tx" > /dev/null & + elif [ "$t_router" = "mavfwd" ]; then + echo "- Starting $t_router" + mavfwd --baudrate 115200 ---channels 8 -p 100 -a 15 -t \ + --master "$t_serial" --in 0.0.0.0:"$t_port_rx" --out 10.5.0.1:"$t_port_tx" > /dev/null & fi } +majestic_sigmastar() { + cli -s .isp.sensorConfig /etc/sensors/imx415_fpv.bin + cli -s .isp.exposure 5 + cli -s .video0.codec h265 + cli -s .video0.size 1920x1080 + cli -s .video0.fps 90 + cli -s .video0.rcMode cbr + cli -s .jpeg.enabled false + cli -s .outgoing.enabled true + cli -s .outgoing.server udp://0.0.0.0:5600 +} + case "$1" in start) if [ ! -e /etc/system.ok ]; then - echo "- Preparing system tweaks for $wfb_soc..." - tweaksys "$wfb_soc" - exit 0 + if [ "$wfb_soc" = "ssc33x" ]; then + majestic_sigmastar + fi + + touch /etc/system.ok fi load_config diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index f6668892..3cedfe51 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -29,7 +29,6 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tun $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/wfb-cli $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/wifibroadcast - $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/tweaksys endef $(eval $(generic-package)) From e2b411222f04fe56643028ec3117982f0378e215 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Sun, 22 Dec 2024 19:18:20 +0100 Subject: [PATCH 15/29] [no ci] wifibroadcast-ng: set iw power override for rtl8812au (#1650) --- general/package/wifibroadcast-ng/files/wifibroadcast | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 12ba218e..1d77ed8a 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -42,7 +42,7 @@ load_modules() { case "$card" in "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") driver=88XXau - modprobe "$driver" rtw_tx_pwr_idx_override="$w_txpower" + modprobe "$driver" ;; "0bda:a81a") @@ -75,8 +75,10 @@ load_interface() { iw "$wfb_dev" set channel "$w_channel" "$w_mode" iw reg set "$w_region" - if [ "$driver" = "8812eu" ] || [ "$driver" = "8733bu" ]; then - iw "$wfb_dev" set txpower fixed $((txpower * 50)) + if [ "$driver" = "88XXau" ]; then + iw "$wfb_dev" set txpower fixed $((w_txpower * -100)) + else + iw "$wfb_dev" set txpower fixed $((w_txpower * 50)) fi case "$w_mode" in From df772d5bb724021918494e8c6c5a5d077b5eebc5 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Tue, 24 Dec 2024 14:34:42 +0100 Subject: [PATCH 16/29] [no ci] majestic-plugins: sync recent changes --- general/package/majestic-plugins/majestic-plugins.mk | 5 ++++- general/package/majestic/Config.in | 1 - general/package/majestic/files/S95majestic | 3 --- general/package/majestic/majestic.mk | 5 ----- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/general/package/majestic-plugins/majestic-plugins.mk b/general/package/majestic-plugins/majestic-plugins.mk index a3906664..42384a50 100644 --- a/general/package/majestic-plugins/majestic-plugins.mk +++ b/general/package/majestic-plugins/majestic-plugins.mk @@ -4,9 +4,12 @@ # ################################################################################ -MAJESTIC_PLUGINS_SITE = $(call github,openipc,majestic-plugins,$(MAJESTIC_PLUGINS_VERSION)) +MAJESTIC_PLUGINS_SITE_METHOD = git +MAJESTIC_PLUGINS_SITE = https://github.com/openipc/majestic-plugins MAJESTIC_PLUGINS_VERSION = HEAD +MAJESTIC_PLUGINS_GIT_SUBMODULES = YES + define MAJESTIC_PLUGINS_BUILD_CMDS $(MAKE) CC=$(TARGET_CC) TARGET=$(OPENIPC_SOC_VENDOR) -C $(@D) -B endef diff --git a/general/package/majestic/Config.in b/general/package/majestic/Config.in index 2b69c41f..fa671d90 100644 --- a/general/package/majestic/Config.in +++ b/general/package/majestic/Config.in @@ -1,6 +1,5 @@ config BR2_PACKAGE_MAJESTIC bool "Majestic streamer" - default n help Tiny but powerful IPC streaming software (non-commercial version for personal use only) diff --git a/general/package/majestic/files/S95majestic b/general/package/majestic/files/S95majestic index c5563ad6..62297c29 100755 --- a/general/package/majestic/files/S95majestic +++ b/general/package/majestic/files/S95majestic @@ -5,9 +5,6 @@ PIDFILE="/var/run/$DAEMON.pid" DAEMON_ARGS="-s" start() { - ulimit -c unlimited - echo "/tmp/core.majestic" > /proc/sys/kernel/core_pattern - echo -n "Starting $DAEMON: " start-stop-daemon -b -m -S -q -p "$PIDFILE" -x "$DAEMON" -- $DAEMON_ARGS if [ $? -eq 0 ]; then diff --git a/general/package/majestic/majestic.mk b/general/package/majestic/majestic.mk index 114ab30e..a36998d2 100644 --- a/general/package/majestic/majestic.mk +++ b/general/package/majestic/majestic.mk @@ -19,11 +19,6 @@ MAJESTIC_DEPENDENCIES += \ opus-openipc \ json-c -MAJESTIC_FILTER = hi3516ev200 gk7205v200 infinity6b0 infinity6e t31 -ifneq ($(filter $(MAJESTIC_FILTER),$(MAJESTIC_FAMILY)),) - MAJESTIC_DEPENDENCIES += majestic-plugins -endif - define MAJESTIC_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -d $(TARGET_DIR)/etc $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/majestic.yaml From 9914acd3661afe8f246cc21e04b4fee5e74e8cbc Mon Sep 17 00:00:00 2001 From: Petru Soroaga Date: Tue, 24 Dec 2024 15:49:20 +0200 Subject: [PATCH 17/29] Updated to Ruby version 10.1 (#1651) --- general/package/rubyfpv/files/version_ruby_base.txt | 2 +- general/package/rubyfpv/rubyfpv.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/general/package/rubyfpv/files/version_ruby_base.txt b/general/package/rubyfpv/files/version_ruby_base.txt index 2f52450b..ae425d69 100644 --- a/general/package/rubyfpv/files/version_ruby_base.txt +++ b/general/package/rubyfpv/files/version_ruby_base.txt @@ -1 +1 @@ -10.0 +10.1 diff --git a/general/package/rubyfpv/rubyfpv.mk b/general/package/rubyfpv/rubyfpv.mk index 4c533f0c..eb954985 100644 --- a/general/package/rubyfpv/rubyfpv.mk +++ b/general/package/rubyfpv/rubyfpv.mk @@ -6,7 +6,7 @@ RUBYFPV_SITE_METHOD = git RUBYFPV_SITE = https://github.com/PetruSoroaga/RubyFPV -RUBYFPV_VERSION = 5ec137401ec338c9273e48a7cb9402d96010b9dd +RUBYFPV_VERSION = 818b573416435fcccf2d4ebb6074deb80be9bca1 RUBYFPV_DEPENDENCIES += libpcap iw From 256a0b16348177e4b07d6c41ee8157e2f4835d2f Mon Sep 17 00:00:00 2001 From: Petru Soroaga Date: Sat, 28 Dec 2024 15:38:40 +0200 Subject: [PATCH 18/29] Integrate bug fixes for Ruby 10.1 (#1652) Co-authored-by: Signor Pellegrino <68112357+flyrouter@users.noreply.github.com> --- general/package/rubyfpv/rubyfpv.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/package/rubyfpv/rubyfpv.mk b/general/package/rubyfpv/rubyfpv.mk index eb954985..01ca94be 100644 --- a/general/package/rubyfpv/rubyfpv.mk +++ b/general/package/rubyfpv/rubyfpv.mk @@ -6,7 +6,7 @@ RUBYFPV_SITE_METHOD = git RUBYFPV_SITE = https://github.com/PetruSoroaga/RubyFPV -RUBYFPV_VERSION = 818b573416435fcccf2d4ebb6074deb80be9bca1 +RUBYFPV_VERSION = 2a290ac1ad257c105af7870740297d4409c1af43 RUBYFPV_DEPENDENCIES += libpcap iw From 51aa8a12ecf32e83e9329bea618324b22f01ccc2 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Wed, 1 Jan 2025 18:29:21 +0100 Subject: [PATCH 19/29] Update wifibroadcast --- general/package/wifibroadcast-ng/files/wifibroadcast | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 1d77ed8a..dd62c318 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -117,11 +117,11 @@ start_telemetry() { if [ "$t_router" = "msposd" ]; then echo "- Starting $t_router" - msposd --baudrate 115200 ---channels 8 -osd --ahi 0 -r "$t_osd_fps" \ + msposd --baudrate 115200 --channels 8 -osd --ahi 0 -r "$t_osd_fps" \ --master "$t_serial" --out 10.5.0.1:"$t_port_tx" > /dev/null & elif [ "$t_router" = "mavfwd" ]; then echo "- Starting $t_router" - mavfwd --baudrate 115200 ---channels 8 -p 100 -a 15 -t \ + mavfwd --baudrate 115200 --channels 8 -p 100 -a 15 -t \ --master "$t_serial" --in 0.0.0.0:"$t_port_rx" --out 10.5.0.1:"$t_port_tx" > /dev/null & fi } From d3b43c31d20148e4e6905e237773fb4d953aac48 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov Date: Fri, 10 Jan 2025 01:02:10 +0300 Subject: [PATCH 20/29] Add w1-ds18b20 (#1659) --- general/package/w1-ds18b20/Config.in | 4 + general/package/w1-ds18b20/readme.md | 13 + general/package/w1-ds18b20/src/w1-ds18b20.c | 631 ++++++++++++++++++++ general/package/w1-ds18b20/w1-ds18b20.mk | 21 + 4 files changed, 669 insertions(+) create mode 100644 general/package/w1-ds18b20/Config.in create mode 100644 general/package/w1-ds18b20/readme.md create mode 100644 general/package/w1-ds18b20/src/w1-ds18b20.c create mode 100644 general/package/w1-ds18b20/w1-ds18b20.mk diff --git a/general/package/w1-ds18b20/Config.in b/general/package/w1-ds18b20/Config.in new file mode 100644 index 00000000..9d4e241c --- /dev/null +++ b/general/package/w1-ds18b20/Config.in @@ -0,0 +1,4 @@ +config BR2_PACKAGE_W1-DS18B20 + bool "w1-ds18b20" + help + OneWire DS18B20 GPIO bitbang app diff --git a/general/package/w1-ds18b20/readme.md b/general/package/w1-ds18b20/readme.md new file mode 100644 index 00000000..a36dfb53 --- /dev/null +++ b/general/package/w1-ds18b20/readme.md @@ -0,0 +1,13 @@ +# w1-ds18b20 + +This app allows reading ds18b20 sensors in bitbang mode using direct GPIO memory access. +Currently supports only HiSilicon-style GPIO offsets. Pull-up resistor is required. + +## Usage + +Example: reading temperature using GPIO8_2 on Gk7205V300 (consult datasheet or ipctool output) + +``` +# ./w1-ds18b20 -base 0x120B8000 -gpio 2 +28-4A4E3C1E64FF : 22.44 C +``` diff --git a/general/package/w1-ds18b20/src/w1-ds18b20.c b/general/package/w1-ds18b20/src/w1-ds18b20.c new file mode 100644 index 00000000..79c3df72 --- /dev/null +++ b/general/package/w1-ds18b20/src/w1-ds18b20.c @@ -0,0 +1,631 @@ +// Based on https://github.com/danjperron/BitBangingDS18B20.git + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int mem_fd; +void *gpio_map; + +unsigned short DS_PIN = 7; +unsigned int GPIO_BASE = 0x120b6000; +unsigned short ArgResolution = 0; +unsigned short ArgScan = 0; +unsigned short ArgWaitTime = 750; + +// I/O access +volatile unsigned *gpio; + + +#define BLOCK_SIZE (4 * 1024) + +#define OUT_GPIO(g) *(gpio + 0x400 / sizeof(*gpio)) |= (1 << g) +#define INP_GPIO(g) *(gpio + 0x400 / sizeof(*gpio)) &= ~(1 << g) + +#define GPIO_SET(n) (*(gpio + 0x3FC / sizeof(*gpio)) |= (1 << (n))) +#define GPIO_CLR(n) (*(gpio + 0x3FC / sizeof(*gpio)) &= ~(1 << (n))) +#define GPIO_READ(g) (((*(gpio + 0x3FC / sizeof(*gpio))) & (1 << (g))) >> (g)) + +#define DS18B20_SKIP_ROM 0xCC +#define DS18B20_CONVERT_T 0x44 +#define DS18B20_MATCH_ROM 0x55 +#define DS18B20_SEARCH_ROM 0XF0 +#define DS18B20_READ_SCRATCHPAD 0xBE +#define DS18B20_WRITE_SCRATCHPAD 0x4E +#define DS18B20_COPY_SCRATCHPAD 0x48 + +unsigned char ScratchPad[9]; +double temperature; +int resolution; + +void setup_io(); +#define DELAY1US DelayMicrosecondsNoSleep(1); + +void DelayMicrosecondsNoSleep(int delay_us) { + long int start_time; + long int time_difference; + struct timespec gettime_now; + + clock_gettime(CLOCK_REALTIME, &gettime_now); + start_time = gettime_now.tv_nsec; // Get nS value + while (1) { + clock_gettime(CLOCK_REALTIME, &gettime_now); + time_difference = gettime_now.tv_nsec - start_time; + if (time_difference < 0) + time_difference += 1000000000; //(Rolls over every 1 second) + if (time_difference > (delay_us * 1000)) // Delay for # nS + break; + } +} + +int DoReset(void) { + INP_GPIO(DS_PIN); + + DelayMicrosecondsNoSleep(10); + + INP_GPIO(DS_PIN); + OUT_GPIO(DS_PIN); + + // pin low for 480 us + GPIO_CLR(DS_PIN); + usleep(480); + INP_GPIO(DS_PIN); + DelayMicrosecondsNoSleep(60); + if (GPIO_READ(DS_PIN) == 0) { + DelayMicrosecondsNoSleep(420); + return 1; + } + return 0; +} + +void WriteByte(unsigned char value) { + unsigned char Mask = 1; + int loop; + + for (loop = 0; loop < 8; loop++) { + INP_GPIO(DS_PIN); + OUT_GPIO(DS_PIN); + GPIO_CLR(DS_PIN); + + if ((value & Mask) != 0) { + DELAY1US + INP_GPIO(DS_PIN); + DelayMicrosecondsNoSleep(60); + + } else { + DelayMicrosecondsNoSleep(60); + INP_GPIO(DS_PIN); + DelayMicrosecondsNoSleep(1); + } + Mask *= 2; + DelayMicrosecondsNoSleep(60); + } + + usleep(100); +} + +void WriteBit(unsigned char value) { + INP_GPIO(DS_PIN); + OUT_GPIO(DS_PIN); + GPIO_CLR(DS_PIN); + if (value) { + DELAY1US + INP_GPIO(DS_PIN); + DelayMicrosecondsNoSleep(60); + } else { + DelayMicrosecondsNoSleep(60); + INP_GPIO(DS_PIN); + DelayMicrosecondsNoSleep(1); + } + DelayMicrosecondsNoSleep(60); +} + +unsigned char ReadBit(void) { + unsigned char rvalue = 0; + INP_GPIO(DS_PIN); + OUT_GPIO(DS_PIN); + GPIO_CLR(DS_PIN); + DELAY1US + INP_GPIO(DS_PIN); + DelayMicrosecondsNoSleep(2); + if (GPIO_READ(DS_PIN) != 0) + rvalue = 1; + DelayMicrosecondsNoSleep(60); + return rvalue; +} + +unsigned char ReadByte(void) { + + unsigned char Mask = 1; + int loop; + unsigned char data = 0; + + for (loop = 0; loop < 8; loop++) { + INP_GPIO(DS_PIN); + OUT_GPIO(DS_PIN); + GPIO_CLR(DS_PIN); + DELAY1US + INP_GPIO(DS_PIN); + // Wait 2 us + DelayMicrosecondsNoSleep(2); + if (GPIO_READ(DS_PIN) != 0) + data |= Mask; + Mask *= 2; + DelayMicrosecondsNoSleep(60); + } + + return data; +} + +int ReadScratchPad(void) { + int loop; + + WriteByte(DS18B20_READ_SCRATCHPAD); + for (loop = 0; loop < 9; loop++) { + ScratchPad[loop] = ReadByte(); + } + return 1; +} + +unsigned char CalcCRC(unsigned char *data, unsigned char byteSize) { + unsigned char shift_register = 0; + unsigned char loop, loop2; + char DataByte; + + for (loop = 0; loop < byteSize; loop++) { + DataByte = *(data + loop); + for (loop2 = 0; loop2 < 8; loop2++) { + if ((shift_register ^ DataByte) & 1) { + shift_register = shift_register >> 1; + shift_register ^= 0x8C; + } else + shift_register = shift_register >> 1; + DataByte = DataByte >> 1; + } + } + return shift_register; +} + +char IDGetBit(unsigned long long *llvalue, char bit) { + unsigned long long Mask = 1ULL << bit; + + return ((*llvalue & Mask) ? 1 : 0); +} + +unsigned long long IDSetBit(unsigned long long *llvalue, char bit, + unsigned char newValue) { + unsigned long long Mask = 1ULL << bit; + + if ((bit >= 0) && (bit < 64)) { + if (newValue == 0) + *llvalue &= ~Mask; + else + *llvalue |= Mask; + } + return *llvalue; +} + +void SelectSensor(unsigned long long ID) { + int BitIndex; + + WriteByte(DS18B20_MATCH_ROM); + + for (BitIndex = 0; BitIndex < 64; BitIndex++) + WriteBit(IDGetBit(&ID, BitIndex)); +} + +int SearchSensor(unsigned long long *ID, int *LastBitChange) { + int BitIndex; + char Bit, NoBit; + + if (*LastBitChange < 0) + return 0; + + // Set bit at LastBitChange Position to 1 + // Every bit after LastbitChange will be 0 + + if (*LastBitChange < 64) { + + IDSetBit(ID, *LastBitChange, 1); + for (BitIndex = *LastBitChange + 1; BitIndex < 64; BitIndex++) + IDSetBit(ID, BitIndex, 0); + } + + *LastBitChange = -1; + + if (!DoReset()) + return -1; + + WriteByte(DS18B20_SEARCH_ROM); + + for (BitIndex = 0; BitIndex < 64; BitIndex++) { + + NoBit = ReadBit(); + Bit = ReadBit(); + + if (Bit && NoBit) + return -2; + + if (!Bit && !NoBit) { + // ok 2 possibilities + if (IDGetBit(ID, BitIndex)) { + // Bit High already set + WriteBit(1); + } else { + // ok let's try LOW value first + *LastBitChange = BitIndex; + WriteBit(0); + } + } else if (!Bit) { + WriteBit(1); + IDSetBit(ID, BitIndex, 1); + } else { + WriteBit(0); + IDSetBit(ID, BitIndex, 0); + } + } + + return 1; +} + +int ReadSensor(unsigned long long ID) { + int RetryCount; + unsigned char CRCByte; + union { + short SHORT; + unsigned char CHAR[2]; + } IntTemp; + + temperature = -9999.9; + + for (RetryCount = 0; RetryCount < 10; RetryCount++) { + + if (!DoReset()) + continue; + + // start a conversion + SelectSensor(ID); + + if (!ReadScratchPad()) + continue; + + // OK Check sum Check; + CRCByte = CalcCRC(ScratchPad, 8); + + if (CRCByte != ScratchPad[8]) + continue; + + // Check Resolution + resolution = 0; + switch (ScratchPad[4]) { + + case 0x1f: + resolution = 9; + break; + case 0x3f: + resolution = 10; + break; + case 0x5f: + resolution = 11; + break; + case 0x7f: + resolution = 12; + break; + } + + if (resolution == 0) + continue; + // Read Temperature + IntTemp.CHAR[0] = ScratchPad[0]; + IntTemp.CHAR[1] = ScratchPad[1]; + + temperature = 0.0625 * (double)IntTemp.SHORT; + + ID &= 0x00FFFFFFFFFFFFFFULL; + printf("%02llX-%012llX : ", ID & 0xFFULL, ID >> 8); + + // printf("%02d bits Temperature: %6.2f +/- %4.2f C\n", resolution, + // temperature, 0.0625 * (double)(1 << (12 - resolution))); + printf("%6.2f C\n", temperature); + + return 1; + } + + return 0; +} + +int GlobalStartConversion(void) { + int retry = 0; + int maxloop; + + while (retry < 10) { + if (!DoReset()) + usleep(10000); + else { + WriteByte(DS18B20_SKIP_ROM); + WriteByte(DS18B20_CONVERT_T); + maxloop = 0; + +#define USE_CONSTANT_DELAY +#ifdef USE_CONSTANT_DELAY + usleep(ArgWaitTime * 1000); + return 1; +#else + // wait until ready + while (!ReadBit()) { + maxloop++; + if (maxloop > 100000) + break; + } + + if (maxloop <= 100000) + return 1; +#endif + } + retry++; + } + return 0; +} + +void WriteScratchPad(unsigned char TH, unsigned char TL, unsigned char config) { + + // First reset device + DoReset(); + + usleep(10); + // Skip ROM command + WriteByte(DS18B20_SKIP_ROM); + + // Write Scratch pad + WriteByte(DS18B20_WRITE_SCRATCHPAD); + + // Write TH + WriteByte(TH); + + // Write TL + WriteByte(TL); + + // Write config + WriteByte(config); +} + +void CopyScratchPad(void) { + + // Reset device + DoReset(); + usleep(1000); + + // Skip ROM Command + WriteByte(DS18B20_SKIP_ROM); + + // copy scratch pad + WriteByte(DS18B20_COPY_SCRATCHPAD); + usleep(100000); +} + +void ChangeSensorsResolution(int resolution) { + int config = 0; + + switch (resolution) { + case 9: + config = 0x1f; + break; + case 10: + config = 0x3f; + break; + case 11: + config = 0x5f; + break; + default: + config = 0x7f; + break; + } + WriteScratchPad(0xff, 0xff, config); + usleep(1000); + CopyScratchPad(); +} + +void ScanForSensor(void) { + unsigned long long ID = 0ULL; + int NextBit = 64; + int _NextBit; + int rcode; + int retry = 0; + unsigned long long _ID; + unsigned char _ID_CRC; + unsigned char _ID_Calc_CRC; + // unsigned char _ID_Family; + + while (retry < 10) { + _ID = ID; + _NextBit = NextBit; + rcode = SearchSensor(&_ID, &_NextBit); + if (rcode == 1) { + _ID_CRC = (unsigned char)(_ID >> 56); + _ID_Calc_CRC = CalcCRC((unsigned char *)&_ID, 7); + if (_ID_CRC == _ID_Calc_CRC) { + if (ArgScan == 0) { + if (ReadSensor(_ID)) { + ID = _ID; + NextBit = _NextBit; + retry = 0; + } else + retry = 0; + } else { + ID = _ID; + NextBit = _NextBit; + printf("%016llX\n", ID); + } + } else + retry++; + } else if (rcode == 0) + break; + else + retry++; + } +} + +void PrintUsage(char *app) { + fprintf(stderr, "usage :\n\n\t"); + fprintf(stderr, "%s -base 0x -gpio n [-xbits] [-s] [-t delay]\n\n", app); + fprintf(stderr, " -base 0xn -> n specify the GPIO group base address\n"); + fprintf(stderr, + " -gpio n -> n specify the GPIO number in group [0-7]\n"); + fprintf( + stderr, + " -xbits -> x set the number of bits -9bits,-10bits,-11bits and " + "-12bits\n"); + fprintf( + stderr, + " -t delay -> delay is the time in ms to wait after conversion\n"); + fprintf(stderr, " -s -> Scan for sensor\n"); +} + +int DecodeArg(int argc, char **argv) { + + int idx = 1; + + if (argc == 1) { + PrintUsage(argv[0]); + return 0; + } + + while (idx < argc) { + if (strstr(argv[idx], "help") != NULL) { + PrintUsage(argv[0]); + return 0; + } + if (strcmp(argv[idx], "-base") == 0) + sscanf(argv[++idx], "%x", &GPIO_BASE); + else if (strcmp(argv[idx], "-gpio") == 0) + DS_PIN = atoi(argv[++idx]); + else if (strcmp(argv[idx], "-9bits") == 0) + ArgResolution = 9; + else if (strcmp(argv[idx], "-10bits") == 0) + ArgResolution = 10; + else if (strcmp(argv[idx], "-11bits") == 0) + ArgResolution = 11; + else if (strcmp(argv[idx], "-12bits") == 0) + ArgResolution = 12; + else if (strcmp(argv[idx], "-s") == 0) + ArgScan = 1; + else if (strcmp(argv[idx], "-t") == 0) + ArgWaitTime = atoi(argv[++idx]); + else { + fprintf(stderr, "Unknown argument %s! ", argv[idx]); + exit(0); + } + idx++; + } + return 1; +} + +void set_max_priority(void) { + struct sched_param sched; + memset(&sched, 0, sizeof(sched)); + // Use FIFO scheduler with highest priority for the lowest chance of the + // kernel context switching. + sched.sched_priority = sched_get_priority_max(SCHED_FIFO); + sched_setscheduler(0, SCHED_FIFO, &sched); +} + +void set_default_priority(void) { + struct sched_param sched; + memset(&sched, 0, sizeof(sched)); + // Go back to default scheduler with default 0 priority. + sched.sched_priority = 0; + sched_setscheduler(0, SCHED_OTHER, &sched); +} + +int main(int argc, char **argv) { + int loop; + int Flag = 0; + + if (DecodeArg(argc, argv) == 0) + return 0; + + setup_io(); + + // Check for pull up resistor + // Signal input should be high + + // Set PIN to INPUT MODE + INP_GPIO(DS_PIN); + + Flag = 0; + for (loop = 0; loop < 100; loop++) { + usleep(1000); + if (GPIO_READ(DS_PIN) != 0) { + Flag = 1; + break; + } + } + + if (Flag == 0) { + fprintf(stderr, "*** Error Unable to detect HIGH level. No pull-up resistor ?\n"); + exit(-1); + } + + if (ArgResolution > 0) { + // need to change resolution + ChangeSensorsResolution(ArgResolution); + // do it twice just in case + ChangeSensorsResolution(ArgResolution); + } + + if (GlobalStartConversion() == 0) { + fprintf(stderr, "*** Error Unable to detect any DS18B20 sensor\n"); + exit(-2); + } + + set_max_priority(); + + ScanForSensor(); + + set_default_priority(); + + return 0; + +} + +void setup_io() { +#ifdef USE_GPIOLIB + +#else + /* open /dev/mem */ + if ((mem_fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) { + fprintf(stderr, "can't open /dev/mem \n"); + exit(-1); + } + /* mmap GPIO */ + gpio_map = + mmap(NULL, // Any adddress in our space will do + BLOCK_SIZE, // Map length + PROT_READ | PROT_WRITE, // Enable reading & writting to mapped memory + MAP_SHARED, // Shared with other processes + mem_fd, // File to map + GPIO_BASE // Offset to GPIO peripheral + ); +#endif + +#ifdef USE_GPIOLIB + +#else + close(mem_fd); // No need to keep mem_fd open after mmap + + if (gpio_map == MAP_FAILED) { + fprintf(stderr, "mmap error gpio_map=%p\n", gpio_map); // errno also set! + exit(-1); + } + + // Always use volatile pointer! + gpio = (volatile unsigned *)gpio_map; +#endif + +} diff --git a/general/package/w1-ds18b20/w1-ds18b20.mk b/general/package/w1-ds18b20/w1-ds18b20.mk new file mode 100644 index 00000000..4372b44e --- /dev/null +++ b/general/package/w1-ds18b20/w1-ds18b20.mk @@ -0,0 +1,21 @@ +################################################################################ +# +# w1-ds18b20 +# +################################################################################ + +W1-DS18B20_SITE_METHOD = local +W1-DS18B20_SITE = $(W1-DS18B20_PKGDIR)/src + +W1-DS18B20_LICENSE = MIT +W1-DS18B20_LICENSE_FILES = LICENSE + +define W1-DS18B20_BUILD_CMDS + $(TARGET_CC) $(@D)/w1-ds18b20.c -o $(@D)/w1-ds18b20 -Os -s +endef + +define W1-DS18B20_INSTALL_TARGET_CMDS + $(INSTALL) -m 0755 -t $(TARGET_DIR)/usr/bin $(@D)/w1-ds18b20 +endef + +$(eval $(generic-package)) From 76427eb960d6abaca830202c7bb58d933babbaff Mon Sep 17 00:00:00 2001 From: Petru Soroaga Date: Tue, 14 Jan 2025 11:56:17 +0200 Subject: [PATCH 21/29] Update to Ruby 10.2 (#1661) --- general/package/rubyfpv/files/version_ruby_base.txt | 2 +- general/package/rubyfpv/rubyfpv.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/general/package/rubyfpv/files/version_ruby_base.txt b/general/package/rubyfpv/files/version_ruby_base.txt index ae425d69..e2498ea5 100644 --- a/general/package/rubyfpv/files/version_ruby_base.txt +++ b/general/package/rubyfpv/files/version_ruby_base.txt @@ -1 +1 @@ -10.1 +10.2 diff --git a/general/package/rubyfpv/rubyfpv.mk b/general/package/rubyfpv/rubyfpv.mk index 01ca94be..5b97fbb6 100644 --- a/general/package/rubyfpv/rubyfpv.mk +++ b/general/package/rubyfpv/rubyfpv.mk @@ -6,7 +6,7 @@ RUBYFPV_SITE_METHOD = git RUBYFPV_SITE = https://github.com/PetruSoroaga/RubyFPV -RUBYFPV_VERSION = 2a290ac1ad257c105af7870740297d4409c1af43 +RUBYFPV_VERSION = f904b81b47789183126dad014a37951af311c921 RUBYFPV_DEPENDENCIES += libpcap iw From 5fd1cca1292bd770dcc153bbba57771d6f6a4e10 Mon Sep 17 00:00:00 2001 From: Petru Soroaga Date: Tue, 14 Jan 2025 17:12:23 +0200 Subject: [PATCH 22/29] Hot fix for Ruby 10.2 (#1663) --- general/package/rubyfpv/rubyfpv.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/package/rubyfpv/rubyfpv.mk b/general/package/rubyfpv/rubyfpv.mk index 5b97fbb6..2502d99c 100644 --- a/general/package/rubyfpv/rubyfpv.mk +++ b/general/package/rubyfpv/rubyfpv.mk @@ -6,7 +6,7 @@ RUBYFPV_SITE_METHOD = git RUBYFPV_SITE = https://github.com/PetruSoroaga/RubyFPV -RUBYFPV_VERSION = f904b81b47789183126dad014a37951af311c921 +RUBYFPV_VERSION = f6bbc7725e0d635f993948c2888bbe0ce84f0e60 RUBYFPV_DEPENDENCIES += libpcap iw From ef0bdcaa45faf298c191b505ac26da078c854c53 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov Date: Wed, 15 Jan 2025 17:22:59 +0300 Subject: [PATCH 23/29] Add OS02G10 driver for Gk7205v200 (as seen on Tiandy boards) (#1664) --- .../files/sensor/config/os02g10_i2c_1080p.ini | 78 ++++++++++++++++++ .../files/sensor/libsns_os02g10.so | Bin 0 -> 43548 bytes 2 files changed, 78 insertions(+) create mode 100644 general/package/goke-osdrv-gk7205v200/files/sensor/config/os02g10_i2c_1080p.ini create mode 100644 general/package/goke-osdrv-gk7205v200/files/sensor/libsns_os02g10.so diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/config/os02g10_i2c_1080p.ini b/general/package/goke-osdrv-gk7205v200/files/sensor/config/os02g10_i2c_1080p.ini new file mode 100644 index 00000000..9357e406 --- /dev/null +++ b/general/package/goke-osdrv-gk7205v200/files/sensor/config/os02g10_i2c_1080p.ini @@ -0,0 +1,78 @@ +[sensor] +Sensor_type=stSnsOv02g10Obj +Mode=WDR_MODE_NONE +DllFile=libsns_os02g10.so + +[mode] +input_mode=INPUT_MODE_MIPI +raw_bitness=10 + +[mipi] +lane_id = 0|2|-1|-1|-1|-1|-1|-1| ;lane_id: -1 - disable + +[isp_image] +Isp_FrameRate=25 +Isp_Bayer=BAYER_BGGR + +[vi_dev] +Input_mod=VI_MODE_MIPI +Work_mod =0 ;VI_WORK_MODE_1Multiplex = 0 + ;VI_WORK_MODE_2Multiplex, + ;VI_WORK_MODE_4Multiplex +Combine_mode =0 ;Y/C composite or separation mode + ;VI_COMBINE_COMPOSITE = 0 /*Composite mode */ + ;VI_COMBINE_SEPARATE, /*Separate mode */ +Comp_mode =0 ;Component mode (single-component or dual-component) + ;VI_COMP_MODE_SINGLE = 0, /*single component mode */ + ;VI_COMP_MODE_DOUBLE = 1, /*double component mode */ +Clock_edge =1 ;Clock edge mode (sampling on the rising or falling edge) + ;VI_CLK_EDGE_SINGLE_UP=0, /*rising edge */ + ;VI_CLK_EDGE_SINGLE_DOWN, /*falling edge */ +Mask_num =2 ;Component mask +Mask_0 =0xFFF00000 +Mask_1 =0x0 +Scan_mode = 1;VI_SCAN_INTERLACED = 0 + ;VI_SCAN_PROGRESSIVE, +Data_seq =2 ;data sequence (ONLY for YUV format) + ;----2th component U/V sequence in bt1120 + ; VI_INPUT_DATA_VUVU = 0, + ; VI_INPUT_DATA_UVUV, + ;----input sequence for yuv + ; VI_INPUT_DATA_UYVY = 0, + ; VI_INPUT_DATA_VYUY, + ; VI_INPUT_DATA_YUYV, + ; VI_INPUT_DATA_YVYU + +Vsync =1 ; vertical synchronization signal + ;VI_VSYNC_FIELD = 0, + ;VI_VSYNC_PULSE, +VsyncNeg=1 ;Polarity of the vertical synchronization signal + ;VI_VSYNC_NEG_HIGH = 0, + ;VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E +Hsync =0 ;Attribute of the horizontal synchronization signal + ;VI_HSYNC_VALID_SINGNAL = 0, + ;VI_HSYNC_PULSE, +HsyncNeg =0 ;Polarity of the horizontal synchronization signal + ;VI_HSYNC_NEG_HIGH = 0, + ;VI_HSYNC_NEG_LOW +VsyncValid =1 ;Attribute of the valid vertical synchronization signal + ;VI_VSYNC_NORM_PULSE = 0, + ;VI_VSYNC_VALID_SINGAL, +VsyncValidNeg =0;Polarity of the valid vertical synchronization signal + ;VI_VSYNC_VALID_NEG_HIGH = 0, + ;VI_VSYNC_VALID_NEG_LOW +Timingblank_HsyncHfb =0 ;Horizontal front blanking width +Timingblank_HsyncAct =1920 ;Horizontal effetive width +Timingblank_HsyncHbb =0 ;Horizontal back blanking width +Timingblank_VsyncVfb =0 ;Vertical front blanking height +Timingblank_VsyncVact =1080 ;Vertical effetive width +Timingblank_VsyncVbb=0 ;Vertical back blanking height +Timingblank_VsyncVbfb =0 ;Even-field vertical front blanking height(interlace, invalid progressive) +Timingblank_VsyncVbact=0 ;Even-field vertical effetive width(interlace, invalid progressive) +Timingblank_VsyncVbbb =0 ;Even-field vertical back blanking height(interlace, invalid progressive) +InputDataType=1 ;VI_DATA_TYPE_YUV = 0,VI_DATA_TYPE_RGB = 1, +DataRev =FALSE ;Data reverse. FALSE = 0; TRUE = 1 +DevRect_x=200 +DevRect_y=20 +DevRect_w=1920 +DevRect_h=1080 diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/libsns_os02g10.so b/general/package/goke-osdrv-gk7205v200/files/sensor/libsns_os02g10.so new file mode 100644 index 0000000000000000000000000000000000000000..735d92dc64b40c6131013b3a669ed1c5e5a0e8a2 GIT binary patch literal 43548 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 Date: Fri, 17 Jan 2025 12:20:23 +0300 Subject: [PATCH 24/29] Add GC4023 for Gk7205v200 (#1665) --- .../files/sensor/config/gc4023_i2c_4M.ini | 66 ++++++++++++++++++ .../files/sensor/libsns_gc4023.so | Bin 0 -> 52728 bytes 2 files changed, 66 insertions(+) create mode 100644 general/package/goke-osdrv-gk7205v200/files/sensor/config/gc4023_i2c_4M.ini create mode 100644 general/package/goke-osdrv-gk7205v200/files/sensor/libsns_gc4023.so diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc4023_i2c_4M.ini b/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc4023_i2c_4M.ini new file mode 100644 index 00000000..06077f2b --- /dev/null +++ b/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc4023_i2c_4M.ini @@ -0,0 +1,66 @@ +[sensor] +Sensor_type=stSnsGc4023Obj +Mode=WDR_MODE_NONE +DllFile=libsns_gc4023.so + +[mode] +input_mode=INPUT_MODE_MIPI +raw_bitness=10 + +[mipi] +lane_id = 0|2|-1|-1|-1|-1|-1|-1| ;lane_id: -1 - disable + +[isp_image] +Isp_FrameRate=25 +Isp_Bayer=BAYER_RGGB + +[vi_dev] +Input_mod=VI_MODE_MIPI +Work_mod = VI_WORK_MODE_1Multiplex +Mask_num = 2 +Mask_0 = 0xFFC00000 +Mask_1 = 0x0 +Scan_mode = VI_SCAN_PROGRESSIVE +Data_seq = VI_DATA_SEQ_YUYV +Vsync =1 ; vertical synchronization signal + ;VI_VSYNC_PULSE, +VsyncNeg=1 ;Polarity of the vertical synchronization signal + ;VI_VSYNC_NEG_HIGH = 0, + ;VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E +Hsync =0 ;Attribute of the horizontal synchronization signal + ;VI_HSYNC_VALID_SINGNAL = 0, + ;VI_HSYNC_PULSE, +HsyncNeg =0 ;Polarity of the horizontal synchronization signal + ;VI_HSYNC_NEG_HIGH = 0, + ;VI_HSYNC_NEG_LOW +VsyncValid =1 ;Attribute of the valid vertical synchronization signal + ;VI_VSYNC_NORM_PULSE = 0, + ;VI_VSYNC_VALID_SINGAL, +VsyncValidNeg =0;Polarity of the valid vertical synchronization signal + ;VI_VSYNC_VALID_NEG_HIGH = 0, + ;VI_VSYNC_VALID_NEG_LOW +Timingblank_HsyncHfb =0 ;Horizontal front blanking width +Timingblank_HsyncAct =2560 ;Horizontal effetive width +Timingblank_HsyncHbb =0 ;Horizontal back blanking width +Timingblank_VsyncVfb =0 ;Vertical front blanking height +Timingblank_VsyncVact =1440 ;Vertical effetive width +Timingblank_VsyncVbb=0 ;Vertical back blanking height +Timingblank_VsyncVbfb =0 ;Even-field vertical front blanking height(interlace, invalid progressive) +Timingblank_VsyncVbact=0 ;Even-field vertical effetive width(interlace, invalid progressive) +Timingblank_VsyncVbbb =0 ;Even-field vertical back blanking height(interlace, invalid progressive) +InputDataType=1 ;VI_DATA_TYPE_YUV = 0,VI_DATA_TYPE_RGB = 1, +DataRev =FALSE ;Data reverse. FALSE = 0; TRUE = 1 +DevRect_w=2560 +DevRect_h=1440 +DevRect_x=0 +DevRect_y=0 + +Combine_mode =0 ;Y/C composite or separation mode + ;VI_COMBINE_COMPOSITE = 0 /*Composite mode */ + ;VI_COMBINE_SEPARATE, /*Separate mode */ +Comp_mode =0 ;Component mode (single-component or dual-component) + ;VI_COMP_MODE_SINGLE = 0, /*single component mode */ + ;VI_COMP_MODE_DOUBLE = 1, /*double component mode */ +Clock_edge =1 ;Clock edge mode (sampling on the rising or falling edge) + ;VI_CLK_EDGE_SINGLE_UP=0, /*rising edge */ + ;VI_CLK_EDGE_SINGLE_DOWN, /*falling edge */ diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/libsns_gc4023.so b/general/package/goke-osdrv-gk7205v200/files/sensor/libsns_gc4023.so new file mode 100644 index 0000000000000000000000000000000000000000..f2d97bf9117b2283616a5c8a0ace63a3ae5324fe GIT binary patch literal 52728 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 ^hF^-ceW{k8$-l}t zLG&BsMtRM;IOUSeL$FN%-uKS8+Nb? zJ@^xn`mcC4_iX&s{9h2}ob$7`+<$jFBWI7romk!-+{+gb2kST);U`L2jj%z7`O`<|GnDGIOE@jOc@S$ z0yDe|v&)?G{PrXLaMm#r_E|9Sy-#p`2rOg2F!5@QjMy)9}5pqV|XT znA0yCjd^4|cPjmLBi&#p?v0t>h>@Jh-8jOWFLzAV^?=&|>~b=LI~898|CdsObb#v$ z_aXYW0Jdf3n68(Ke{Nx}Jsd0JuXt6yH=qq5TN#({h9p|X^~Dzs6@%s-j`cMZ>yNWz zXYZOd3=9kj4dWM1+J%IMhLlHGaKZ>{ZMCYEp`78;=|s`O4&iFolqplvov-yTUF-yI z`}Xbq9T!x#svfm{pxLQcbyaTmE2SDs$&ODLp%AWm)n_0*wW zbhK3U{}Vm`8To&so)7i4N|o|)VZi@(_$Bq&{eL(7vO4`gg$q&w&ux)7@=bFVo$hQCU@@%(Kmp39lJYlr7|4tEsm&n4oE*3Y4n@vM)z zj!usC|2*)=(8Dy%UVs-i%N@g?LyM2lF>nfZ-Drhl_%oyi{gRHLqcnVX*dH8@;ZLFe z8}Jk{UaP+=t#GV;Cy5!Y>xXBIChj`Z3dis#@T4*kEsCK6caFX>pY{J3o@e&QQ_G>+ z__m-Gj^#f}Zjm;$K8?U`fH^-};aK|)L({H9Ytq5k4KY^(PeUD!?E?-%&#+-XGmzfJ ze&8}?Xf`;CqOl$jv>wQf3V~)}99_Vh5peGH`=5EawAbogm4mfe=Agu2nqV-+*Ivz^Z^*jjAp&gFB zLDUW{SV+&oG49_$f@y_gnnxFm&{BE@PUZg!Y%pbdOJ9udYWfSD%Ky%IrWp-J?>?gU z;Z**2#h<3EQ@ZY6f}CmF^R0aQk3#an`%lOsAoo3+q{b7y& z{|^5pIQ&bEzn$?+zONzG=vJHq*rwqtxVJN(@zwZ8xRsD_8@2kK@oaonqJOh-nqbx6 z@c$<4ua<-R-h~AHK;wVs{A~U{ASTF$g>dTlI^$Ph_qZ769Qr}R%+dJY8PE0vi(rfC zh&LyuYy9twUq}{0|9y=ADock``QI5o7q*ePSQGr{1UQxdo$*Ywo&(;liL(=_8vi@v zCxf?Vfx9bl`Kt22Gkzj$J5xdbMw$et^1m~lY2@R;^QB}Iv#o`_QUfi&Rl|nOn!yaKK(EKEcNKa))ARWY zd7An>6G}dNFDD^^{ideAq~@=Oj^Dn0V7u2Hm&Db3k8(x7To;2ynO$fG)cguPUyc3e zUv=-I{xVC*%kD)jUk$NM%2DMgo|xg=T=by8Voij-Ta}J4$2%^*dvOHdE6P4AOX&vH zgQ+0uogP*Jv$*tSFNUM>{Ex-63y+rsLd_-&p=UD%+b17i_lW1d?x*#lU==D09{9VS z`Z$}@7AJFh2>tMuPz=uGqzY4ndBTUnCgF48pm0X`9&ZWd;q=XOLC4SDc!+gGKhcC9 zxZqzqYm--D32KeqV-L_xIH+eV_I?Yof8K^w;0(zGC6&VR@CpqCPsZb^#RkZopCG$y z3!Q{GVX<&X$Q3-qp5hcS11EA?;F=;Qf>qc*i5f z>Ww!G*4ReKos|YIUX|)pZsyw8ZEBU1Rcp9Utxjt!t@*kq_4=vK_dYpwYx*VDztdoJ zV^gzFTMTUF-uBnPBke!yxU=)Qu0qdGdcD)Ta-XYx*YqF$R$IJ0aChL*!Ry1PMw`cr1Yy8|=3(hW@x}@te_Z5#< z{j&D^4c9k^Z^`}m-A_!PuG#+Dj*Fj<`l9le`*%m}skHC-{&5-24m~{l#nE?o3)_yl(m3ZuV=tJKgTSeJ}R6vDq_o zR^)z`cRc@k!K3@uhjkxyC=CC7V$qt%N1oh%YWSnUv;HL${@n8Xa;af=Gf)Ei&&Ne{ zfRK&drUS|r9gfk34sV846}&L-&4qS2kJT5m9xIFz#tYMg1;TP+qp)4rgSW%Z2v>0O z>MqV*JrPO;qbQ42#aehrjGeh^B?gKe#V(k$Q1MOi9h|$06r)AEI6_PiM~f-qyW)6p zg7_Y0becF5=dk993&i)uB{+?>LR>Ab6*q{R#gB0+YrFWl_=UI|XS4QU?hlDa@SfQT z@uYYf=d`{RFW{`!W$}vmz4)VeUA!UQ6n_@8#9QKR@mKMVcvrj!_Z#|_gR@+@VxE{U z7U2D~`{Dzf?0O^?ioc6R;$!g%XsQ@*t(Ay>ilrjax#`{Xw{<)5zFJS6hb|j+PlNL+ zcZBN5D#2gKfOhEu`JMq=)<*16u0acYn{KByg%v^#agtyXR?z^gFUPRn%!JHef;0uB z3Fy0sPQZu_5OSe^*P=gSJ)1z{U|mYZy7wLAege+Rg$g%>*M*BXXJ>|to{M*2dqU?5 zgAHpJY|y>w9vT4NYbxxgy->%euwC_nExZZ1Y#8*Ddn5o)0KJ5*c*AcSY~puNas+JY z-lP_+RRh3%S0Q~DLjzg}9cLqLg>`5?>4X33tqg0w7iyXX>hMBaOX*BO5th@2&_rjz zD(nSIIr~4}j%e-I&=RK7XLKqg#fLa2coBM07g&n)5Gqy4>sW;j<9SUwQcQs)Swow^ zHaQFJ^hO;z{0DGH^yV1W!O66Y&c!LfT^O&QFivmcsX+y66*Vx<_am zoE97{6ydyLZS-a}Y;}X7*^aarhs&Inc-NVdmyR zADbq4iRZus7Jb?z&63;ZQVz+S&)bR&t zNyp;t%TP$m8RGZC+rmBQ7Y)&$v)B=^H;VH~Z8{u#(q_Uwp|iLf{msB>OFh>3kD;;5 z2bCSizNZ8BeI`iXSH#79W?Er(KY>Ot5;QagPhPL1lyNkhj=&?MQ9=QpxOmWW&{*PN z`|F9PPE)WKrZ~fSigpA4zJn2qpk?S`DzMF9sSQHPb&$zH*kLvjz82mPPSU;@jrE|= z08T*-VaZ&8dYVFq^Tc_~Ho_6wiT(}F6{rH1JI_UppUtr(^W!L!ttIRhh6_Jo z-kxK;MuLL;KtU}*K`Y6x(DruG*YL*cT;Vx(y)N`?&~g~*gf_f^R(uY9{~erUeG}(Q zx8l_5GVB*KG4Jn!f(GJA!D8&SszRG9pzjKm#czf7!anfjpV%pWfL@M6ul8d{+6wxt zg12kCh|h(Q!X0R^zOc3*#eQJ}c7#7eXO4iyq60WTRqQ8j03Ch|nsR{-dKvoOZBSST zaKfLE9+kuc;xCZO4?xQeXc1`V0BGnKw9498K~K{_;kXbl9ur-P^wyPz%DH7x+I z97Rt$(M{OfY!MoZ8*%z}3%EZUJTe`6VIr)_8=!mE22Vbq6NM_`G(j&gDRmBfIRg8# z-jGC7!Ph2?;}3L*P=FJ#^`Rr{gaBV}(yn>nOftkKc8q;;u4^-GoI1UTKUGQos zN{}F9nEXh`KCvGCka`O{h2Fv;>@sg5MQ=zc6DY_Xv^)W}1|Qf_Jn=^J+o0rb;FkAc zY4?S0Vni7oASuqGjI}7^kPrcG7yw#dh4wXrl&c0B>4SD;lGgMy@a4C7M>-FZg3=w3 z9$g@(8h}Egz%K=)7fw6B0ZnBcc9k<|b?i)MLFR^_4R1lq-2q zfDV7-PcuFOSN{YW9ELr2A0bDWCk_#JK>B}9`{TLpJ=hQ~0WX4rmf+p*bgWQk#rnec zknl|)fli?%A7Ed<3HAMsolP43o;C-iy9i&vN+UtCZ^Sr_#NRHw2RU$_$QY$hK+98w zKQQ`T@Z9-JtPXMLX()+7dw1hB`Rm}yr_eO+fJU2Pom`LHeZf(In4bhl&0AQ3Cd0

i949`j8V7(Q^yv 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%0A>?N{>wd9A zDi8C2_B26vC?TY`82b^qJ;uyQ)5*U?!ki!4B}{s-FwIYTT*9Q!EK1Xp$Zt9FlkW#- zO7v?$*MXf75$#b@mX>Gw)e>g@$~V;M*k3Wx@jzW`4iVz`HZ>dl~pE;PcVn^6m0Xg1$I@I7Q-1 z*~-bl!Z{Hrk}&f-3%CaTp#Wjl2R}<-u6J4XBjQlIKOTu0s+Q1HfK%lxr4sD_n`p#@TG0)t8LyTkE7Ezg{LBEd*177Qa3nj!(P zYG^0eN5Jq!BvYmJ>9MAiybY0zt1VJ0m>T@PfE=z*@q8sN){P*|YQox9 z7yy|JOJe#E?(-7etzB9SJyNPK2d0*y546JouoH-KGsjs<9e8+K{kWA3bbVowiSqNtC%7wca)u zrqtO9U7)6USV~HNCC@BdU5?j3yF;VGU3N5RugYAkP(WoN{$-MGXi%po{WYQ~K zwh78`bDT`pxi)Kth0ZXx1qufAxmwU_Yb~q=Bb_R%VjJ(o^-z>XKhT-l5!5<`jf1<+ zUEicOx|gfh;36Q)4Ymw35OaxWpd89 zIZb1uwE0se+k*MRVoA1$%HUdn#q5!7q=pI16P=X#dlR-rR;D3Urda7*Q5xD>>Af({ z`c_-3Oxdzh!8?-e)iCZ~oP*EjzI252oFXo;=R74?1v-WjotL`QBs=LNE0&dYeaSskw zX}*gTn^xbtWCWrSM|om$Ap;R#JSaybjG(SZ<(Oz9Zphd&nU!Pg632ASpSJcg;xMtT zGgm6j-hYCgIzy2#CIBc6ZNN3+2uYZ|uTza`M%+qN)W^N7%C67Suw31aXbdxb$B?8f z?W8p@RKf_4AY$3CSypbae=94o?ATxy?2GoPhGJT>jgU#YSaP9kePo!wWwzSTV%ah@ zp)-|WW6pLMmZAp`a$wU=+`J2iZN936Va7?x@IGL5!V$Y5>c&xMC|JxILpq~UWb}n# z!isA=W?j2P2&?&`F3sq|&j$8|!Dd}Cs~3^dt;Y7_{fjmWi5U!9&3qg@rW=|(n46p7Ij7-ZAp0zLn*?_JA}owQsi!FETUy? zz?+C;o&LQYALosQ&xYS+`%3JGu*EeU_e%69!v7g(P07c1%=BFdXY%p!7`I8}ql_fmWeLQFoslcwi6S>aFw(^cR<&%Bbvch&SQ2#b6fPhSPkGqMcx9X7oa zVdlrQc%?fBp4({h9Rd%1Kf)qC@{NOE0Z%@r%jX{SI}j!x_kM!UhcMH}7T0`M!RHkd z5f)D5djTQ@pEz^N_jOnVx9}m_ z)E)WwY$zWQ2M`wd@ydGj!?S$kGoKM{#Iq%aZAU)(U&9MNK6_ff5zlv}=L#a-t>9z2 zOpni?+BYFtgoP7)4L0n+}EM*si- literal 0 HcmV?d00001 From 10cf87ec6faf6999d449dc3df7b882a52d3ed3db Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov Date: Sat, 18 Jan 2025 09:38:28 +0300 Subject: [PATCH 25/29] Add GC5603 for Gk7205v300 (#1667) --- .../files/sensor/config/gc5603_i2c_5M.ini | 67 ++++++++++++++++++ .../files/sensor/libsns_gc5603.so | Bin 0 -> 54096 bytes 2 files changed, 67 insertions(+) create mode 100644 general/package/goke-osdrv-gk7205v200/files/sensor/config/gc5603_i2c_5M.ini create mode 100644 general/package/goke-osdrv-gk7205v200/files/sensor/libsns_gc5603.so diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc5603_i2c_5M.ini b/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc5603_i2c_5M.ini new file mode 100644 index 00000000..35603b21 --- /dev/null +++ b/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc5603_i2c_5M.ini @@ -0,0 +1,67 @@ +[sensor] +Sensor_type=stSnsGc5603Obj +Mode=WDR_MODE_NONE +DllFile=libsns_gc5603.so + +[mode] +input_mode=INPUT_MODE_MIPI +raw_bitness=10 +clock=27MHz + +[mipi] +lane_id = 0|1|-1|-1|-1|-1|-1|-1| ;lane_id: -1 - disable + +[isp_image] +Isp_FrameRate=25 +Isp_Bayer=BAYER_RGGB + +[vi_dev] +Input_mod=VI_MODE_MIPI +Work_mod = VI_WORK_MODE_1Multiplex +Mask_num = 2 +Mask_0 = 0xFFC00000 +Mask_1 = 0x0 +Scan_mode = VI_SCAN_PROGRESSIVE +Data_seq = VI_DATA_SEQ_YUYV +Vsync =1 ; vertical synchronization signal + ;VI_VSYNC_PULSE, +VsyncNeg=1 ;Polarity of the vertical synchronization signal + ;VI_VSYNC_NEG_HIGH = 0, + ;VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E +Hsync =0 ;Attribute of the horizontal synchronization signal + ;VI_HSYNC_VALID_SINGNAL = 0, + ;VI_HSYNC_PULSE, +HsyncNeg =0 ;Polarity of the horizontal synchronization signal + ;VI_HSYNC_NEG_HIGH = 0, + ;VI_HSYNC_NEG_LOW +VsyncValid =1 ;Attribute of the valid vertical synchronization signal + ;VI_VSYNC_NORM_PULSE = 0, + ;VI_VSYNC_VALID_SINGAL, +VsyncValidNeg =0;Polarity of the valid vertical synchronization signal + ;VI_VSYNC_VALID_NEG_HIGH = 0, + ;VI_VSYNC_VALID_NEG_LOW +Timingblank_HsyncHfb =0 ;Horizontal front blanking width +Timingblank_HsyncAct =2880 ;Horizontal effetive width +Timingblank_HsyncHbb =0 ;Horizontal back blanking width +Timingblank_VsyncVfb =0 ;Vertical front blanking height +Timingblank_VsyncVact =1620 ;Vertical effetive width +Timingblank_VsyncVbb=0 ;Vertical back blanking height +Timingblank_VsyncVbfb =0 ;Even-field vertical front blanking height(interlace, invalid progressive) +Timingblank_VsyncVbact=0 ;Even-field vertical effetive width(interlace, invalid progressive) +Timingblank_VsyncVbbb =0 ;Even-field vertical back blanking height(interlace, invalid progressive) +InputDataType=1 ;VI_DATA_TYPE_YUV = 0,VI_DATA_TYPE_RGB = 1, +DataRev =FALSE ;Data reverse. FALSE = 0; TRUE = 1 +DevRect_w=2880 +DevRect_h=1620 +DevRect_x=0 +DevRect_y=0 + +Combine_mode =0 ;Y/C composite or separation mode + ;VI_COMBINE_COMPOSITE = 0 /*Composite mode */ + ;VI_COMBINE_SEPARATE, /*Separate mode */ +Comp_mode =0 ;Component mode (single-component or dual-component) + ;VI_COMP_MODE_SINGLE = 0, /*single component mode */ + ;VI_COMP_MODE_DOUBLE = 1, /*double component mode */ +Clock_edge =1 ;Clock edge mode (sampling on the rising or falling edge) + ;VI_CLK_EDGE_SINGLE_UP=0, /*rising edge */ + ;VI_CLK_EDGE_SINGLE_DOWN, /*falling edge */ diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/libsns_gc5603.so b/general/package/goke-osdrv-gk7205v200/files/sensor/libsns_gc5603.so new file mode 100644 index 0000000000000000000000000000000000000000..f09abaa0570428cbc5907a39317d1b7240478ccc GIT binary patch literal 54096 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

V$|K~Fa*CWP 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

$Nk?uK=ZiCoAK@gVmHU}_ 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⁢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 Date: Sat, 18 Jan 2025 15:55:24 +0300 Subject: [PATCH 26/29] Limit the number of channels supported by the VENC module. (#1668) --- general/package/goke-osdrv-gk7205v200/files/script/load_goke | 4 ++-- .../hisilicon-osdrv-hi3516ev200/files/script/load_hisilicon | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/general/package/goke-osdrv-gk7205v200/files/script/load_goke b/general/package/goke-osdrv-gk7205v200/files/script/load_goke index 03725292..fe2d44c8 100755 --- a/general/package/goke-osdrv-gk7205v200/files/script/load_goke +++ b/general/package/goke-osdrv-gk7205v200/files/script/load_goke @@ -170,7 +170,7 @@ insert_ko() { insmod gk7205v200_sys.ko # insmod gk7205v200_tde.ko insmod gk7205v200_rgn.ko - insmod gk7205v200_vgs.ko + insmod gk7205v200_vgs.ko max_vgs_job=20 max_vgs_node=20 max_vgs_task=20 insmod gk7205v200_vi.ko insert_isp insmod gk7205v200_vpss.ko @@ -179,7 +179,7 @@ insert_ko() { insmod gk7205v200_chnl.ko insmod gk7205v200_vedu.ko insmod gk7205v200_rc.ko - insmod gk7205v200_venc.ko + insmod gk7205v200_venc.ko VencMaxChnNum=3 insmod gk7205v200_h264e.ko insmod gk7205v200_h265e.ko insmod gk7205v200_jpege.ko diff --git a/general/package/hisilicon-osdrv-hi3516ev200/files/script/load_hisilicon b/general/package/hisilicon-osdrv-hi3516ev200/files/script/load_hisilicon index 3fc119f9..a1fbe4e5 100755 --- a/general/package/hisilicon-osdrv-hi3516ev200/files/script/load_hisilicon +++ b/general/package/hisilicon-osdrv-hi3516ev200/files/script/load_hisilicon @@ -173,7 +173,7 @@ insert_ko() { modprobe open_sys # modprobe open_tde modprobe open_rgn - modprobe open_vgs + modprobe open_vgs max_vgs_job=20 max_vgs_node=20 max_vgs_task=20 modprobe open_vi insert_isp modprobe open_vpss @@ -182,7 +182,7 @@ insert_ko() { modprobe open_chnl modprobe open_vedu modprobe open_rc - modprobe open_venc + modprobe open_venc VencMaxChnNum=3 modprobe open_h264e modprobe open_h265e modprobe open_jpege From a74178cbb9bc76c721afae762f85ac05426e0c02 Mon Sep 17 00:00:00 2001 From: viktorxda <35473052+viktorxda@users.noreply.github.com> Date: Sat, 18 Jan 2025 13:56:36 +0100 Subject: [PATCH 27/29] [no ci] sysupgrade: add force_all shortcut (#1666) --- general/overlay/usr/sbin/sysupgrade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/general/overlay/usr/sbin/sysupgrade b/general/overlay/usr/sbin/sysupgrade index ab01fad4..2b0a3a9c 100755 --- a/general/overlay/usr/sbin/sysupgrade +++ b/general/overlay/usr/sbin/sysupgrade @@ -3,7 +3,7 @@ # OpenIPC.org | 2024 # -scr_version=1.0.42 +scr_version=1.0.43 args=" $@" @@ -229,7 +229,7 @@ Where: --force_md5 Do not validate MD5 hash. --force_soc Do not validate processor. --force_ver Do not validate release version. - --force_all Do not validate anything. + -f, --force_all Do not validate anything. -n, --wipe_overlay Wipe overlay partition. -x, --no_reboot Do not reboot after updating. -z, --no_update Do not update self. @@ -252,7 +252,7 @@ reboot_system() { for i in "$@"; do case $i in - --force_all) + -f | --force_all) skip_md5=1 skip_soc=1 skip_ver=1 From 07c51bc077635b684a22b0993c787512f59fab28 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov Date: Sat, 18 Jan 2025 21:15:04 +0300 Subject: [PATCH 28/29] [no_ci] Add new OS02G10, fix sensor configs (#1669) --- .../files/sensor/config/gc4023_i2c_4M.ini | 5 +++++ .../files/sensor/config/os02g10_i2c_1080p.ini | 2 +- .../files/sensor/libsns_os02g10.so | Bin 43548 -> 48244 bytes 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc4023_i2c_4M.ini b/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc4023_i2c_4M.ini index 06077f2b..16a82872 100644 --- a/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc4023_i2c_4M.ini +++ b/general/package/goke-osdrv-gk7205v200/files/sensor/config/gc4023_i2c_4M.ini @@ -64,3 +64,8 @@ Comp_mode =0 ;Component mode (single-component or dual-component) Clock_edge =1 ;Clock edge mode (sampling on the rising or falling edge) ;VI_CLK_EDGE_SINGLE_UP=0, /*rising edge */ ;VI_CLK_EDGE_SINGLE_DOWN, /*falling edge */ +[vi_chn] +int_type=FRAME_INTERRUPT_EARLY_END_ONE_BUF +early_line=1080 +vpss_lowdelay=true +line_cnt=128 diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/config/os02g10_i2c_1080p.ini b/general/package/goke-osdrv-gk7205v200/files/sensor/config/os02g10_i2c_1080p.ini index 9357e406..44a7c3db 100644 --- a/general/package/goke-osdrv-gk7205v200/files/sensor/config/os02g10_i2c_1080p.ini +++ b/general/package/goke-osdrv-gk7205v200/files/sensor/config/os02g10_i2c_1080p.ini @@ -1,5 +1,5 @@ [sensor] -Sensor_type=stSnsOv02g10Obj +Sensor_type=stSnsOs02g10Obj Mode=WDR_MODE_NONE DllFile=libsns_os02g10.so diff --git a/general/package/goke-osdrv-gk7205v200/files/sensor/libsns_os02g10.so b/general/package/goke-osdrv-gk7205v200/files/sensor/libsns_os02g10.so index 735d92dc64b40c6131013b3a669ed1c5e5a0e8a2..4e1a0d7272897334819c8571365b4585634ed5fe 100644 GIT binary patch literal 48244 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 literal 43548 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 Date: Sun, 19 Jan 2025 02:20:08 +0300 Subject: [PATCH 29/29] Experimental change for SQUASHFS (#1670) --- br-ext-chip-goke/board/gk7205v200/gk7205v200.generic.config | 2 +- br-ext-chip-goke/board/gk7205v200/gk7205v300.generic.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/br-ext-chip-goke/board/gk7205v200/gk7205v200.generic.config b/br-ext-chip-goke/board/gk7205v200/gk7205v200.generic.config index 9a064814..b6ec6e63 100644 --- a/br-ext-chip-goke/board/gk7205v200/gk7205v200.generic.config +++ b/br-ext-chip-goke/board/gk7205v200/gk7205v200.generic.config @@ -2423,7 +2423,7 @@ CONFIG_SQUASHFS_DECOMP_SINGLE=y CONFIG_SQUASHFS_XZ=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=1 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set diff --git a/br-ext-chip-goke/board/gk7205v200/gk7205v300.generic.config b/br-ext-chip-goke/board/gk7205v200/gk7205v300.generic.config index 925d1319..953af554 100644 --- a/br-ext-chip-goke/board/gk7205v200/gk7205v300.generic.config +++ b/br-ext-chip-goke/board/gk7205v200/gk7205v300.generic.config @@ -2425,7 +2425,7 @@ CONFIG_SQUASHFS_DECOMP_SINGLE=y CONFIG_SQUASHFS_XZ=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=1 # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set