From c087370d58aea5b49d6d8b95f4d3ad7557494536 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Wed, 27 Aug 2025 10:09:07 +0300 Subject: [PATCH 01/41] Create ssc335de_lite_dahua-hfw1230sp-v2_defconfig --- ...ssc335de_lite_dahua-hfw1230sp-v2_defconfig | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig b/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig new file mode 100644 index 000000000..d10285ffd --- /dev/null +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig @@ -0,0 +1,68 @@ +# 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-musleabihf" +BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y +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)/infinity6-ssc009b.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_WIREGUARD_LINUX_COMPAT=y +BR2_PACKAGE_WIREGUARD_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="ssc335de" +BR2_OPENIPC_SOC_FAMILY="infinity6" +BR2_OPENIPC_VARIANT="lite" +BR2_OPENIPC_FLASH_SIZE="8" + +# 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_LIBEVENT_OPENIPC=y +BR2_PACKAGE_LIBOGG_OPENIPC=y +BR2_PACKAGE_MAJESTIC_FONTS=y +BR2_PACKAGE_MAJESTIC_WEBUI=y +BR2_PACKAGE_MAJESTIC=y +BR2_PACKAGE_MBEDTLS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y +BR2_PACKAGE_QUIRC_OPENIPC=y +BR2_PACKAGE_SIGMASTAR_OSDRV_INFINITY6=y +BR2_PACKAGE_VTUND_OPENIPC=y +BR2_PACKAGE_YAML_CLI=y From e0be0983287eeb93b03c6e62998d57889989a137 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Wed, 27 Aug 2025 10:11:06 +0300 Subject: [PATCH 02/41] Create customizer.sh --- .../general/usr/share/openipc/customizer.sh | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/customizer.sh diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/customizer.sh b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/customizer.sh new file mode 100644 index 000000000..c2d54e786 --- /dev/null +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/customizer.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Perform basic settings on a known IP camera +# +# +# Set custom upgrade url +# +fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc335de_lite_dahua-hfw1230sp-v2-nor.tgz' +# +# +# Set custom majestic settings +# +cli -s .video0.codec h264 +cli -s .image.mirror false +cli -s .image.flip false +cli -s .nightMode.irCutPin1 79 +cli -s .nightMode.irCutPin2 78 +cli -s .nightMode.backlightPin 52 +cli -s .nightMode.colorToGray true +# + +exit 0 From 36bb5fbff186f6982cc5da042c7a08e57da63a37 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Thu, 28 Aug 2025 22:44:11 +0300 Subject: [PATCH 03/41] Create gpio.conf --- .../general/usr/share/openipc/gpio.conf | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf new file mode 100644 index 000000000..aca3c5e82 --- /dev/null +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf @@ -0,0 +1,5 @@ +ircut1=79 +ircut2=78 +led1=47 +led2=46 +light_ir=52 From 2cded837d96922d53434572c35411d372bec2222 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Thu, 28 Aug 2025 22:49:46 +0300 Subject: [PATCH 04/41] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bfbfbddfa..ced501e76 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ H3C TC2101 SSC337 JXQ03 RTL8188FU_USB NOR_16M done HB-WIFI-Z6 v1.2 T10 JXH62 RTL8188EU_USB NOR_8M in progress iFlytek XFP301-M T31ZX JXQ03 RTL8188FU_USB NOR_16 research Imilab EC3 CMSXJ25A SSC325 GC2053 MT7603UN_? NOR_16M in progress +Dahua IPC-HFW1230SP-V2 SSC335DE GC5023 NOR_16M done Imou IPC-C22E-S2-v2 SSC335DE GC2053 RTL8188FU_USB NOR_16M done Imou IPC-C22EP-S2 SSC325DE SC2239 RTL8188FU_USB NAND testing stage 1 Imou IPC-C22EP-S2 ? SSC325DE SC2335 RTL8188FU_USB NAND wait sensor driver From 43023474d755182237114a271b55ae43c9f00ff7 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 29 Aug 2025 00:55:32 +0300 Subject: [PATCH 05/41] Create ssc335de_lite.list --- .../scripts/excludes/ssc335de_lite.list | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list new file mode 100644 index 000000000..69db9de84 --- /dev/null +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list @@ -0,0 +1,38 @@ +/etc/sensors/gc2023.bin +/etc/sensors/gc4023.bin +/etc/sensors/gc4653.bin +/etc/sensors/imx307.bin +/etc/sensors/imx335.bin +/etc/sensors/jxf37.bin +/etc/sensors/jxq03.bin +/etc/sensors/sc200ai.bin +/etc/sensors/sc223a.bin +/etc/sensors/sc2335.bin +/etc/sensors/sc2336.bin +/etc/sensors/sc3338.bin +/etc/sensors/sc401ai.bin +# +/lib/modules/4.9.84/sigmastar/sensor_gc2053_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc2083_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc4023_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc4653_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_imx307_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_imx335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_jxf37_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_jxq03_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_os02g10_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc200ai_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2239_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc223a_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2336_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc3335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc3338_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc401ai_mipi.ko +# +/lib/modules/4.9.84/kernel/fs/lockd/lockd.ko +/lib/modules/4.9.84/kernel/fs/nfs/nfs.ko +/lib/modules/4.9.84/kernel/fs/nfs/nfsv3.ko +/lib/modules/4.9.84/kernel/fs/nfs_common/grace.ko +/lib/modules/4.9.84/kernel/net/sunrpc/sunrpc.ko +/lib/modules/4.9.84/sigmastar/sensor_gc5053_mipi.ko From 446ee6a2aa243e0c10661456931b05beebe91bcc Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 29 Aug 2025 00:59:51 +0300 Subject: [PATCH 06/41] Create ssc335de_lite.list --- .../scripts/excludes/ssc335de_lite.list | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list index 69db9de84..1fdffc877 100644 --- a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list @@ -1,34 +1,6 @@ /etc/sensors/gc2023.bin -/etc/sensors/gc4023.bin -/etc/sensors/gc4653.bin -/etc/sensors/imx307.bin -/etc/sensors/imx335.bin -/etc/sensors/jxf37.bin -/etc/sensors/jxq03.bin -/etc/sensors/sc200ai.bin -/etc/sensors/sc223a.bin -/etc/sensors/sc2335.bin -/etc/sensors/sc2336.bin -/etc/sensors/sc3338.bin -/etc/sensors/sc401ai.bin # /lib/modules/4.9.84/sigmastar/sensor_gc2053_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_gc2083_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_gc4023_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_gc4653_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_imx307_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_imx335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_jxf37_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_jxq03_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_os02g10_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc200ai_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2239_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc223a_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2336_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc3335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc3338_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc401ai_mipi.ko # /lib/modules/4.9.84/kernel/fs/lockd/lockd.ko /lib/modules/4.9.84/kernel/fs/nfs/nfs.ko From 40313aaafc0559cf8d8f719b410a478e012671b0 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 29 Aug 2025 01:46:27 +0300 Subject: [PATCH 07/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ced501e76..74df249fb 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ H3C TC2101 SSC337 JXQ03 RTL8188FU_USB NOR_16M done HB-WIFI-Z6 v1.2 T10 JXH62 RTL8188EU_USB NOR_8M in progress iFlytek XFP301-M T31ZX JXQ03 RTL8188FU_USB NOR_16 research Imilab EC3 CMSXJ25A SSC325 GC2053 MT7603UN_? NOR_16M in progress -Dahua IPC-HFW1230SP-V2 SSC335DE GC5023 NOR_16M done +Dahua IPC-HFW1230SP-V2 SSC335DE GC2023 NOR_16M done Imou IPC-C22E-S2-v2 SSC335DE GC2053 RTL8188FU_USB NOR_16M done Imou IPC-C22EP-S2 SSC325DE SC2239 RTL8188FU_USB NAND testing stage 1 Imou IPC-C22EP-S2 ? SSC325DE SC2335 RTL8188FU_USB NAND wait sensor driver From ff6a41de5afe4bd5786d3b512bcaaa239b57f71b Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 29 Aug 2025 11:03:20 +0300 Subject: [PATCH 08/41] Update ssc335de_lite.list --- .../general/scripts/excludes/ssc335de_lite.list | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list index 1fdffc877..05f671623 100644 --- a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list @@ -1,10 +1,6 @@ -/etc/sensors/gc2023.bin -# -/lib/modules/4.9.84/sigmastar/sensor_gc2053_mipi.ko -# + /lib/modules/4.9.84/kernel/fs/lockd/lockd.ko /lib/modules/4.9.84/kernel/fs/nfs/nfs.ko /lib/modules/4.9.84/kernel/fs/nfs/nfsv3.ko /lib/modules/4.9.84/kernel/fs/nfs_common/grace.ko /lib/modules/4.9.84/kernel/net/sunrpc/sunrpc.ko -/lib/modules/4.9.84/sigmastar/sensor_gc5053_mipi.ko From f1f5d9e33f63294fc13147ce927efb44386a6504 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 29 Aug 2025 11:07:50 +0300 Subject: [PATCH 09/41] Update ssc335de_lite.list --- .../scripts/excludes/ssc335de_lite.list | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list index 05f671623..6fef4cb3d 100644 --- a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/scripts/excludes/ssc335de_lite.list @@ -1,4 +1,33 @@ - +/etc/sensors/gc4023.bin +/etc/sensors/gc4653.bin +/etc/sensors/imx307.bin +/etc/sensors/imx335.bin +/etc/sensors/jxf37.bin +/etc/sensors/jxq03.bin +/etc/sensors/sc200ai.bin +/etc/sensors/sc223a.bin +/etc/sensors/sc2335.bin +/etc/sensors/sc2336.bin +/etc/sensors/sc3338.bin +/etc/sensors/sc401ai.bin +# +/lib/modules/4.9.84/sigmastar/sensor_gc2083_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc4023_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc4653_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_imx307_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_imx335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_jxf37_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_jxq03_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_os02g10_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc200ai_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2239_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc223a_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2336_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc3335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc3338_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc401ai_mipi.ko +# /lib/modules/4.9.84/kernel/fs/lockd/lockd.ko /lib/modules/4.9.84/kernel/fs/nfs/nfs.ko /lib/modules/4.9.84/kernel/fs/nfs/nfsv3.ko From c757508c8926e0ca31635318e5f8b1f46b75d77f Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 29 Aug 2025 11:11:46 +0300 Subject: [PATCH 10/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 74df249fb..28d574f19 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ H3C TC2101 SSC337 JXQ03 RTL8188FU_USB NOR_16M done HB-WIFI-Z6 v1.2 T10 JXH62 RTL8188EU_USB NOR_8M in progress iFlytek XFP301-M T31ZX JXQ03 RTL8188FU_USB NOR_16 research Imilab EC3 CMSXJ25A SSC325 GC2053 MT7603UN_? NOR_16M in progress -Dahua IPC-HFW1230SP-V2 SSC335DE GC2023 NOR_16M done +Dahua IPC-HFW1230SP-V2 SSC335DE GC2053 NOR_16M done Imou IPC-C22E-S2-v2 SSC335DE GC2053 RTL8188FU_USB NOR_16M done Imou IPC-C22EP-S2 SSC325DE SC2239 RTL8188FU_USB NAND testing stage 1 Imou IPC-C22EP-S2 ? SSC325DE SC2335 RTL8188FU_USB NAND wait sensor driver From 6d81e8ad477e8152efe64c9502ab7711fec630ab Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 29 Aug 2025 12:04:23 +0300 Subject: [PATCH 11/41] add gpio for reset button --- .../general/usr/share/openipc/gpio.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf index aca3c5e82..1e71ff24c 100644 --- a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf @@ -1,3 +1,4 @@ +button=66 ircut1=79 ircut2=78 led1=47 From f420dab5fef6a11eb936cc472417c6e79c24b234 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 29 Aug 2025 12:11:30 +0300 Subject: [PATCH 12/41] add gpio for mmc --- .../general/usr/share/openipc/gpio.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf index 1e71ff24c..ac4c5f66a 100644 --- a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf @@ -4,3 +4,4 @@ ircut2=78 led1=47 led2=46 light_ir=52 +mmc_pwr=17 From a7278fd9dc723c0dd125d4eef361e992aa8d1cf5 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Sat, 30 Aug 2025 12:51:46 +0300 Subject: [PATCH 13/41] Update ssc335de_lite_dahua-hfw1230sp-v2_defconfig --- .../configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig | 5 ----- 1 file changed, 5 deletions(-) diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig b/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig index d10285ffd..ed4ca5606 100644 --- a/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig @@ -34,11 +34,6 @@ BR2_PACKAGE_WIREGUARD_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" From 115f21ec46bd9d5513b505bf61f13a0db56f69ee Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Sat, 30 Aug 2025 12:52:03 +0300 Subject: [PATCH 14/41] Update gpio.conf --- .../general/usr/share/openipc/gpio.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf index d5a4e313b..ac4c5f66a 100644 --- a/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/general/usr/share/openipc/gpio.conf @@ -1,4 +1,4 @@ -utton=66 +button=66 ircut1=79 ircut2=78 led1=47 From ac024661eb5b513b0bdd2b744ec4008a3c776cb7 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Sun, 22 Mar 2026 14:12:54 +0300 Subject: [PATCH 15/41] Update ssc335de_lite_dahua-hfw1230sp-v2_defconfig --- .../configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig b/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig index ed4ca5606..beb8c3488 100644 --- a/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig +++ b/devices/ssc335de_lite_dahua-hfw1230sp-v2/br-ext-chip-sigmastar/configs/ssc335de_lite_dahua-hfw1230sp-v2_defconfig @@ -19,7 +19,7 @@ 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)/infinity6-ssc009b.config" +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(EXTERNAL_VENDOR)/board/$(OPENIPC_SOC_FAMILY)/infinity6b0-ssc009b.config" BR2_LINUX_KERNEL_UIMAGE=y BR2_LINUX_KERNEL_XZ=y @@ -38,7 +38,7 @@ BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y # OpenIPC BR2_OPENIPC_SOC_VENDOR="sigmastar" BR2_OPENIPC_SOC_MODEL="ssc335de" -BR2_OPENIPC_SOC_FAMILY="infinity6" +BR2_OPENIPC_SOC_FAMILY="infinity6b0" BR2_OPENIPC_VARIANT="lite" BR2_OPENIPC_FLASH_SIZE="8" @@ -58,6 +58,6 @@ BR2_PACKAGE_MBEDTLS_OPENIPC=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y BR2_PACKAGE_QUIRC_OPENIPC=y -BR2_PACKAGE_SIGMASTAR_OSDRV_INFINITY6=y +BR2_PACKAGE_SIGMASTAR_OSDRV_INFINITY6B0=y BR2_PACKAGE_VTUND_OPENIPC=y BR2_PACKAGE_YAML_CLI=y From bc040e7032e3db58d550e1e3510441484aaf3801 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Thu, 6 Aug 2026 17:50:48 +0300 Subject: [PATCH 16/41] Create ssc337de_ultimate_switcam_b200.defconfig --- .../ssc337de_ultimate_switcam_b200.defconfig | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 devices/ssc337de_ultimate_switcam_b200/br-ext-chip-sigmastar/ssc337de_ultimate_switcam_b200.defconfig diff --git a/devices/ssc337de_ultimate_switcam_b200/br-ext-chip-sigmastar/ssc337de_ultimate_switcam_b200.defconfig b/devices/ssc337de_ultimate_switcam_b200/br-ext-chip-sigmastar/ssc337de_ultimate_switcam_b200.defconfig new file mode 100644 index 000000000..a04d0b3eb --- /dev/null +++ b/devices/ssc337de_ultimate_switcam_b200/br-ext-chip-sigmastar/ssc337de_ultimate_switcam_b200.defconfig @@ -0,0 +1,68 @@ +# 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-musleabihf" +BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y +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)/infinity6b0-ssc009b.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_WIREGUARD_LINUX_COMPAT=y +BR2_PACKAGE_WIREGUARD_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="ssc337de" +BR2_OPENIPC_SOC_FAMILY="infinity6b0" +BR2_OPENIPC_VARIANT="ultimate" +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_LIBEVENT_OPENIPC=y +BR2_PACKAGE_LIBOGG_OPENIPC=y +BR2_PACKAGE_MAJESTIC_FONTS=y +BR2_PACKAGE_MAJESTIC_WEBUI=y +BR2_PACKAGE_MAJESTIC=y +BR2_PACKAGE_MBEDTLS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y +BR2_PACKAGE_QUIRC_OPENIPC=y +BR2_PACKAGE_SIGMASTAR_OSDRV_INFINITY6B0=y +BR2_PACKAGE_VTUND_OPENIPC=y +BR2_PACKAGE_YAML_CLI=y From 998233b8abc1a309360194b1b0565171a69db9bc Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Thu, 6 Aug 2026 17:53:25 +0300 Subject: [PATCH 17/41] Create ssc337de_ultimate.list --- .../general/scripts/ssc337de_ultimate.list | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 devices/ssc337de_ultimate_switcam_b200/general/scripts/ssc337de_ultimate.list diff --git a/devices/ssc337de_ultimate_switcam_b200/general/scripts/ssc337de_ultimate.list b/devices/ssc337de_ultimate_switcam_b200/general/scripts/ssc337de_ultimate.list new file mode 100644 index 000000000..3207b70ea --- /dev/null +++ b/devices/ssc337de_ultimate_switcam_b200/general/scripts/ssc337de_ultimate.list @@ -0,0 +1,33 @@ +/etc/sensors/gc4023.bin +/etc/sensors/gc4653.bin +/etc/sensors/imx307.bin +/etc/sensors/imx335.bin +/etc/sensors/jxf37.bin +/etc/sensors/jxq03.bin +/etc/sensors/sc200ai.bin +/etc/sensors/sc2335.bin +/etc/sensors/sc2336.bin +/etc/sensors/sc3338.bin +/etc/sensors/sc401ai.bin +# +/lib/modules/4.9.84/sigmastar/sensor_gc2083_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc4023_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc4653_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_imx307_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_imx335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_jxf37_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_jxq03_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_os02g10_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc200ai_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2239_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2336_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc3335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc3338_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc401ai_mipi.ko +# +/lib/modules/4.9.84/kernel/fs/lockd/lockd.ko +/lib/modules/4.9.84/kernel/fs/nfs/nfs.ko +/lib/modules/4.9.84/kernel/fs/nfs/nfsv3.ko +/lib/modules/4.9.84/kernel/fs/nfs_common/grace.ko +/lib/modules/4.9.84/kernel/net/sunrpc/sunrpc.ko From 4ab721ccc1b89cf67af8db915cd85f7aa809c67b Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Thu, 6 Aug 2026 17:54:32 +0300 Subject: [PATCH 18/41] Rename devices/ssc337de_ultimate_switcam_b200/general/scripts/ssc337de_ultimate.list to devices/ssc337de_ultimate_switcam_b200/general/scripts/excludes/ssc337de_ultimate.list --- .../general/scripts/{ => excludes}/ssc337de_ultimate.list | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename devices/ssc337de_ultimate_switcam_b200/general/scripts/{ => excludes}/ssc337de_ultimate.list (100%) diff --git a/devices/ssc337de_ultimate_switcam_b200/general/scripts/ssc337de_ultimate.list b/devices/ssc337de_ultimate_switcam_b200/general/scripts/excludes/ssc337de_ultimate.list similarity index 100% rename from devices/ssc337de_ultimate_switcam_b200/general/scripts/ssc337de_ultimate.list rename to devices/ssc337de_ultimate_switcam_b200/general/scripts/excludes/ssc337de_ultimate.list From 13d935107070200d0062980b333fa87de7388fbc Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Thu, 6 Aug 2026 18:03:21 +0300 Subject: [PATCH 19/41] Create customizer.sh --- .../general/usr/share/openipc/customizer.sh | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 devices/ssc337de_ultimate_switcam_b200/general/usr/share/openipc/customizer.sh diff --git a/devices/ssc337de_ultimate_switcam_b200/general/usr/share/openipc/customizer.sh b/devices/ssc337de_ultimate_switcam_b200/general/usr/share/openipc/customizer.sh new file mode 100644 index 000000000..4d0e4b1a3 --- /dev/null +++ b/devices/ssc337de_ultimate_switcam_b200/general/usr/share/openipc/customizer.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Perform basic settings on a known IP camera +# +# +# Set custom upgrade url +# +fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc337de_ultimate_switcam_b200-nand.tgz' +# +# +# Set custom majestic settings +# +cli -s .video0.codec h264 +cli -s .image.mirror false +cli -s .image.flip false +cli -s .nightMode.irCutPin1 13 +cli -s .nightMode.irCutPin2 12 +cli -s .nightMode.backlightPin 52 +cli -s .nightMode.colorToGray true +cli -s .audio.enabled true +cli -s .audio.codec aac +cli -s .audio.srate 48000 +cli -s .audio.inputChannel 1 +# + +exit 0 From d9cd2b6bc597e95e9a357c6e664de2f89cc39b66 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Thu, 6 Aug 2026 18:15:16 +0300 Subject: [PATCH 20/41] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 235d72dd9..e33c5ba7f 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ H3C TC2101 SSC337 JXQ03 RTL8188FU_USB NOR_16M done HB-WIFI-Z6 v1.2 T10 JXH62 RTL8188EU_USB NOR_8M in progress iFlytek XFP301-M T31ZX JXQ03 RTL8188FU_USB NOR_16 research Imilab EC3 CMSXJ25A SSC325 GC2053 MT7603UN_? NOR_16M in progress +Switcam B200 SSC337DE SC223A NAND done Dahua IPC-HFW1230SP-V2 SSC335DE GC2053 NOR_16M done Imou IPC-C22E-S2-v2 SSC335DE GC2053 RTL8188FU_USB NOR_16M done Imou IPC-C22EP-S2 SSC325DE SC2239 RTL8188FU_USB NAND testing stage 1 From bb62cc78477251504391a0589eb39dbe8b294236 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Thu, 6 Aug 2026 18:28:49 +0300 Subject: [PATCH 21/41] Update master.yml --- .github/workflows/master.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index b46132071..9d325f390 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -65,6 +65,7 @@ jobs: - ssc337_lite_tiandy-tc-c321n-v2 - ssc337_lite_tp-link-tapo-c110-v1 - ssc337de_ultimate_foscam-x5 + - ssc337de_ultimate_switcam_b200 - ssc338q_fpv_caddx-fly - ssc338q_fpv_emax-wyvern-link - ssc338q_fpv_openipc-mario-aio From e1223efddc39db7c04de9398f96f18fded6e4fa8 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 10:36:12 +0300 Subject: [PATCH 22/41] . --- .github/CODEOWNERS | 9 - .github/scripts/enrich_manifest.py | 179 -------------- .github/workflows/build-one.yml | 158 ------------ .github/workflows/cleanup.yml | 49 ---- .github/workflows/manifest.yml | 56 ----- .github/workflows/master.yml | 380 ----------------------------- 6 files changed, 831 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/scripts/enrich_manifest.py delete mode 100644 .github/workflows/build-one.yml delete mode 100644 .github/workflows/cleanup.yml delete mode 100644 .github/workflows/manifest.yml delete mode 100644 .github/workflows/master.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 4147ec6f8..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,9 +0,0 @@ -## @file -# CODEOWNERS -# -# Copyright (c) 2022, Intel Corporation. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -## - -* @cronyx @FlyRouter @viktorxda -README.* @ystinia @ZigFisher diff --git a/.github/scripts/enrich_manifest.py b/.github/scripts/enrich_manifest.py deleted file mode 100644 index cdf24f4dc..000000000 --- a/.github/scripts/enrich_manifest.py +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/bin/env python3 -"""Build manifest.json and manifest.flat for OpenIPC/builder's nightly index. - -Mirrors OpenIPC/firmware's enrich_manifest.py but accounts for builder's -**bimodal** asset filenames produced by .github/workflows/master.yml: - - - **Compound** form (one underscore per matrix-entry awk count == multi): - `__--nor.tgz` — encodes the full device - identifier. Platform key = the full `__-` - string. This is the common case (per-device builds). - - - **Simple** form (single-underscore matrix entry like `ssc338q_fpv`): - `openipc.--.tgz` — firmware-style. Platform key - = `_`. - -The flat schema is unchanged: `build_id platform flash size url`, plus -`@channel ` records. - -md5 is intentionally absent (same reasoning as firmware — every .tgz -ships a .md5sum sidecar that sysupgrade validates after download). - -Retry hardening (HTTP 401 / 5xx / network) is the same as firmware's -post-#2129 enrich_manifest, with fast-fail on permanent 404. -""" -from __future__ import annotations - -import datetime as dt -import json -import os -import re -import subprocess -import sys -import time -from pathlib import Path - -REPO = os.environ.get("GITHUB_REPOSITORY", "OpenIPC/builder") -RETENTION = 90 -TAG_RE = re.compile(r"^nightly-(\d{8})-([0-9a-f]{7})$") - -# Bimodal asset names — see module docstring. -COMPOUND_RE = re.compile(r"^(?P[a-z0-9]+_[a-z0-9]+_[a-z0-9_.-]+)-(?Pnor|nand)\.tgz$") -SIMPLE_RE = re.compile(r"^openipc\.(?P[^.]+)-(?Pnor|nand)-(?P\w+)\.tgz$") - -# Retry budget for transient GitHub API failures (mirrors firmware/#2129). -GH_RETRY_DELAYS = (0, 5, 15, 40) - - -def gh(*args: str) -> str: - cmd = ["gh", *args, "--repo", REPO] - last_exc = None - for delay in GH_RETRY_DELAYS: - if delay > 0: - time.sleep(delay) - try: - return subprocess.check_output(cmd, text=True, stderr=subprocess.PIPE) - except subprocess.CalledProcessError as e: - last_exc = e - err = e.stderr or "" - if "release not found" in err.lower() or "not found (HTTP 404)" in err: - break - sys.stderr.write( - f"gh {' '.join(args[:3])}: attempt failed " - f"(rc={e.returncode}): {err.strip()[:240]}\n" - ) - sys.stderr.write( - f"gh {' '.join(args[:3])}: giving up; " - f"final stderr:\n{last_exc.stderr}\n" - ) - raise last_exc - - -def list_dated_releases() -> list[dict]: - raw = gh("release", "list", "--limit", "200", - "--json", "tagName,createdAt,isPrerelease") - rels = json.loads(raw) - dated = [r for r in rels if TAG_RE.match(r["tagName"])] - dated.sort(key=lambda r: r["createdAt"], reverse=True) - return dated[:RETENTION] - - -def fetch_release(tag: str) -> dict: - raw = gh("release", "view", tag, - "--json", "tagName,createdAt,body,assets") - return json.loads(raw) - - -def parse_body(body: str | None) -> tuple[str, str, str]: - sha = short = built_at = "" - for line in (body or "").splitlines(): - if line.startswith("sha="): - sha = line[4:].strip() - elif line.startswith("short="): - short = line[6:].strip() - elif line.startswith("built_at="): - built_at = line[9:].strip() - return sha, short, built_at - - -def parse_asset(name: str) -> tuple[str, str] | None: - """Returns (platform_key, flash) or None if filename doesn't match.""" - m = COMPOUND_RE.match(name) - if m: - return m.group("platform"), m.group("flash") - m = SIMPLE_RE.match(name) - if m: - return f"{m.group('soc')}_{m.group('variant')}", m.group("flash") - return None - - -def main() -> None: - out_dir = Path(sys.argv[1] if len(sys.argv) > 1 else ".") - out_dir.mkdir(parents=True, exist_ok=True) - - now = dt.datetime.now(dt.timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z") - dated = list_dated_releases() - - if not dated: - manifest = {"schema": 1, "generated_at": now, - "channels": {}, "builds": []} - (out_dir / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n") - (out_dir / "manifest.flat").write_text( - f"# generated_at={now}\n" - "# No nightly-YYYYMMDD- releases yet — " - "the first scheduled build will populate this index.\n" - ) - print("manifest: 0 builds (empty index)") - return - - builds = [] - for rel in dated: - info = fetch_release(rel["tagName"]) - sha, short, built_at = parse_body(info.get("body") or "") - platforms: dict[str, dict[str, dict]] = {} - for a in info.get("assets") or []: - parsed = parse_asset(a["name"]) - if not parsed: - continue - platform, flash = parsed - platforms.setdefault(platform, {})[flash] = { - "url": a["url"], - "size": a["size"], - } - builds.append({ - "id": info["tagName"], - "sha": sha, - "short": short, - "built_at": built_at or info["createdAt"], - "release_url": f"https://github.com/{REPO}/releases/tag/{info['tagName']}", - "platforms": platforms, - }) - - newest = builds[0]["id"] - manifest = { - "schema": 1, - "generated_at": now, - "channels": {"nightly": newest, "latest": newest}, - "builds": builds, - } - (out_dir / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n") - - lines = [ - "# OpenIPC builder build index", - f"# generated_at={now}", - "# columns: build_id platform flash size url", - ] - for b in builds: - for platform, flashes in sorted(b["platforms"].items()): - for flash, info in sorted(flashes.items()): - lines.append(f"{b['id']} {platform} {flash} {info['size']} {info['url']}") - lines.append("# channels") - for ch, target in manifest["channels"].items(): - lines.append(f"@channel {ch} {target}") - (out_dir / "manifest.flat").write_text("\n".join(lines) + "\n") - - print(f"manifest: {len(builds)} builds, newest={newest}") - - -if __name__ == "__main__": - main() diff --git a/.github/workflows/build-one.yml b/.github/workflows/build-one.yml deleted file mode 100644 index 9ccfd1cc0..000000000 --- a/.github/workflows/build-one.yml +++ /dev/null @@ -1,158 +0,0 @@ -name: build-one -on: - workflow_dispatch: - inputs: - platform: - description: 'Platform to build (e.g. hi3518ev200_lite_switcam-hs303-v2)' - required: true - commit: - description: 'Builder commit SHA to build (optional; defaults to current branch HEAD). Use this from `git bisect run` or for one-off historic rebuilds.' - required: false - firmware_ref: - description: 'OpenIPC/firmware ref (SHA/tag/branch) to clone — for cross-repo bisect of size/regression issues. Defaults to firmware HEAD.' - required: false - -jobs: - resolve: - name: Resolve commit - runs-on: ubuntu-latest - outputs: - ref: ${{ steps.r.outputs.ref }} - short_sha: ${{ steps.r.outputs.short_sha }} - tag_name: ${{ steps.r.outputs.tag_name }} - steps: - - id: r - run: | - REF="${{ inputs.commit }}" - [ -z "$REF" ] && REF="${{ github.sha }}" - SHORT="$(printf '%s' "$REF" | cut -c1-7)" - if [ -n "${{ inputs.commit }}" ]; then - TAG="nightly-bisect-${SHORT}" - else - TAG="nightly-bisect-${SHORT}-$(date -u +%Y%m%d%H%M%S)" - fi - echo "ref=$REF" >> "$GITHUB_OUTPUT" - echo "short_sha=$SHORT" >> "$GITHUB_OUTPUT" - echo "tag_name=$TAG" >> "$GITHUB_OUTPUT" - echo "Building ${{ inputs.platform }} at $REF -> release tag $TAG" - - buildroot: - name: Firmware (${{inputs.platform}}) - needs: resolve - runs-on: ubuntu-latest - - steps: - - name: Checkout source - uses: actions/checkout@v4 - with: - ref: ${{ needs.resolve.outputs.ref }} - - - name: Prepare firmware - run: | - echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf - echo CACHE_DATE=$(date +%m) >> ${GITHUB_ENV} - - - name: Setup ccache - uses: actions/cache@v4 - with: - path: /tmp/ccache - key: ${{inputs.platform}}-${{env.CACHE_DATE}} - - # See master.yml for the rationale — builder.sh rm -rf's openipc/ - # every run, so dl/ has to live outside via BR2_DL_DIR. - - name: Setup dl cache - uses: actions/cache@v4 - with: - path: /tmp/builder-dl - key: builder-dl-${{env.CACHE_DATE}} - restore-keys: builder-dl- - - - name: Refresh moving-ref package downloads - run: | - # The monthly builder-dl cache freezes moving-ref downloads under a constant - # filename, so buildroot keeps reusing a stale tarball. Drop them so it - # re-fetches the current ref each run. See master.yml for the rationale. - # Covers both the dash form (-.tar.gz, e.g. majestic-webui-dist) and - # the dot form (..tar.bz2, e.g. majestic.t31.lite.master from S3 — - # a moving build with no .hash, NOT a content-addressed pin). - find /tmp/builder-dl -type f -regextype posix-extended \ - -regex '.*[-.](HEAD|master|main|dist)\.tar\.(gz|bz2|xz)' \ - -print -delete 2>/dev/null || true - - - name: Build firmware - env: - BUILD_ID: ${{ needs.resolve.outputs.tag_name }} - BUILD_SHA: ${{ needs.resolve.outputs.ref }} - BUILD_PLATFORM: ${{ inputs.platform }} - OPENIPC_FW_REV: ${{ inputs.firmware_ref }} - run: | - export GIT_HASH=$(git rev-parse --short ${GITHUB_SHA}) - export GIT_BRANCH=${GITHUB_REF_NAME} - echo GIT_HASH=${GIT_HASH} >> ${GITHUB_ENV} - echo GIT_BRANCH=${GIT_BRANCH} >> ${GITHUB_ENV} - - mkdir -p /tmp/ccache - ln -s /tmp/ccache ${HOME}/.ccache - - mkdir -p /tmp/builder-dl - export BR2_DL_DIR=/tmp/builder-dl - - NAME=${{inputs.platform}} - # Retry budget for transient upstream toolchain/CDN flakes - # (matches master.yml + OpenIPC/firmware/build-one.yml). - backoffs="30 60 120 300 600 1200" - attempt=1 - for sleep_for in $backoffs ""; do - bash builder.sh ${NAME} && break - if [ -z "$sleep_for" ]; then - echo "::error::build failed after ${attempt} attempts" - exit 1 - fi - echo "::warning::attempt ${attempt} failed, retrying after ${sleep_for}s" - sleep "$sleep_for" - attempt=$((attempt + 1)) - done - cd openipc - - TIME=$(date -d @${SECONDS} +%M:%S) - echo TIME=${TIME} >> ${GITHUB_ENV} - COMMON=$(echo ${NAME} | awk -F_ '{print NF-1}') - - NORFW=$(find output/images -name openipc*nor*) - if [ ! -z ${NORFW} ]; then - if [ ${COMMON} -eq 1 ]; then - echo NORFW=openipc/${NORFW} >> ${GITHUB_ENV} - else - mv ${NORFW} ../${NAME}-nor.tgz - echo NORFW=${NAME}-nor.tgz >> ${GITHUB_ENV} - fi - fi - - NANDFW=$(find output/images -name openipc*nand*) - if [ ! -z ${NANDFW} ]; then - if [ ${COMMON} -eq 1 ]; then - echo NANDFW=openipc/${NANDFW} >> ${GITHUB_ENV} - else - mv ${NANDFW} ../${NAME}-nand.tgz - echo NANDFW=${NAME}-nand.tgz >> ${GITHUB_ENV} - fi - fi - - if [ -z ${NORFW} ] && [ -z ${NANDFW} ]; then - exit 1 - fi - - - name: Upload firmware - if: env.NORFW || env.NANDFW - uses: softprops/action-gh-release@v2 - with: - tag_name: ${{ needs.resolve.outputs.tag_name }} - prerelease: true - body: | - sha=${{ needs.resolve.outputs.ref }} - short=${{ needs.resolve.outputs.short_sha }} - platform=${{ inputs.platform }} - one_off=true - files: | - ${{env.NORFW}} - ${{env.NANDFW}} diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml deleted file mode 100644 index 89944d0c9..000000000 --- a/.github/workflows/cleanup.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: cleanup -on: - schedule: - - cron: '0 6 * * 1' # Mondays 06:00 UTC (offset by +1h from firmware's cleanup) - workflow_dispatch: - -permissions: - contents: write - actions: write - -concurrency: - group: gh-pages-manifest - cancel-in-progress: false - -jobs: - prune: - name: Prune old nightly releases - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Delete releases beyond the 90 newest - id: prune - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - set -euo pipefail - to_delete=$(gh release list --limit 200 --json tagName,createdAt \ - | jq -r '[ .[] | select(.tagName | test("^nightly-[0-9]{8}-[0-9a-f]{7}$")) ] - | sort_by(.createdAt) | reverse | .[90:] | .[].tagName') - - if [ -z "$to_delete" ]; then - echo "Nothing to delete; <=90 dated nightlies present." - echo "pruned=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - echo "$to_delete" | while read -r tag; do - [ -z "$tag" ] && continue - echo "Deleting $tag" - gh release delete "$tag" --cleanup-tag --yes - done - echo "pruned=true" >> "$GITHUB_OUTPUT" - - - name: Refresh manifest - if: steps.prune.outputs.pruned == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh workflow run manifest.yml diff --git a/.github/workflows/manifest.yml b/.github/workflows/manifest.yml deleted file mode 100644 index 58e3e5770..000000000 --- a/.github/workflows/manifest.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: manifest -on: - workflow_run: - workflows: [Build] - types: [completed] - workflow_dispatch: - -permissions: - contents: write - -concurrency: - group: gh-pages-manifest - cancel-in-progress: false - -jobs: - generate: - name: Generate manifest - # Publish on success AND on partial-failure: one flaky board (e.g. a - # transient toolchain 502) should not deny manifest updates for the - # platforms that did upload artifacts. enrich_manifest.py reads - # whatever assets actually exist on the release. - if: >- - github.event_name == 'workflow_dispatch' || - contains(fromJSON('["success", "failure"]'), github.event.workflow_run.conclusion) - runs-on: ubuntu-latest - steps: - - name: Checkout master (for the script) - uses: actions/checkout@v4 - with: - path: master - - - name: Checkout gh-pages (for output) - uses: actions/checkout@v4 - with: - ref: gh-pages - path: pages - - - name: Generate manifest - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GITHUB_REPOSITORY: ${{ github.repository }} - run: python3 master/.github/scripts/enrich_manifest.py pages - - - name: Publish to gh-pages - working-directory: pages - run: | - git config user.email "actions@github.com" - git config user.name "github-actions[bot]" - git add manifest.json manifest.flat - if git diff --cached --quiet; then - echo "No manifest changes; nothing to commit." - else - newest=$(jq -r '.channels.nightly // "empty"' manifest.json) - git commit -m "manifest: $(date -u +%FT%TZ) — ${newest}" - git push - fi diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml deleted file mode 100644 index 508cd1f7c..000000000 --- a/.github/workflows/master.yml +++ /dev/null @@ -1,380 +0,0 @@ -name: Build -on: - schedule: - - cron: '0 3 * * *' - workflow_dispatch: - inputs: - platform: - description: Platform - required: false - -jobs: - preflight: - name: Preflight - runs-on: ubuntu-latest - outputs: - should_build: ${{ steps.gate.outputs.should_build }} - head_sha: ${{ steps.gate.outputs.head_sha }} - short_sha: ${{ steps.gate.outputs.short_sha }} - build_id: ${{ steps.gate.outputs.build_id }} - built_at: ${{ steps.gate.outputs.built_at }} - steps: - - uses: actions/checkout@v4 - - id: gate - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - HEAD=$(git rev-parse HEAD) - SHORT=$(git rev-parse --short HEAD) - BUILD_ID="nightly-$(date -u +%Y%m%d)-${SHORT}" - BUILT_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ) - # Nightly rebuilds unconditionally on schedule. builder.sh re-clones - # OpenIPC/firmware at HEAD on every run, so the relevant inputs are - # mostly outside this repo (firmware HEAD, toolchain release, kernel - # tarball, vendor osdrv, individual package upstreams). The previous - # gate skipped when only this repo's HEAD matched the last published - # nightly, which made upstream fixes (e.g. an openhisilicon mipi_rx - # regression fix that lands in firmware) invisible to users until - # something here happened to change. Always build on schedule. - echo "Build: $BUILD_ID (event=${{ github.event_name }})" - echo "should_build=true" >> "$GITHUB_OUTPUT" - echo "head_sha=$HEAD" >> "$GITHUB_OUTPUT" - echo "short_sha=$SHORT" >> "$GITHUB_OUTPUT" - echo "build_id=$BUILD_ID" >> "$GITHUB_OUTPUT" - echo "built_at=$BUILT_AT" >> "$GITHUB_OUTPUT" - - buildroot: - name: Firmware - needs: preflight - if: needs.preflight.outputs.should_build == 'true' - runs-on: ubuntu-latest - env: - BUILD_ID: ${{ needs.preflight.outputs.build_id }} - BUILD_SHA: ${{ needs.preflight.outputs.head_sha }} - BUILD_PLATFORM: ${{ matrix.platform }} - - strategy: - fail-fast: false - matrix: - platform: - - gk7202v300_lite_cootli_camv0103 - - gk7202v300_lite_ipg-g3-wr - - gk7202v300_lite_xg521 - - gk7205v200_lite_cpplus-cp-unc-ta21l2c - - gk7205v200_lite_tiandy-tc-c321n - - gk7205v200_lite_vixand-ipc-1 - - gk7205v200_lite_vixand-iph-5-4g - - gk7205v210_lite_tiandy-tc-c32qn - - gk7205v210_lite_vixand-ivg-g3s - - gk7205v210_lite_vixand-ivg-g4f-a - - gk7205v210_lite_vixand-ivg-g4f-a-w - - gk7205v210_lite_vixand-ivg-g4h - - gk7205v300_lite_vixand-ivg-g6s - - gk7205v300_lite_vixand-ivg-g6s-w - - hi3516cv200_lite_trassir-tr-d4121ir1-v2 - - hi3516ev300_ultimate_rostelecom-ipc8232swc-we - - hi3516ev300_ultimate_rvi-1ncmw2028 - - hi3518ev200_lite_smartwares-cip-37210 - - hi3518ev200_lite_switcam-hs303 - - hi3518ev200_lite_switcam-hs303-v2 - - hi3518ev200_lite_vstarcam-c8892wip - - hi3518ev200_lite_qtech-qvc-ipc-136w - - hi3518ev300_lite_bathhouse - - hi3518ev300_lite_xiaomi-mjsxj02hl - - hi3518ev200_ultimate_lenovo-snowman-1080p - - ssc30kd_lite_cmcc-ds-ytj5301 - - ssc325_lite_imilab-ec3-cmsxj25a - - ssc325_lite_imou-c22cp - - ssc325_lite_tp-link-tapo-c310-v1 - - ssc325_lite_trassir-tr-w2c1-v1 - - ssc325de_lite_imou-c22ep-s2 - - ssc333_lite_meari-speed-6s - - ssc333_lite_tp-link-tapo-c110-v2 - - ssc333_lite_tp-link-tapo-c110-v26 - - ssc333_lite_babysense-see-hd-ip206 - - ssc333_lite_vstarcam-c43s_b - - ssc335_lite_tp-link-tapo-c110-v1 - - ssc335_lite_tp-link-tapo-c310-v220 - - ssc335_lite_trassir-tr-w2c1-v2 - - ssc335de_lite_dahua-hfw1230sp-v2 - - ssc335de_lite_imou-c22e-s2-v2 - - ssc335de_lite_uniview-c1l-2wn-g - - ssc337_lite_h3c-tc2101 - - ssc337_lite_tiandy-tc-c321n-v2 - - ssc337_lite_tp-link-tapo-c110-v1 - - ssc337de_ultimate_foscam-x5 - - ssc337de_ultimate_switcam_b200 - - ssc338q_fpv_caddx-fly - - ssc338q_fpv_emax-wyvern-link - - ssc338q_fpv_openipc-mario-aio - - ssc338q_fpv_openipc-thinker-aio - - ssc338q_fpv_openipc-urllc-aio - - ssc338q_fpv_runcam-wifilink - - ssc377qe_fpv_ccdcam-im50q01-tipoman - - t10_lite_hb-wifi-z6 - - t10_lite_jvs-ingt10-gqs60ep - - t20_ultimate_azarton-c1 - - t20_lite_ec37-t11 - - t31_lite_vstarcam-cs55 - - t21_lite_chinamobile-hdc-51-a5-v12 - - t21_lite_smartwares-cip-37210at - - t21_lite_xyx-06s - - t21_lite_wansview-q5-1080p - - t23_lite_jooan-a6m-u - - t23_lite_jooan-q3r-u - - t23_lite_lsc-3215672 - - t31_lite_aceline-aip-o4 - - t31_lite_wansview-q5-2k - - t31_lite_aoni-ep01j05 - - t31_lite_chinamobile-hdc-51-a6-v11 - - t31_lite_cmcc-hdc-51-a6-v10 - - t31_lite_chinatelecom-y4h-50 - - t31_lite_wyze-v3b - - t31_lite_xiaomi-mjsxj03hl - - t31_lite_xiaomi-mjsxj03hl-jxq03 - - t31_lite_tuya-gv7630-t31-ptz - - t31_ultimate_azarton-c1-t31x - - t31_ultimate_gcraftsman-gca50 - - t31_lite_zte-k540 - - t40_lite_movols-mo-805p - - # APFPV - - ssc30kq_apfpv_greg-generic-bu-eu - - ssc30kq_apfpv_greg-generic-cu-eu - - ssc338q_apfpv - - ssc338q_apfpv_greg-generic-bu-eu - - ssc338q_apfpv_greg-generic-cu-eu - - ssc378qe_apfpv - - # FPV - - hi3516ev200_fpv - - hi3516ev300_fpv - - hi3536dv100_fpv - - gk7205v200_fpv - - gk7205v210_fpv - - gk7205v300_fpv - - ssc30kq_fpv - - ssc338q_fpv - - ssc378qe_fpv - - # Ruby - - ssc30kq_rubyfpv_generic - - ssc338q_rubyfpv_generic - - ssc338q_rubyfpv_thinker_internal_wifi - - # LTE - - hi3516ev200_lte - - hi3516ev300_lte - - gk7205v200_lte - - gk7205v300_lte - - # Venc - - gk7205v200_venc - - gk7205v210_venc - - gk7205v300_venc - - # Mini - - hi3516cv300_mini - - hi3518ev200_mini - - # OTG (camera presents itself to a PC as a USB webcam) - - gk7205v200_otg_generic - - steps: - - name: Checkout source - uses: actions/checkout@v4 - - - name: Prepare firmware - run: | - echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf - echo CACHE_DATE=$(date +%m) >> ${GITHUB_ENV} - INPUT=${{inputs.platform}} - MATRIX=$(echo ${{matrix.platform}} | cut -d_ -f1) - if [ -z ${INPUT} ] || [ ${INPUT} = ${MATRIX} ]; then - echo RUN=${MATRIX} >> ${GITHUB_ENV} - fi - - - name: Setup ccache - if: env.RUN - uses: actions/cache@v4 - with: - path: /tmp/ccache - key: ${{matrix.platform}}-${{env.CACHE_DATE}} - - # builder.sh does `rm -rf openipc` at the top of every run to force a - # clean re-clone of OpenIPC/firmware, which also nukes the default - # `openipc/output/dl/` directory Buildroot uses for downloaded source - # tarballs. Without a cache, every cron run re-downloads ~1-3 GB of - # tarballs from upstream mirrors — and any one of them randomly - # failing (e.g. cgit `snapshot/` URLs that regenerate tarballs per - # request with shifting sha256, like wireguard-tools on - # git.zx2c4.com) takes down the matrix entry for that board. See - # kaeru wireguard-zx2c4-tarball-regeneration-hash-drift for the - # specific incident this caching addresses. - # - # Cache to /tmp/builder-dl (outside the openipc/ tree so builder.sh's - # rm -rf doesn't touch it) and point Buildroot at it via BR2_DL_DIR - # env var (honored per Buildroot manual section "Location of source - # tarballs"). Mirrors OpenIPC/firmware/.github/workflows/build.yml's - # output/dl cache, adapted for builder's clean-clone behavior. - - name: Setup dl cache - if: env.RUN - uses: actions/cache@v4 - with: - path: /tmp/builder-dl - key: builder-dl-${{env.CACHE_DATE}} - restore-keys: builder-dl- - - - name: Refresh moving-ref package downloads - if: env.RUN - run: | - # builder caches BR2_DL_DIR (/tmp/builder-dl) under a monthly key - # (date +%m) and actions/cache only saves on a key miss, so the first build - # of the month freezes it for weeks. Packages pinned to a moving ref keep a - # constant download filename, so buildroot reuses the stale tarball — even - # though builder re-clones firmware HEAD each run for freshness. Two forms: - # - dash: -.tar.gz e.g. majestic-webui-dist.tar.gz - # - dot: ..tar.bz2 e.g. majestic.t31.lite.master.tar.bz2 - # The dot form is majestic's S3 tarball: it LOOKS S3-pinned but is a moving - # `master` build re-uploaded every majestic CI run, with no .hash to force a - # refetch — so it must be evicted too. (Empirically: a 06-14 nightly shipped a - # ~2-week-old majestic-webui; later a t31 lite image shipped a pre-x-groups - # majestic against the current webui — "No settings groups in schema".) Drop - # both forms so buildroot re-fetches the current ref. Only genuinely - # content-addressed tarballs (semver / SHA in the name) keep their cache. - find /tmp/builder-dl -type f -regextype posix-extended \ - -regex '.*[-.](HEAD|master|main|dist)\.tar\.(gz|bz2|xz)' \ - -print -delete 2>/dev/null || true - - - name: Build firmware - if: env.RUN - run: | - export GIT_HASH=$(git rev-parse --short ${GITHUB_SHA}) - export GIT_BRANCH=${GITHUB_REF_NAME} - echo GIT_HASH=${GIT_HASH} >> ${GITHUB_ENV} - echo GIT_BRANCH=${GIT_BRANCH} >> ${GITHUB_ENV} - - mkdir -p /tmp/ccache - ln -s /tmp/ccache ${HOME}/.ccache - - mkdir -p /tmp/builder-dl - export BR2_DL_DIR=/tmp/builder-dl - - NAME=${{matrix.platform}} - # Retry budget for transient upstream toolchain/CDN flakes - # (matches OpenIPC/firmware/.github/workflows/build.yml). - backoffs="30 60 120 300 600 1200" - attempt=1 - for sleep_for in $backoffs ""; do - bash builder.sh ${NAME} && break - if [ -z "$sleep_for" ]; then - echo "::error::build failed after ${attempt} attempts" - exit 1 - fi - echo "::warning::attempt ${attempt} failed, retrying after ${sleep_for}s" - sleep "$sleep_for" - attempt=$((attempt + 1)) - done - cd openipc - - TIME=$(date -d @${SECONDS} +%M:%S) - echo TIME=${TIME} >> ${GITHUB_ENV} - COMMON=$(echo ${NAME} | awk -F_ '{print NF-1}') - - NORFW=$(find output/images -name openipc*nor*) - if [ ! -z ${NORFW} ]; then - if [ ${COMMON} -eq 1 ]; then - echo NORFW=openipc/${NORFW} >> ${GITHUB_ENV} - else - mv ${NORFW} ../${NAME}-nor.tgz - echo NORFW=${NAME}-nor.tgz >> ${GITHUB_ENV} - fi - fi - - NANDFW=$(find output/images -name openipc*nand*) - if [ ! -z ${NANDFW} ]; then - if [ ${COMMON} -eq 1 ]; then - echo NANDFW=openipc/${NANDFW} >> ${GITHUB_ENV} - else - mv ${NANDFW} ../${NAME}-nand.tgz - echo NANDFW=${NAME}-nand.tgz >> ${GITHUB_ENV} - fi - fi - - if [ -z ${NORFW} ] && [ -z ${NANDFW} ]; then - exit 1 - fi - - - name: Build size report - if: env.NORFW || env.NANDFW - run: | - cd openipc - NAME=${{matrix.platform}} - make BOARD=${NAME} size-report || \ - { echo "::warning::size-report failed for ${NAME}"; exit 0; } - SIZES=$(find output/images -name 'sizes.*.json' | head -1) - if [ -z "${SIZES}" ]; then - exit 0 - fi - # Mirror the .tgz rename trick: compound matrix entries - # (`__-`) share `_` and - # would collide on the firmware-side `sizes.-.json` - # filename when uploaded to the same release tag. Rename to - # `sizes..json` so every compound device gets its own asset. - COMMON=$(echo ${NAME} | awk -F_ '{print NF-1}') - if [ ${COMMON} -eq 1 ]; then - echo "SIZES=openipc/${SIZES}" >> ${GITHUB_ENV} - else - mv ${SIZES} ../sizes.${NAME}.json - echo "SIZES=sizes.${NAME}.json" >> ${GITHUB_ENV} - fi - - - name: Upload firmware (dated) - if: env.NORFW || env.NANDFW - uses: softprops/action-gh-release@v2 - with: - tag_name: ${{ needs.preflight.outputs.build_id }} - prerelease: true - body: | - sha=${{ needs.preflight.outputs.head_sha }} - short=${{ needs.preflight.outputs.short_sha }} - built_at=${{ needs.preflight.outputs.built_at }} - files: | - ${{env.NORFW}} - ${{env.NANDFW}} - ${{env.SIZES}} - - - name: Upload firmware (rolling nightly) - if: env.NORFW || env.NANDFW - uses: softprops/action-gh-release@v2 - with: - tag_name: nightly - body: | - sha=${{ needs.preflight.outputs.head_sha }} - short=${{ needs.preflight.outputs.short_sha }} - built_at=${{ needs.preflight.outputs.built_at }} - files: | - ${{env.NORFW}} - ${{env.NANDFW}} - ${{env.SIZES}} - - - name: Upload firmware (latest — legacy alias) - if: env.NORFW || env.NANDFW - uses: softprops/action-gh-release@v2 - with: - tag_name: latest - files: | - ${{env.NORFW}} - ${{env.NANDFW}} - ${{env.SIZES}} - - - name: Send binary - if: env.NORFW - run: | - TG_MSG="Build: ${BUILD_ID}\nCommit: ${GIT_HASH}\nBranch: ${GIT_BRANCH}\nTime: ${TIME}\n\n" - TG_ICON="\xE2\x9C\x85 GitHub Actions" - TG_HEADER=$(echo -e ${TG_MSG}${TG_ICON}) - TG_TOKEN=${{secrets.TELEGRAM_TOKEN_BOT_OPENIPC}} - TG_CHANNEL=${{secrets.TELEGRAM_CHANNEL_OPENIPC_DEV}} - HTTP=$(curl -s -o /dev/null -w %{http_code} https://api.telegram.org/bot${TG_TOKEN}/sendDocument -F chat_id=${TG_CHANNEL} -F caption="${TG_HEADER}" -F document=@${NORFW}) - echo Telegram response: ${HTTP} From 8ac6e5512882072b9bc3c1c1b89a4c01e4e12454 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:28:43 +0300 Subject: [PATCH 23/41] . --- .../configs/ssc337de_ultimate_switcam_b200_defconfig} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename devices/{ssc337de_ultimate_switcam_b200/br-ext-chip-sigmastar/ssc337de_ultimate_switcam_b200.defconfig => ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam_b200_defconfig} (100%) diff --git a/devices/ssc337de_ultimate_switcam_b200/br-ext-chip-sigmastar/ssc337de_ultimate_switcam_b200.defconfig b/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam_b200_defconfig similarity index 100% rename from devices/ssc337de_ultimate_switcam_b200/br-ext-chip-sigmastar/ssc337de_ultimate_switcam_b200.defconfig rename to devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam_b200_defconfig From 269ef9643a895619323d2a0436f92ba17fb4b581 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:30:40 +0300 Subject: [PATCH 24/41] . --- .../ssc337de_ultimate_switcam_b200_defconfig | 68 ------------------- 1 file changed, 68 deletions(-) delete mode 100644 devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam_b200_defconfig diff --git a/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam_b200_defconfig b/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam_b200_defconfig deleted file mode 100644 index a04d0b3eb..000000000 --- a/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam_b200_defconfig +++ /dev/null @@ -1,68 +0,0 @@ -# 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-musleabihf" -BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y -BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y -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)/infinity6b0-ssc009b.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_WIREGUARD_LINUX_COMPAT=y -BR2_PACKAGE_WIREGUARD_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="ssc337de" -BR2_OPENIPC_SOC_FAMILY="infinity6b0" -BR2_OPENIPC_VARIANT="ultimate" -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_LIBEVENT_OPENIPC=y -BR2_PACKAGE_LIBOGG_OPENIPC=y -BR2_PACKAGE_MAJESTIC_FONTS=y -BR2_PACKAGE_MAJESTIC_WEBUI=y -BR2_PACKAGE_MAJESTIC=y -BR2_PACKAGE_MBEDTLS_OPENIPC=y -BR2_PACKAGE_OPUS_OPENIPC=y -BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y -BR2_PACKAGE_QUIRC_OPENIPC=y -BR2_PACKAGE_SIGMASTAR_OSDRV_INFINITY6B0=y -BR2_PACKAGE_VTUND_OPENIPC=y -BR2_PACKAGE_YAML_CLI=y From f3da7036fe114bb31f98cedae6fc9b3f94f71830 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:31:31 +0300 Subject: [PATCH 25/41] . --- .../general/usr/share/openipc/customizer.sh | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 devices/ssc337de_ultimate_switcam_b200/general/usr/share/openipc/customizer.sh diff --git a/devices/ssc337de_ultimate_switcam_b200/general/usr/share/openipc/customizer.sh b/devices/ssc337de_ultimate_switcam_b200/general/usr/share/openipc/customizer.sh deleted file mode 100644 index 4d0e4b1a3..000000000 --- a/devices/ssc337de_ultimate_switcam_b200/general/usr/share/openipc/customizer.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# -# Perform basic settings on a known IP camera -# -# -# Set custom upgrade url -# -fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc337de_ultimate_switcam_b200-nand.tgz' -# -# -# Set custom majestic settings -# -cli -s .video0.codec h264 -cli -s .image.mirror false -cli -s .image.flip false -cli -s .nightMode.irCutPin1 13 -cli -s .nightMode.irCutPin2 12 -cli -s .nightMode.backlightPin 52 -cli -s .nightMode.colorToGray true -cli -s .audio.enabled true -cli -s .audio.codec aac -cli -s .audio.srate 48000 -cli -s .audio.inputChannel 1 -# - -exit 0 From c66f2a1e3d6672b76497fc5628535c5de750fe5c Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:31:43 +0300 Subject: [PATCH 26/41] . --- .../scripts/excludes/ssc337de_ultimate.list | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 devices/ssc337de_ultimate_switcam_b200/general/scripts/excludes/ssc337de_ultimate.list diff --git a/devices/ssc337de_ultimate_switcam_b200/general/scripts/excludes/ssc337de_ultimate.list b/devices/ssc337de_ultimate_switcam_b200/general/scripts/excludes/ssc337de_ultimate.list deleted file mode 100644 index 3207b70ea..000000000 --- a/devices/ssc337de_ultimate_switcam_b200/general/scripts/excludes/ssc337de_ultimate.list +++ /dev/null @@ -1,33 +0,0 @@ -/etc/sensors/gc4023.bin -/etc/sensors/gc4653.bin -/etc/sensors/imx307.bin -/etc/sensors/imx335.bin -/etc/sensors/jxf37.bin -/etc/sensors/jxq03.bin -/etc/sensors/sc200ai.bin -/etc/sensors/sc2335.bin -/etc/sensors/sc2336.bin -/etc/sensors/sc3338.bin -/etc/sensors/sc401ai.bin -# -/lib/modules/4.9.84/sigmastar/sensor_gc2083_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_gc4023_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_gc4653_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_imx307_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_imx335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_jxf37_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_jxq03_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_os02g10_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc200ai_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2239_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2336_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc3335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc3338_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc401ai_mipi.ko -# -/lib/modules/4.9.84/kernel/fs/lockd/lockd.ko -/lib/modules/4.9.84/kernel/fs/nfs/nfs.ko -/lib/modules/4.9.84/kernel/fs/nfs/nfsv3.ko -/lib/modules/4.9.84/kernel/fs/nfs_common/grace.ko -/lib/modules/4.9.84/kernel/net/sunrpc/sunrpc.ko From 192ce12507a436c8713f03fb61b3c59c8c9c4bbf Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:38:19 +0300 Subject: [PATCH 27/41] Create ssc337de_ultimate_switcam-b200_defconfig --- .../ssc337de_ultimate_switcam-b200_defconfig | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam-b200_defconfig diff --git a/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam-b200_defconfig b/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam-b200_defconfig new file mode 100644 index 000000000..a04d0b3eb --- /dev/null +++ b/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam-b200_defconfig @@ -0,0 +1,68 @@ +# 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-musleabihf" +BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y +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)/infinity6b0-ssc009b.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_WIREGUARD_LINUX_COMPAT=y +BR2_PACKAGE_WIREGUARD_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="ssc337de" +BR2_OPENIPC_SOC_FAMILY="infinity6b0" +BR2_OPENIPC_VARIANT="ultimate" +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_LIBEVENT_OPENIPC=y +BR2_PACKAGE_LIBOGG_OPENIPC=y +BR2_PACKAGE_MAJESTIC_FONTS=y +BR2_PACKAGE_MAJESTIC_WEBUI=y +BR2_PACKAGE_MAJESTIC=y +BR2_PACKAGE_MBEDTLS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y +BR2_PACKAGE_QUIRC_OPENIPC=y +BR2_PACKAGE_SIGMASTAR_OSDRV_INFINITY6B0=y +BR2_PACKAGE_VTUND_OPENIPC=y +BR2_PACKAGE_YAML_CLI=y From 28b3d5db81425740117c32c866d0f1b0ab074471 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:40:30 +0300 Subject: [PATCH 28/41] Create customizer.sh --- .../general/usr/share/openipc/customizer.sh | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh diff --git a/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh b/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh new file mode 100644 index 000000000..f3a4f33da --- /dev/null +++ b/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Perform basic settings on a known IP camera +# +# +# Set custom upgrade url +# +fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc337de_ultimate_switcam-b200-nand.tgz' +# +# +# Set custom majestic settings +# +cli -s .video0.codec h264 +cli -s .image.mirror false +cli -s .image.flip false +cli -s .nightMode.irCutPin1 13 +cli -s .nightMode.irCutPin2 12 +cli -s .nightMode.backlightPin 52 +cli -s .nightMode.colorToGray true +cli -s .audio.enabled true +cli -s .audio.codec aac +cli -s .audio.srate 48000 +cli -s .audio.inputChannel 1 +# + +exit 0 From ae88687e20cfc6b6ba0e3fc26e8d9429823e59bf Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:40:59 +0300 Subject: [PATCH 29/41] . --- .../general/usr/share/openipc/customizer.sh | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh diff --git a/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh b/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh deleted file mode 100644 index f3a4f33da..000000000 --- a/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# -# Perform basic settings on a known IP camera -# -# -# Set custom upgrade url -# -fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc337de_ultimate_switcam-b200-nand.tgz' -# -# -# Set custom majestic settings -# -cli -s .video0.codec h264 -cli -s .image.mirror false -cli -s .image.flip false -cli -s .nightMode.irCutPin1 13 -cli -s .nightMode.irCutPin2 12 -cli -s .nightMode.backlightPin 52 -cli -s .nightMode.colorToGray true -cli -s .audio.enabled true -cli -s .audio.codec aac -cli -s .audio.srate 48000 -cli -s .audio.inputChannel 1 -# - -exit 0 From acf00f5800b2d4666c25d8af1ef364941173a177 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:41:46 +0300 Subject: [PATCH 30/41] Create customizer.sh --- .../general/usr/share/openipc/customizer.sh | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh diff --git a/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh b/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh new file mode 100644 index 000000000..f3a4f33da --- /dev/null +++ b/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Perform basic settings on a known IP camera +# +# +# Set custom upgrade url +# +fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc337de_ultimate_switcam-b200-nand.tgz' +# +# +# Set custom majestic settings +# +cli -s .video0.codec h264 +cli -s .image.mirror false +cli -s .image.flip false +cli -s .nightMode.irCutPin1 13 +cli -s .nightMode.irCutPin2 12 +cli -s .nightMode.backlightPin 52 +cli -s .nightMode.colorToGray true +cli -s .audio.enabled true +cli -s .audio.codec aac +cli -s .audio.srate 48000 +cli -s .audio.inputChannel 1 +# + +exit 0 From 3a119d2bdacef3d62e44996e78ac3b4badb5b12a Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:42:07 +0300 Subject: [PATCH 31/41] . --- .../general/usr/share/openipc/customizer.sh | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh diff --git a/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh b/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh deleted file mode 100644 index f3a4f33da..000000000 --- a/devices/ssc337de_ultimate_switcam-b200/general/usr/share/openipc/customizer.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# -# Perform basic settings on a known IP camera -# -# -# Set custom upgrade url -# -fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc337de_ultimate_switcam-b200-nand.tgz' -# -# -# Set custom majestic settings -# -cli -s .video0.codec h264 -cli -s .image.mirror false -cli -s .image.flip false -cli -s .nightMode.irCutPin1 13 -cli -s .nightMode.irCutPin2 12 -cli -s .nightMode.backlightPin 52 -cli -s .nightMode.colorToGray true -cli -s .audio.enabled true -cli -s .audio.codec aac -cli -s .audio.srate 48000 -cli -s .audio.inputChannel 1 -# - -exit 0 From e5f5132888c5032b123735c5af07d8ce3b9de0a2 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:43:15 +0300 Subject: [PATCH 32/41] Create customizer.sh --- .../overlay/usr/share/openipc/customizer.sh | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 devices/ssc337de_ultimate_switcam-b200/general/overlay/usr/share/openipc/customizer.sh diff --git a/devices/ssc337de_ultimate_switcam-b200/general/overlay/usr/share/openipc/customizer.sh b/devices/ssc337de_ultimate_switcam-b200/general/overlay/usr/share/openipc/customizer.sh new file mode 100644 index 000000000..f3a4f33da --- /dev/null +++ b/devices/ssc337de_ultimate_switcam-b200/general/overlay/usr/share/openipc/customizer.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Perform basic settings on a known IP camera +# +# +# Set custom upgrade url +# +fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc337de_ultimate_switcam-b200-nand.tgz' +# +# +# Set custom majestic settings +# +cli -s .video0.codec h264 +cli -s .image.mirror false +cli -s .image.flip false +cli -s .nightMode.irCutPin1 13 +cli -s .nightMode.irCutPin2 12 +cli -s .nightMode.backlightPin 52 +cli -s .nightMode.colorToGray true +cli -s .audio.enabled true +cli -s .audio.codec aac +cli -s .audio.srate 48000 +cli -s .audio.inputChannel 1 +# + +exit 0 From 5956d4cf51aeca917989219550b98bc54ea60085 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Fri, 7 Aug 2026 21:47:24 +0300 Subject: [PATCH 33/41] Create ssc337de_ultimate.list --- .../scripts/excludes/ssc337de_ultimate.list | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 devices/ssc337de_ultimate_switcam-b200/general/scripts/excludes/ssc337de_ultimate.list diff --git a/devices/ssc337de_ultimate_switcam-b200/general/scripts/excludes/ssc337de_ultimate.list b/devices/ssc337de_ultimate_switcam-b200/general/scripts/excludes/ssc337de_ultimate.list new file mode 100644 index 000000000..3207b70ea --- /dev/null +++ b/devices/ssc337de_ultimate_switcam-b200/general/scripts/excludes/ssc337de_ultimate.list @@ -0,0 +1,33 @@ +/etc/sensors/gc4023.bin +/etc/sensors/gc4653.bin +/etc/sensors/imx307.bin +/etc/sensors/imx335.bin +/etc/sensors/jxf37.bin +/etc/sensors/jxq03.bin +/etc/sensors/sc200ai.bin +/etc/sensors/sc2335.bin +/etc/sensors/sc2336.bin +/etc/sensors/sc3338.bin +/etc/sensors/sc401ai.bin +# +/lib/modules/4.9.84/sigmastar/sensor_gc2083_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc4023_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_gc4653_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_imx307_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_imx335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_jxf37_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_jxq03_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_os02g10_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc200ai_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2239_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc2336_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc3335_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc3338_mipi.ko +/lib/modules/4.9.84/sigmastar/sensor_sc401ai_mipi.ko +# +/lib/modules/4.9.84/kernel/fs/lockd/lockd.ko +/lib/modules/4.9.84/kernel/fs/nfs/nfs.ko +/lib/modules/4.9.84/kernel/fs/nfs/nfsv3.ko +/lib/modules/4.9.84/kernel/fs/nfs_common/grace.ko +/lib/modules/4.9.84/kernel/net/sunrpc/sunrpc.ko From cac1b6edf5d603b1f025491d4120609c06ab9188 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Mon, 10 Aug 2026 22:33:43 +0300 Subject: [PATCH 34/41] . --- .github/CODEOWNERS | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..4147ec6f8 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,9 @@ +## @file +# CODEOWNERS +# +# Copyright (c) 2022, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +* @cronyx @FlyRouter @viktorxda +README.* @ystinia @ZigFisher From b3358840eadbad3dd495a1362fed3a811601d2e7 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Mon, 10 Aug 2026 22:34:58 +0300 Subject: [PATCH 35/41] . --- .github/scripts/enrich_manifest.py | 179 +++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 .github/scripts/enrich_manifest.py diff --git a/.github/scripts/enrich_manifest.py b/.github/scripts/enrich_manifest.py new file mode 100644 index 000000000..cdf24f4dc --- /dev/null +++ b/.github/scripts/enrich_manifest.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python3 +"""Build manifest.json and manifest.flat for OpenIPC/builder's nightly index. + +Mirrors OpenIPC/firmware's enrich_manifest.py but accounts for builder's +**bimodal** asset filenames produced by .github/workflows/master.yml: + + - **Compound** form (one underscore per matrix-entry awk count == multi): + `__--nor.tgz` — encodes the full device + identifier. Platform key = the full `__-` + string. This is the common case (per-device builds). + + - **Simple** form (single-underscore matrix entry like `ssc338q_fpv`): + `openipc.--.tgz` — firmware-style. Platform key + = `_`. + +The flat schema is unchanged: `build_id platform flash size url`, plus +`@channel ` records. + +md5 is intentionally absent (same reasoning as firmware — every .tgz +ships a .md5sum sidecar that sysupgrade validates after download). + +Retry hardening (HTTP 401 / 5xx / network) is the same as firmware's +post-#2129 enrich_manifest, with fast-fail on permanent 404. +""" +from __future__ import annotations + +import datetime as dt +import json +import os +import re +import subprocess +import sys +import time +from pathlib import Path + +REPO = os.environ.get("GITHUB_REPOSITORY", "OpenIPC/builder") +RETENTION = 90 +TAG_RE = re.compile(r"^nightly-(\d{8})-([0-9a-f]{7})$") + +# Bimodal asset names — see module docstring. +COMPOUND_RE = re.compile(r"^(?P[a-z0-9]+_[a-z0-9]+_[a-z0-9_.-]+)-(?Pnor|nand)\.tgz$") +SIMPLE_RE = re.compile(r"^openipc\.(?P[^.]+)-(?Pnor|nand)-(?P\w+)\.tgz$") + +# Retry budget for transient GitHub API failures (mirrors firmware/#2129). +GH_RETRY_DELAYS = (0, 5, 15, 40) + + +def gh(*args: str) -> str: + cmd = ["gh", *args, "--repo", REPO] + last_exc = None + for delay in GH_RETRY_DELAYS: + if delay > 0: + time.sleep(delay) + try: + return subprocess.check_output(cmd, text=True, stderr=subprocess.PIPE) + except subprocess.CalledProcessError as e: + last_exc = e + err = e.stderr or "" + if "release not found" in err.lower() or "not found (HTTP 404)" in err: + break + sys.stderr.write( + f"gh {' '.join(args[:3])}: attempt failed " + f"(rc={e.returncode}): {err.strip()[:240]}\n" + ) + sys.stderr.write( + f"gh {' '.join(args[:3])}: giving up; " + f"final stderr:\n{last_exc.stderr}\n" + ) + raise last_exc + + +def list_dated_releases() -> list[dict]: + raw = gh("release", "list", "--limit", "200", + "--json", "tagName,createdAt,isPrerelease") + rels = json.loads(raw) + dated = [r for r in rels if TAG_RE.match(r["tagName"])] + dated.sort(key=lambda r: r["createdAt"], reverse=True) + return dated[:RETENTION] + + +def fetch_release(tag: str) -> dict: + raw = gh("release", "view", tag, + "--json", "tagName,createdAt,body,assets") + return json.loads(raw) + + +def parse_body(body: str | None) -> tuple[str, str, str]: + sha = short = built_at = "" + for line in (body or "").splitlines(): + if line.startswith("sha="): + sha = line[4:].strip() + elif line.startswith("short="): + short = line[6:].strip() + elif line.startswith("built_at="): + built_at = line[9:].strip() + return sha, short, built_at + + +def parse_asset(name: str) -> tuple[str, str] | None: + """Returns (platform_key, flash) or None if filename doesn't match.""" + m = COMPOUND_RE.match(name) + if m: + return m.group("platform"), m.group("flash") + m = SIMPLE_RE.match(name) + if m: + return f"{m.group('soc')}_{m.group('variant')}", m.group("flash") + return None + + +def main() -> None: + out_dir = Path(sys.argv[1] if len(sys.argv) > 1 else ".") + out_dir.mkdir(parents=True, exist_ok=True) + + now = dt.datetime.now(dt.timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z") + dated = list_dated_releases() + + if not dated: + manifest = {"schema": 1, "generated_at": now, + "channels": {}, "builds": []} + (out_dir / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n") + (out_dir / "manifest.flat").write_text( + f"# generated_at={now}\n" + "# No nightly-YYYYMMDD- releases yet — " + "the first scheduled build will populate this index.\n" + ) + print("manifest: 0 builds (empty index)") + return + + builds = [] + for rel in dated: + info = fetch_release(rel["tagName"]) + sha, short, built_at = parse_body(info.get("body") or "") + platforms: dict[str, dict[str, dict]] = {} + for a in info.get("assets") or []: + parsed = parse_asset(a["name"]) + if not parsed: + continue + platform, flash = parsed + platforms.setdefault(platform, {})[flash] = { + "url": a["url"], + "size": a["size"], + } + builds.append({ + "id": info["tagName"], + "sha": sha, + "short": short, + "built_at": built_at or info["createdAt"], + "release_url": f"https://github.com/{REPO}/releases/tag/{info['tagName']}", + "platforms": platforms, + }) + + newest = builds[0]["id"] + manifest = { + "schema": 1, + "generated_at": now, + "channels": {"nightly": newest, "latest": newest}, + "builds": builds, + } + (out_dir / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n") + + lines = [ + "# OpenIPC builder build index", + f"# generated_at={now}", + "# columns: build_id platform flash size url", + ] + for b in builds: + for platform, flashes in sorted(b["platforms"].items()): + for flash, info in sorted(flashes.items()): + lines.append(f"{b['id']} {platform} {flash} {info['size']} {info['url']}") + lines.append("# channels") + for ch, target in manifest["channels"].items(): + lines.append(f"@channel {ch} {target}") + (out_dir / "manifest.flat").write_text("\n".join(lines) + "\n") + + print(f"manifest: {len(builds)} builds, newest={newest}") + + +if __name__ == "__main__": + main() From bbcdbc296d3ad8e609be5387f615d0d16c24056c Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Mon, 10 Aug 2026 22:35:50 +0300 Subject: [PATCH 36/41] . --- .github/workflows/build-one.yml | 158 ++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 .github/workflows/build-one.yml diff --git a/.github/workflows/build-one.yml b/.github/workflows/build-one.yml new file mode 100644 index 000000000..9ccfd1cc0 --- /dev/null +++ b/.github/workflows/build-one.yml @@ -0,0 +1,158 @@ +name: build-one +on: + workflow_dispatch: + inputs: + platform: + description: 'Platform to build (e.g. hi3518ev200_lite_switcam-hs303-v2)' + required: true + commit: + description: 'Builder commit SHA to build (optional; defaults to current branch HEAD). Use this from `git bisect run` or for one-off historic rebuilds.' + required: false + firmware_ref: + description: 'OpenIPC/firmware ref (SHA/tag/branch) to clone — for cross-repo bisect of size/regression issues. Defaults to firmware HEAD.' + required: false + +jobs: + resolve: + name: Resolve commit + runs-on: ubuntu-latest + outputs: + ref: ${{ steps.r.outputs.ref }} + short_sha: ${{ steps.r.outputs.short_sha }} + tag_name: ${{ steps.r.outputs.tag_name }} + steps: + - id: r + run: | + REF="${{ inputs.commit }}" + [ -z "$REF" ] && REF="${{ github.sha }}" + SHORT="$(printf '%s' "$REF" | cut -c1-7)" + if [ -n "${{ inputs.commit }}" ]; then + TAG="nightly-bisect-${SHORT}" + else + TAG="nightly-bisect-${SHORT}-$(date -u +%Y%m%d%H%M%S)" + fi + echo "ref=$REF" >> "$GITHUB_OUTPUT" + echo "short_sha=$SHORT" >> "$GITHUB_OUTPUT" + echo "tag_name=$TAG" >> "$GITHUB_OUTPUT" + echo "Building ${{ inputs.platform }} at $REF -> release tag $TAG" + + buildroot: + name: Firmware (${{inputs.platform}}) + needs: resolve + runs-on: ubuntu-latest + + steps: + - name: Checkout source + uses: actions/checkout@v4 + with: + ref: ${{ needs.resolve.outputs.ref }} + + - name: Prepare firmware + run: | + echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf + echo CACHE_DATE=$(date +%m) >> ${GITHUB_ENV} + + - name: Setup ccache + uses: actions/cache@v4 + with: + path: /tmp/ccache + key: ${{inputs.platform}}-${{env.CACHE_DATE}} + + # See master.yml for the rationale — builder.sh rm -rf's openipc/ + # every run, so dl/ has to live outside via BR2_DL_DIR. + - name: Setup dl cache + uses: actions/cache@v4 + with: + path: /tmp/builder-dl + key: builder-dl-${{env.CACHE_DATE}} + restore-keys: builder-dl- + + - name: Refresh moving-ref package downloads + run: | + # The monthly builder-dl cache freezes moving-ref downloads under a constant + # filename, so buildroot keeps reusing a stale tarball. Drop them so it + # re-fetches the current ref each run. See master.yml for the rationale. + # Covers both the dash form (-.tar.gz, e.g. majestic-webui-dist) and + # the dot form (..tar.bz2, e.g. majestic.t31.lite.master from S3 — + # a moving build with no .hash, NOT a content-addressed pin). + find /tmp/builder-dl -type f -regextype posix-extended \ + -regex '.*[-.](HEAD|master|main|dist)\.tar\.(gz|bz2|xz)' \ + -print -delete 2>/dev/null || true + + - name: Build firmware + env: + BUILD_ID: ${{ needs.resolve.outputs.tag_name }} + BUILD_SHA: ${{ needs.resolve.outputs.ref }} + BUILD_PLATFORM: ${{ inputs.platform }} + OPENIPC_FW_REV: ${{ inputs.firmware_ref }} + run: | + export GIT_HASH=$(git rev-parse --short ${GITHUB_SHA}) + export GIT_BRANCH=${GITHUB_REF_NAME} + echo GIT_HASH=${GIT_HASH} >> ${GITHUB_ENV} + echo GIT_BRANCH=${GIT_BRANCH} >> ${GITHUB_ENV} + + mkdir -p /tmp/ccache + ln -s /tmp/ccache ${HOME}/.ccache + + mkdir -p /tmp/builder-dl + export BR2_DL_DIR=/tmp/builder-dl + + NAME=${{inputs.platform}} + # Retry budget for transient upstream toolchain/CDN flakes + # (matches master.yml + OpenIPC/firmware/build-one.yml). + backoffs="30 60 120 300 600 1200" + attempt=1 + for sleep_for in $backoffs ""; do + bash builder.sh ${NAME} && break + if [ -z "$sleep_for" ]; then + echo "::error::build failed after ${attempt} attempts" + exit 1 + fi + echo "::warning::attempt ${attempt} failed, retrying after ${sleep_for}s" + sleep "$sleep_for" + attempt=$((attempt + 1)) + done + cd openipc + + TIME=$(date -d @${SECONDS} +%M:%S) + echo TIME=${TIME} >> ${GITHUB_ENV} + COMMON=$(echo ${NAME} | awk -F_ '{print NF-1}') + + NORFW=$(find output/images -name openipc*nor*) + if [ ! -z ${NORFW} ]; then + if [ ${COMMON} -eq 1 ]; then + echo NORFW=openipc/${NORFW} >> ${GITHUB_ENV} + else + mv ${NORFW} ../${NAME}-nor.tgz + echo NORFW=${NAME}-nor.tgz >> ${GITHUB_ENV} + fi + fi + + NANDFW=$(find output/images -name openipc*nand*) + if [ ! -z ${NANDFW} ]; then + if [ ${COMMON} -eq 1 ]; then + echo NANDFW=openipc/${NANDFW} >> ${GITHUB_ENV} + else + mv ${NANDFW} ../${NAME}-nand.tgz + echo NANDFW=${NAME}-nand.tgz >> ${GITHUB_ENV} + fi + fi + + if [ -z ${NORFW} ] && [ -z ${NANDFW} ]; then + exit 1 + fi + + - name: Upload firmware + if: env.NORFW || env.NANDFW + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ needs.resolve.outputs.tag_name }} + prerelease: true + body: | + sha=${{ needs.resolve.outputs.ref }} + short=${{ needs.resolve.outputs.short_sha }} + platform=${{ inputs.platform }} + one_off=true + files: | + ${{env.NORFW}} + ${{env.NANDFW}} From 788098acae30e2ee4bd898d37a363f8508e5e8c1 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Mon, 10 Aug 2026 22:36:27 +0300 Subject: [PATCH 37/41] . --- .github/workflows/cleanup.yml | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/cleanup.yml diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml new file mode 100644 index 000000000..89944d0c9 --- /dev/null +++ b/.github/workflows/cleanup.yml @@ -0,0 +1,49 @@ +name: cleanup +on: + schedule: + - cron: '0 6 * * 1' # Mondays 06:00 UTC (offset by +1h from firmware's cleanup) + workflow_dispatch: + +permissions: + contents: write + actions: write + +concurrency: + group: gh-pages-manifest + cancel-in-progress: false + +jobs: + prune: + name: Prune old nightly releases + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Delete releases beyond the 90 newest + id: prune + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + to_delete=$(gh release list --limit 200 --json tagName,createdAt \ + | jq -r '[ .[] | select(.tagName | test("^nightly-[0-9]{8}-[0-9a-f]{7}$")) ] + | sort_by(.createdAt) | reverse | .[90:] | .[].tagName') + + if [ -z "$to_delete" ]; then + echo "Nothing to delete; <=90 dated nightlies present." + echo "pruned=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + echo "$to_delete" | while read -r tag; do + [ -z "$tag" ] && continue + echo "Deleting $tag" + gh release delete "$tag" --cleanup-tag --yes + done + echo "pruned=true" >> "$GITHUB_OUTPUT" + + - name: Refresh manifest + if: steps.prune.outputs.pruned == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh workflow run manifest.yml From f7017f2e71b49112ef513464ae4d034c1e8a6768 Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Mon, 10 Aug 2026 22:37:02 +0300 Subject: [PATCH 38/41] . --- .github/workflows/manifest.yml | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .github/workflows/manifest.yml diff --git a/.github/workflows/manifest.yml b/.github/workflows/manifest.yml new file mode 100644 index 000000000..58e3e5770 --- /dev/null +++ b/.github/workflows/manifest.yml @@ -0,0 +1,56 @@ +name: manifest +on: + workflow_run: + workflows: [Build] + types: [completed] + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: gh-pages-manifest + cancel-in-progress: false + +jobs: + generate: + name: Generate manifest + # Publish on success AND on partial-failure: one flaky board (e.g. a + # transient toolchain 502) should not deny manifest updates for the + # platforms that did upload artifacts. enrich_manifest.py reads + # whatever assets actually exist on the release. + if: >- + github.event_name == 'workflow_dispatch' || + contains(fromJSON('["success", "failure"]'), github.event.workflow_run.conclusion) + runs-on: ubuntu-latest + steps: + - name: Checkout master (for the script) + uses: actions/checkout@v4 + with: + path: master + + - name: Checkout gh-pages (for output) + uses: actions/checkout@v4 + with: + ref: gh-pages + path: pages + + - name: Generate manifest + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} + run: python3 master/.github/scripts/enrich_manifest.py pages + + - name: Publish to gh-pages + working-directory: pages + run: | + git config user.email "actions@github.com" + git config user.name "github-actions[bot]" + git add manifest.json manifest.flat + if git diff --cached --quiet; then + echo "No manifest changes; nothing to commit." + else + newest=$(jq -r '.channels.nightly // "empty"' manifest.json) + git commit -m "manifest: $(date -u +%FT%TZ) — ${newest}" + git push + fi From 1917b2b726a6420d59a293729aef3e439541a79a Mon Sep 17 00:00:00 2001 From: Puzzak01 Date: Mon, 10 Aug 2026 22:38:53 +0300 Subject: [PATCH 39/41] . --- .github/workflows/master.yml | 380 +++++++++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 .github/workflows/master.yml diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml new file mode 100644 index 000000000..a39680e51 --- /dev/null +++ b/.github/workflows/master.yml @@ -0,0 +1,380 @@ +name: Build +on: + schedule: + - cron: '0 3 * * *' + workflow_dispatch: + inputs: + platform: + description: Platform + required: false + +jobs: + preflight: + name: Preflight + runs-on: ubuntu-latest + outputs: + should_build: ${{ steps.gate.outputs.should_build }} + head_sha: ${{ steps.gate.outputs.head_sha }} + short_sha: ${{ steps.gate.outputs.short_sha }} + build_id: ${{ steps.gate.outputs.build_id }} + built_at: ${{ steps.gate.outputs.built_at }} + steps: + - uses: actions/checkout@v4 + - id: gate + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + HEAD=$(git rev-parse HEAD) + SHORT=$(git rev-parse --short HEAD) + BUILD_ID="nightly-$(date -u +%Y%m%d)-${SHORT}" + BUILT_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ) + # Nightly rebuilds unconditionally on schedule. builder.sh re-clones + # OpenIPC/firmware at HEAD on every run, so the relevant inputs are + # mostly outside this repo (firmware HEAD, toolchain release, kernel + # tarball, vendor osdrv, individual package upstreams). The previous + # gate skipped when only this repo's HEAD matched the last published + # nightly, which made upstream fixes (e.g. an openhisilicon mipi_rx + # regression fix that lands in firmware) invisible to users until + # something here happened to change. Always build on schedule. + echo "Build: $BUILD_ID (event=${{ github.event_name }})" + echo "should_build=true" >> "$GITHUB_OUTPUT" + echo "head_sha=$HEAD" >> "$GITHUB_OUTPUT" + echo "short_sha=$SHORT" >> "$GITHUB_OUTPUT" + echo "build_id=$BUILD_ID" >> "$GITHUB_OUTPUT" + echo "built_at=$BUILT_AT" >> "$GITHUB_OUTPUT" + + buildroot: + name: Firmware + needs: preflight + if: needs.preflight.outputs.should_build == 'true' + runs-on: ubuntu-latest + env: + BUILD_ID: ${{ needs.preflight.outputs.build_id }} + BUILD_SHA: ${{ needs.preflight.outputs.head_sha }} + BUILD_PLATFORM: ${{ matrix.platform }} + + strategy: + fail-fast: false + matrix: + platform: + - gk7202v300_lite_cootli_camv0103 + - gk7202v300_lite_ipg-g3-wr + - gk7202v300_lite_xg521 + - gk7205v200_lite_cpplus-cp-unc-ta21l2c + - gk7205v200_lite_tiandy-tc-c321n + - gk7205v200_lite_vixand-ipc-1 + - gk7205v200_lite_vixand-iph-5-4g + - gk7205v210_lite_tiandy-tc-c32qn + - gk7205v210_lite_vixand-ivg-g3s + - gk7205v210_lite_vixand-ivg-g4f-a + - gk7205v210_lite_vixand-ivg-g4f-a-w + - gk7205v210_lite_vixand-ivg-g4h + - gk7205v300_lite_vixand-ivg-g6s + - gk7205v300_lite_vixand-ivg-g6s-w + - hi3516cv200_lite_trassir-tr-d4121ir1-v2 + - hi3516ev300_ultimate_rostelecom-ipc8232swc-we + - hi3516ev300_ultimate_rvi-1ncmw2028 + - hi3518ev200_lite_smartwares-cip-37210 + - hi3518ev200_lite_switcam-hs303 + - hi3518ev200_lite_switcam-hs303-v2 + - hi3518ev200_lite_vstarcam-c8892wip + - hi3518ev200_lite_qtech-qvc-ipc-136w + - hi3518ev300_lite_bathhouse + - hi3518ev300_lite_xiaomi-mjsxj02hl + - hi3518ev200_ultimate_lenovo-snowman-1080p + - ssc30kd_lite_cmcc-ds-ytj5301 + - ssc325_lite_imilab-ec3-cmsxj25a + - ssc325_lite_imou-c22cp + - ssc325_lite_tp-link-tapo-c310-v1 + - ssc325_lite_trassir-tr-w2c1-v1 + - ssc325de_lite_imou-c22ep-s2 + - ssc333_lite_meari-speed-6s + - ssc333_lite_tp-link-tapo-c110-v2 + - ssc333_lite_tp-link-tapo-c110-v26 + - ssc333_lite_babysense-see-hd-ip206 + - ssc333_lite_vstarcam-c43s_b + - ssc335_lite_tp-link-tapo-c110-v1 + - ssc335_lite_tp-link-tapo-c310-v220 + - ssc335_lite_trassir-tr-w2c1-v2 + - ssc335de_lite_dahua-hfw1230sp-v2 + - ssc335de_lite_imou-c22e-s2-v2 + - ssc335de_lite_uniview-c1l-2wn-g + - ssc337_lite_h3c-tc2101 + - ssc337_lite_tiandy-tc-c321n-v2 + - ssc337_lite_tp-link-tapo-c110-v1 + - ssc337de_ultimate_foscam-x5 + - ssc337de_ultimate_switcam-b200 + - ssc338q_fpv_caddx-fly + - ssc338q_fpv_emax-wyvern-link + - ssc338q_fpv_openipc-mario-aio + - ssc338q_fpv_openipc-thinker-aio + - ssc338q_fpv_openipc-urllc-aio + - ssc338q_fpv_runcam-wifilink + - ssc377qe_fpv_ccdcam-im50q01-tipoman + - t10_lite_hb-wifi-z6 + - t10_lite_jvs-ingt10-gqs60ep + - t20_ultimate_azarton-c1 + - t20_lite_ec37-t11 + - t31_lite_vstarcam-cs55 + - t21_lite_chinamobile-hdc-51-a5-v12 + - t21_lite_smartwares-cip-37210at + - t21_lite_xyx-06s + - t21_lite_wansview-q5-1080p + - t23_lite_jooan-a6m-u + - t23_lite_jooan-q3r-u + - t23_lite_lsc-3215672 + - t31_lite_aceline-aip-o4 + - t31_lite_wansview-q5-2k + - t31_lite_aoni-ep01j05 + - t31_lite_chinamobile-hdc-51-a6-v11 + - t31_lite_cmcc-hdc-51-a6-v10 + - t31_lite_chinatelecom-y4h-50 + - t31_lite_wyze-v3b + - t31_lite_xiaomi-mjsxj03hl + - t31_lite_xiaomi-mjsxj03hl-jxq03 + - t31_lite_tuya-gv7630-t31-ptz + - t31_ultimate_azarton-c1-t31x + - t31_ultimate_gcraftsman-gca50 + - t31_lite_zte-k540 + - t40_lite_movols-mo-805p + + # APFPV + - ssc30kq_apfpv_greg-generic-bu-eu + - ssc30kq_apfpv_greg-generic-cu-eu + - ssc338q_apfpv + - ssc338q_apfpv_greg-generic-bu-eu + - ssc338q_apfpv_greg-generic-cu-eu + - ssc378qe_apfpv + + # FPV + - hi3516ev200_fpv + - hi3516ev300_fpv + - hi3536dv100_fpv + - gk7205v200_fpv + - gk7205v210_fpv + - gk7205v300_fpv + - ssc30kq_fpv + - ssc338q_fpv + - ssc378qe_fpv + + # Ruby + - ssc30kq_rubyfpv_generic + - ssc338q_rubyfpv_generic + - ssc338q_rubyfpv_thinker_internal_wifi + + # LTE + - hi3516ev200_lte + - hi3516ev300_lte + - gk7205v200_lte + - gk7205v300_lte + + # Venc + - gk7205v200_venc + - gk7205v210_venc + - gk7205v300_venc + + # Mini + - hi3516cv300_mini + - hi3518ev200_mini + + # OTG (camera presents itself to a PC as a USB webcam) + - gk7205v200_otg_generic + + steps: + - name: Checkout source + uses: actions/checkout@v4 + + - name: Prepare firmware + run: | + echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf + echo CACHE_DATE=$(date +%m) >> ${GITHUB_ENV} + INPUT=${{inputs.platform}} + MATRIX=$(echo ${{matrix.platform}} | cut -d_ -f1) + if [ -z ${INPUT} ] || [ ${INPUT} = ${MATRIX} ]; then + echo RUN=${MATRIX} >> ${GITHUB_ENV} + fi + + - name: Setup ccache + if: env.RUN + uses: actions/cache@v4 + with: + path: /tmp/ccache + key: ${{matrix.platform}}-${{env.CACHE_DATE}} + + # builder.sh does `rm -rf openipc` at the top of every run to force a + # clean re-clone of OpenIPC/firmware, which also nukes the default + # `openipc/output/dl/` directory Buildroot uses for downloaded source + # tarballs. Without a cache, every cron run re-downloads ~1-3 GB of + # tarballs from upstream mirrors — and any one of them randomly + # failing (e.g. cgit `snapshot/` URLs that regenerate tarballs per + # request with shifting sha256, like wireguard-tools on + # git.zx2c4.com) takes down the matrix entry for that board. See + # kaeru wireguard-zx2c4-tarball-regeneration-hash-drift for the + # specific incident this caching addresses. + # + # Cache to /tmp/builder-dl (outside the openipc/ tree so builder.sh's + # rm -rf doesn't touch it) and point Buildroot at it via BR2_DL_DIR + # env var (honored per Buildroot manual section "Location of source + # tarballs"). Mirrors OpenIPC/firmware/.github/workflows/build.yml's + # output/dl cache, adapted for builder's clean-clone behavior. + - name: Setup dl cache + if: env.RUN + uses: actions/cache@v4 + with: + path: /tmp/builder-dl + key: builder-dl-${{env.CACHE_DATE}} + restore-keys: builder-dl- + + - name: Refresh moving-ref package downloads + if: env.RUN + run: | + # builder caches BR2_DL_DIR (/tmp/builder-dl) under a monthly key + # (date +%m) and actions/cache only saves on a key miss, so the first build + # of the month freezes it for weeks. Packages pinned to a moving ref keep a + # constant download filename, so buildroot reuses the stale tarball — even + # though builder re-clones firmware HEAD each run for freshness. Two forms: + # - dash: -.tar.gz e.g. majestic-webui-dist.tar.gz + # - dot: ..tar.bz2 e.g. majestic.t31.lite.master.tar.bz2 + # The dot form is majestic's S3 tarball: it LOOKS S3-pinned but is a moving + # `master` build re-uploaded every majestic CI run, with no .hash to force a + # refetch — so it must be evicted too. (Empirically: a 06-14 nightly shipped a + # ~2-week-old majestic-webui; later a t31 lite image shipped a pre-x-groups + # majestic against the current webui — "No settings groups in schema".) Drop + # both forms so buildroot re-fetches the current ref. Only genuinely + # content-addressed tarballs (semver / SHA in the name) keep their cache. + find /tmp/builder-dl -type f -regextype posix-extended \ + -regex '.*[-.](HEAD|master|main|dist)\.tar\.(gz|bz2|xz)' \ + -print -delete 2>/dev/null || true + + - name: Build firmware + if: env.RUN + run: | + export GIT_HASH=$(git rev-parse --short ${GITHUB_SHA}) + export GIT_BRANCH=${GITHUB_REF_NAME} + echo GIT_HASH=${GIT_HASH} >> ${GITHUB_ENV} + echo GIT_BRANCH=${GIT_BRANCH} >> ${GITHUB_ENV} + + mkdir -p /tmp/ccache + ln -s /tmp/ccache ${HOME}/.ccache + + mkdir -p /tmp/builder-dl + export BR2_DL_DIR=/tmp/builder-dl + + NAME=${{matrix.platform}} + # Retry budget for transient upstream toolchain/CDN flakes + # (matches OpenIPC/firmware/.github/workflows/build.yml). + backoffs="30 60 120 300 600 1200" + attempt=1 + for sleep_for in $backoffs ""; do + bash builder.sh ${NAME} && break + if [ -z "$sleep_for" ]; then + echo "::error::build failed after ${attempt} attempts" + exit 1 + fi + echo "::warning::attempt ${attempt} failed, retrying after ${sleep_for}s" + sleep "$sleep_for" + attempt=$((attempt + 1)) + done + cd openipc + + TIME=$(date -d @${SECONDS} +%M:%S) + echo TIME=${TIME} >> ${GITHUB_ENV} + COMMON=$(echo ${NAME} | awk -F_ '{print NF-1}') + + NORFW=$(find output/images -name openipc*nor*) + if [ ! -z ${NORFW} ]; then + if [ ${COMMON} -eq 1 ]; then + echo NORFW=openipc/${NORFW} >> ${GITHUB_ENV} + else + mv ${NORFW} ../${NAME}-nor.tgz + echo NORFW=${NAME}-nor.tgz >> ${GITHUB_ENV} + fi + fi + + NANDFW=$(find output/images -name openipc*nand*) + if [ ! -z ${NANDFW} ]; then + if [ ${COMMON} -eq 1 ]; then + echo NANDFW=openipc/${NANDFW} >> ${GITHUB_ENV} + else + mv ${NANDFW} ../${NAME}-nand.tgz + echo NANDFW=${NAME}-nand.tgz >> ${GITHUB_ENV} + fi + fi + + if [ -z ${NORFW} ] && [ -z ${NANDFW} ]; then + exit 1 + fi + + - name: Build size report + if: env.NORFW || env.NANDFW + run: | + cd openipc + NAME=${{matrix.platform}} + make BOARD=${NAME} size-report || \ + { echo "::warning::size-report failed for ${NAME}"; exit 0; } + SIZES=$(find output/images -name 'sizes.*.json' | head -1) + if [ -z "${SIZES}" ]; then + exit 0 + fi + # Mirror the .tgz rename trick: compound matrix entries + # (`__-`) share `_` and + # would collide on the firmware-side `sizes.-.json` + # filename when uploaded to the same release tag. Rename to + # `sizes..json` so every compound device gets its own asset. + COMMON=$(echo ${NAME} | awk -F_ '{print NF-1}') + if [ ${COMMON} -eq 1 ]; then + echo "SIZES=openipc/${SIZES}" >> ${GITHUB_ENV} + else + mv ${SIZES} ../sizes.${NAME}.json + echo "SIZES=sizes.${NAME}.json" >> ${GITHUB_ENV} + fi + + - name: Upload firmware (dated) + if: env.NORFW || env.NANDFW + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ needs.preflight.outputs.build_id }} + prerelease: true + body: | + sha=${{ needs.preflight.outputs.head_sha }} + short=${{ needs.preflight.outputs.short_sha }} + built_at=${{ needs.preflight.outputs.built_at }} + files: | + ${{env.NORFW}} + ${{env.NANDFW}} + ${{env.SIZES}} + + - name: Upload firmware (rolling nightly) + if: env.NORFW || env.NANDFW + uses: softprops/action-gh-release@v2 + with: + tag_name: nightly + body: | + sha=${{ needs.preflight.outputs.head_sha }} + short=${{ needs.preflight.outputs.short_sha }} + built_at=${{ needs.preflight.outputs.built_at }} + files: | + ${{env.NORFW}} + ${{env.NANDFW}} + ${{env.SIZES}} + + - name: Upload firmware (latest — legacy alias) + if: env.NORFW || env.NANDFW + uses: softprops/action-gh-release@v2 + with: + tag_name: latest + files: | + ${{env.NORFW}} + ${{env.NANDFW}} + ${{env.SIZES}} + + - name: Send binary + if: env.NORFW + run: | + TG_MSG="Build: ${BUILD_ID}\nCommit: ${GIT_HASH}\nBranch: ${GIT_BRANCH}\nTime: ${TIME}\n\n" + TG_ICON="\xE2\x9C\x85 GitHub Actions" + TG_HEADER=$(echo -e ${TG_MSG}${TG_ICON}) + TG_TOKEN=${{secrets.TELEGRAM_TOKEN_BOT_OPENIPC}} + TG_CHANNEL=${{secrets.TELEGRAM_CHANNEL_OPENIPC_DEV}} + HTTP=$(curl -s -o /dev/null -w %{http_code} https://api.telegram.org/bot${TG_TOKEN}/sendDocument -F chat_id=${TG_CHANNEL} -F caption="${TG_HEADER}" -F document=@${NORFW}) + echo Telegram response: ${HTTP} From dd139b937efaa8c68c5084c4c30760ccb3f46655 Mon Sep 17 00:00:00 2001 From: Signor Pellegrino <68112357+flyrouter@users.noreply.github.com> Date: Mon, 10 Aug 2026 22:48:53 +0300 Subject: [PATCH 40/41] Clean up exclude list by removing old sensor files Removed outdated sensor and module entries from the exclude list. --- .../scripts/excludes/ssc337de_ultimate.list | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/devices/ssc337de_ultimate_switcam-b200/general/scripts/excludes/ssc337de_ultimate.list b/devices/ssc337de_ultimate_switcam-b200/general/scripts/excludes/ssc337de_ultimate.list index 3207b70ea..f13ce0aa6 100644 --- a/devices/ssc337de_ultimate_switcam-b200/general/scripts/excludes/ssc337de_ultimate.list +++ b/devices/ssc337de_ultimate_switcam-b200/general/scripts/excludes/ssc337de_ultimate.list @@ -1,31 +1,3 @@ -/etc/sensors/gc4023.bin -/etc/sensors/gc4653.bin -/etc/sensors/imx307.bin -/etc/sensors/imx335.bin -/etc/sensors/jxf37.bin -/etc/sensors/jxq03.bin -/etc/sensors/sc200ai.bin -/etc/sensors/sc2335.bin -/etc/sensors/sc2336.bin -/etc/sensors/sc3338.bin -/etc/sensors/sc401ai.bin -# -/lib/modules/4.9.84/sigmastar/sensor_gc2083_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_gc4023_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_gc4653_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_imx307_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_imx335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_jxf37_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_jxq03_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_os02g10_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc200ai_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2239_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc2336_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc3335_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc3338_mipi.ko -/lib/modules/4.9.84/sigmastar/sensor_sc401ai_mipi.ko -# /lib/modules/4.9.84/kernel/fs/lockd/lockd.ko /lib/modules/4.9.84/kernel/fs/nfs/nfs.ko /lib/modules/4.9.84/kernel/fs/nfs/nfsv3.ko From 2a7e39bdd41f164556dd30379c01dc324f77beea Mon Sep 17 00:00:00 2001 From: Signor Pellegrino <68112357+flyrouter@users.noreply.github.com> Date: Mon, 10 Aug 2026 22:51:40 +0300 Subject: [PATCH 41/41] Add SNS model configuration for sc223a --- .../configs/ssc337de_ultimate_switcam-b200_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam-b200_defconfig b/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam-b200_defconfig index a04d0b3eb..77a0bd1f3 100644 --- a/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam-b200_defconfig +++ b/devices/ssc337de_ultimate_switcam-b200/br-ext-chip-sigmastar/configs/ssc337de_ultimate_switcam-b200_defconfig @@ -44,6 +44,7 @@ BR2_TARGET_ROOTFS_UBIFS_LEBSIZE=0x1f000 BR2_OPENIPC_SOC_VENDOR="sigmastar" BR2_OPENIPC_SOC_MODEL="ssc337de" BR2_OPENIPC_SOC_FAMILY="infinity6b0" +BR2_OPENIPC_SNS_MODEL="sc223a" BR2_OPENIPC_VARIANT="ultimate" BR2_OPENIPC_FLASH_SIZE="16"