github themactep/thingino-firmware firmware-2026-08-09

3 hours ago

Changes in this release:

  • 01110e3 cameras: move Cinnado B6 to experimental (missing libs)
  • e033522 webui: add speaker config and playonspeaker toggle to Send to Services page Add Speaker configuration card to the Send to Services page with fields for file path, volume, gain, and loop count. Add 'Play audio on speaker when motion detected' toggle to the Motion Detection card. Wire both through json-send2.cgi (GET/POST) and send.cgi (test button). Signed-off-by: WLTB-Gino WLTB-Gino@users.noreply.github.com
  • 963cb2f prudynt-t: add missing playonspeaker script The motion script calls 'playonspeaker &' when motion.playonspeaker is enabled, but no such script was ever installed. This left the speaker notification feature completely non-functional. Add a playonspeaker script that reads speaker config (file, volume, gain, loop) from /etc/send2.json and invokes the existing 'play' command, matching the pattern of the other send2* scripts. Signed-off-by: WLTB-Gino gino@wltechblog.com
  • 74ab6e0 cameras: graduate Sannce I21AG to supported
  • e5628af thingino.mk: derive UBOOT_BOARDNAME from defconfig-provided BR2_TARGET_UBOOT_BOARDNAME When a camera defconfig provides BR2_TARGET_UBOOT_BOARDNAME directly (e.g. eufy_t8400x_t31x_sc3235_syn4343), the ifeq block was skipped, leaving UBOOT_BOARDNAME empty. force-config then wrote an empty board name into .config, overriding the defconfig value and causing u-boot to fail with "No U-Boot board name set". Fix by adding an else branch that strips quotes from the defconfig- supplied value to populate UBOOT_BOARDNAME. Signed-off-by: Paul Philippov paul@themactep.com
  • 412e24e Update buildroot to latest version
  • 7d07838 configs: add Wyze Cam Pan v1 (T20X, JXF23, RTL8189FTV) Newer hardware revision of the Wyze Cam Pan v1 ships with JXF23 sensor and RTL8189FTV WiFi instead of the original JXF22 and RTL8189ETV. All GPIO, motor, and peripheral config identical to the original Pan V1.
  • bd2d8f4 Update buildroot to latest version
  • 3111aa3 scripts: remove soc_database.txt and its consumers soc/*.mk files are now the single source of truth for SoC data. The database file, its query script, the validator, and the example are all obsolete — nothing in the build references them anymore. Signed-off-by: Paul Philippov paul@themactep.com
  • 5fc18d0 thingino.mk: source U-Boot defconfig from soc/.mk, not soc_database.txt BR2_TARGET_UBOOT_BOARD_DEFCONFIG now uses SOC_UBOOT_NOR / SOC_UBOOT_NAND from the soc/.mk files directly, same as BR2_TARGET_UBOOT_BOARDNAME already does. This removes the last build-time dependency on get_soc_params.sh → soc_database.txt from the main Makefile. make-bundle.sh: resolve SOC_FAMILY from soc/.mk instead of get_soc_params.sh. Signed-off-by: Paul Philippov paul@themactep.com make-bundle.sh: accept SOC_FAMILY from Makefile instead of shell grep Pass SOC_FAMILY as 4th argument from the bundle-% target, which already has it via the soc/.mk includes. The script keeps a .config fallback for manual invocation. Signed-off-by: Paul Philippov paul@themactep.com
  • e89cfc0 soc: use model-specific U-Boot NOR board names matching 2026.07 Replace the canonical-family name approach (reverted from 7630771) with the opposite strategy: patch U-Boot 2013.07 to accept the 2026.07 model-specific naming convention. This way soc/.mk and soc_database.txt share one set of names that work with both U-Boot versions. soc/.mk + soc_database.txt: use the model-specific NOR board names that U-Boot 2026.07 defconfigs expect (e.g. isvp_t10l_sfcnor instead of isvp_t10_sfcnor_lite, isvp_t33_sfcnor for all T33 models, isvp_t41lq_sfcnor instead of isvp_t41lq_sfc_nor, isvp_a1n_sfcnor instead of isvp_a1_all_lzma_sfc0nor). uboot 2013.07: add 0004 patch with 18 model-specific board entries in boards.cfg. Each new entry is a one-line alias that reuses the same configuration header and options as the existing canonical entry, so no behavior changes for existing boards. Signed-off-by: Paul Philippov paul@themactep.com
  • 7630771 soc: align U-Boot board names with soc_database.txt Update SOC_UBOOT_NOR / SOC_UBOOT_NAND targets in all Ingenic SoC family .mk files to match the canonical names from scripts/soc_database.txt. Key changes by family: - T10/T20/T30: model suffixes replaced with canonical family names (_lite, _ddr128M, bare family name) - T21: all models now use isvp_t21_sfcnor (was isvp_t21n_sfcnor) - T23: t23zn uses isvp_t23n_sfcnor (was isvp_t23zn_sfcnor) - T31: NOR targets aligned (_lite, _ddr128M, bare family, per-model) - T33: per-model NOR targets (was generic isvp_t33_sfcnor) - T40: t40a NOR uses isvp_t40a_sfcnor (was isvp_t40n_sfcnor) - T41: NOR targets use sfc_nor (was sfcnor); per-model canonicals - A1: all use isvp_a1_all_lzma_sfc0nor (was isvp_a1n_sfcnor) - C100: isvp_c100_sfcnor/sfcnand (was isvp_t31a_sfcnor/sfcnand)
  • 9b5eea4 package/prudynt-t: update to 90b9363 Update prudynt-t from d5336b3 to 90b9363 Hash change: d5336b363f4ca44090185d77579612bad640a7f6 -> 90b936321f6edc3ad2e70427c2f22670a4942cbe Changelog: 90b9363: Fix -Wunused-but-set-variable warnings
  • d9eaae0 thingino-sensor-info: remove .hash from a git repo
  • cb045d0 makefile: add soc .mk files
  • b812da8 kernel: vfat driver causes false corruption detection on sensing a card
  • d1489af cameras: chime button is actually gpio.chime
  • c1728ce add helper scripts for testing with go2rtc and mediamtx containers
  • 658bf4b sync timps package from master
  • fe18b50 sync raptor packages from master
  • 104cda9 package/prudynt-t: correct hash
  • f72ef02 package/timps: update to v1.8.1 Update timps from v1.7.8 to v1.8.1 Hash change: v1.7.8 -> v1.8.1 (No changelog available)
  • a82ff1c package/thingino-sensor-info: update to 625667a Update thingino-sensor-info from 85a4c83 to 625667a Hash change: 85a4c830d8a1ce17bf4e06baa8d7a0c68cc8308e -> 625667a0d58838dd3b8cac31062727c61fa38366 Changelog: 1893c44: Halve the binary: pack the table, drop scanf, size-tune the build d99c51d: build: adopt raptor's remaining size flags, minus lto 35a0d38: build: -fno-pie/-no-pie 845c9c4: Cut compressed size: 32-bit kHz clock math, LTO, headerless release 625667a: build: -mno-abicalls
  • 3f75476 package/open-tx-isp: update to 3f8166c Update open-tx-isp from 14d83f7 to 3f8166c Hash change: 14d83f7790f4dd4e711eada466c544830a9ab611 -> 3f8166c7b89363f996923e2edd2a6bb52a504d9c Changelog: 3f8166c: t31: fix mainline CSI and frame DMA setup
  • 4f12e21 package/libjuice: update to v1.7.3 Update libjuice from v1.7.2 to v1.7.3 Hash change: v1.7.2 -> v1.7.3 (No changelog available)
  • 02f0456 package/buildscope: update to 902e0af Update buildscope from f1cb5a6 to 902e0af Hash change: f1cb5a698037664947df38abaa9985d838cc92a0 -> 902e0af3ad90b208d49b1c74f5c1f9cb938b68da Changelog: a02bfcb: Read the device tree inside a bootloader, not just beside it 7aed7b1: Device trees: say which stage each one came from 1da5bd8: Version 0.1.8 335f251: Record named files from the target filesystem 9a159a8: Show a captured device config, and diff it 81ecee2: Version 0.1.9 9b2657c: Title the panel that is already open 902e0af: Title the last three untitled panels
  • 7f96e64 webui: add some raptor flavor
  • f2a35d5 cameras: jooan w8u, set memopt 0
  • ce7ec8f cameras: add cinnado b6 t23zn
  • 1227c18 clean up
  • 237863f makefile: changes from master
  • b82f37e make thingino agent aware of raptor
  • b0f75d2 scripts: add daynightd test
  • a1b01d0 linux: switch erase size to 64KB where supported (all)
  • da04fa8 ingenic-lib: enable c++ lib where needed
  • 57089d1 ha: handle boolean values in privacy payload
  • 92a13c2 system: update info
  • 52193a8 webui: delete runtime config
  • ec95fff daynightd: select with prudynt
  • 8358971 agents: update onboarding information
  • eb2a23c cameras: normalize configs
  • dcaf3cc webui: fix photosensing button states in native heartbeat payload (#1434) Two fixes for the native (Prudynt) heartbeat payload: 1. Sensor states were hardcoded to null — replaced with calls to existing thingino_heartbeat_ircut_state() and thingino_heartbeat_light_state() helpers (already used by the raptor payload). 2. color_mode was derived from daynight_mode (photosensing policy) instead of actual ISP state. Always read image.running_mode from prudyntctl so manual toggles are reflected immediately. Fixes #1423. Signed-off-by: WLTBAgent
  • cafc26d motors: convert invert_x/invert_y booleans to integers for SPI modprobe (#1433) SPI motor kernel module expects integer parameters (0/1) for invert_x and invert_y, but jct returns JSON booleans (true/false). Passing false to modprobe causes Invalid argument error, preventing the motor module from loading. Fix: convert true→1, false→0 before passing to modprobe. Reported-by: CaptainRon (Discord) Signed-off-by: WLTB-Gino
  • 602aa6e docs: document doorbell chime volume hardware limitations Add a Hardware limitations section explaining the discrepancy between the protocol byte (0-255), the software range (UI clamps to 1-8, CLI accepts 1-32), and the actual hardware PWM resolution (~4-8 distinct levels). Also update volume references in the parameters table and troubleshooting section. Signed-off-by: Paul Philippov paul@themactep.com
  • f094b89 webui: clamp doorbell chime volume max to 8 The Wyze Doorbell V1 chime hardware only differentiates ~8 distinct volume levels, so showing a 1-32 range in the UI is misleading. Clamp the slider and event volume inputs to max 8. Signed-off-by: Paul Philippov paul@themactep.com
  • c173a2a package/prudynt-t: bump to d5336b3 (refuse corrupted config) Signed-off-by: Paul Philippov paul@themactep.com
  • e90fc0c privacy: consolidate config, update plugin and docs - Rewrite thingino-privacy-lite WebUI plugin to use the new top-level privacy.enabled and privacy.save_state keys instead of the removed per-stream osd.privacy.enabled. - Update docs/streamer.md: document privacy.enabled / privacy.save_state, remove obsolete osd.privacy section. - Bump prudynt-t to c66bd5e (JSON API save_state support). Signed-off-by: Paul Philippov paul@themactep.com
  • 3ff2b4a package/prudynt-t: bump to 3056017 (privacy persistence + IMP error trapping) - privacy: persist state across restarts with privacy.enabled and privacy.save_state - privacy: add error trapping on all IMP OSD calls Signed-off-by: Paul Philippov paul@themactep.com
  • cee1f68 prudynt-t: bump to dfe359b (fix privacy cover on T10/T20/T21/T30) Signed-off-by: Paul Philippov paul@themactep.com
  • a995403 package/prudynt-t: bump to ccd1e63 (RTSP auth enforcement) Signed-off-by: Paul Philippov paul@themactep.com
  • e85d719 package/prudynt-t: update to a29a966 Update prudynt-t from 585aac4 to a29a966 Hash change: 585aac4db0520dc9b1f78f15b6c4f7a3ecd9a9cd -> a29a96625d983e504066514869e6402078e1b16a Changelog: fcf4ada: fix: revert broken night-mode framerate halving, cap T31 1080p to 25fps ce2080b: feat: encoder watchdog — force-cycle on consecutive polling timeouts f3a2836: fix: honor configured running_mode at ISP init instead of hardcoding Day a29a966: test: daynightd initial mode detection simulator
  • 2c9fff0 webui: fix URL-encoded diagnostic uploads Replace the broken upload_data POST roundtrip with direct_upload, which re-runs thingino-diag -j on the backend. The old path sent diagnostic data URL-encoded through JS -> CGI -> nc, but the CGI's naive eval-based form parser never decoded percent-sequences, resulting in garbled termbin pastes like 'Sat+Aug++8+13%3A55%3A12'. Now the upload button triggers the same clean backend path as the direct_upload checkbox, going thingino-diag -> send2termbin -> nc with no encoding middlemen. Signed-off-by: Paul Philippov paul@themactep.com
  • 110e1c1 uclibc: guard _ABI64 with defined() in bits/wordsize.h on mips
  • 4f0bcf1 sensor-info: update .hash file
  • 9d7cb7f sensor: handle both suffixed and unsuffixed /proc/jz/sensor layouts The kernel can expose /proc/jz/sensor in two formats: - suffixed: numbered subdirs like sensor0/ with a count file - unsuffixed: sensor attributes directly in /proc/jz/sensor/ Make the sensor script auto-detect the layout at runtime, and add a fallback to the two CGI scripts so they try sensor0/name first then name for the unsuffixed case. Signed-off-by: Paul Philippov paul@themactep.com
  • 326aeb3 package/buildscope: update to f1cb5a6 Update buildscope from afa9252 to f1cb5a6 Hash change: afa9252925afdbe0ecb88bb9f62145390dfafa16 -> f1cb5a698037664947df38abaa9985d838cc92a0 Changelog: d232f3e: Flash table: say what each size column means f1cb5a6: Sizes can be read as KiB/MiB, exact bytes, or hex
  • 4e61f59 webui: typo in a macro command
  • 6c66c31 mdnsd: add thingino service
  • 556e562 uboot: clean up default uenv.txt
  • e01c7a2 kopt: check for both t10 and t20 soc
  • 67070f4 uboot: update 2026.07 files
  • d0a1ac6 remove deprecated ledd
  • 016a830 cameras-exp: add configs from master
  • 8d1c024 cameras: rename stray uenv.txt
  • 68b404d cameras: formatting
  • 2dd3392 boards: add wyze_floodlightv2_t41nq.dts from master
  • 91012f4 makefile: default libc to uclibc
  • f0f7eed makefile: add architecture based on vendor
  • 4b7d805 wyze-accessory: fix commands. blank lines break concatenation
  • 6c4359d atbm6062u: get kernel version from a variable
  • 2cf9107 typos
  • 43b13c6 uboot: update version descriptions
  • 9d8be90 sysupgrade: define branch as a variable
  • e22f8e8 onvif: drop patch, patched upstream
  • bcb9567 mmc: check for multiple endpoints
  • f11326a package/dropbear: drop patched for older versions
  • f9cdfa4 update toolchain defconfigs from master
  • ce51e6d cameras: remove goorbell.fragment, remove chimes from vdb2 config
  • c5367cf package/thingino-onvif: update to 81962a6 Update thingino-onvif from 4ca8f06 to 81962a6 Hash change: 4ca8f063563b96631d04e1ed7ceb2244d413f736 -> 81962a644aa459f61b96cfd2da884249385af1a3 Changelog: 81962a6: media: add silent audio_output_available() for GetProfiles/GetProfile
  • 9145f5d package/open-tx-isp: update to 14d83f7 Update open-tx-isp from 96c5dc2 to 14d83f7 Hash change: 96c5dc2b5733d4879e38b94356871bd4bc55edbe -> 14d83f7790f4dd4e711eada466c544830a9ab611 Changelog: c0d8ea0: Add working T41 V4L2 MMAP capture 9ca32dc: Add standalone T41 V4L2 lifecycle and DMA-BUF export 7d649ec: t41: preserve main-channel tuning with V4L2 0678f96: t41: support live color profile handoff 14d83f7: t41: add live low-light color model
  • 27952f5 package/buildscope: update to afa9252 Update buildscope from 8422478 to afa9252 Hash change: 8422478d4557679a141b5334472df631b78fda6f -> afa9252925afdbe0ecb88bb9f62145390dfafa16 Changelog: de2856b: Viewer: stop a hyphenated format chip from wrapping e8c7eb4: Add export --fleet: a release-ready index and report tarball 8d3e1f7: Viewer: read a fleet snapshot from a release 796e034: Viewer: let ?repo= point a fleet at the fork 311a207: Add buildscope's own fleet proxy Worker d82b382: Publish prebuilt CLI binaries on release c60d4bd: Create the release before attaching binaries to it 1892856: Release: test for a program interpreter, not file(1) wording c7e0cce: Release: build the tag being released, not the dispatch ref 8ae55e9: Landing page: a way into a published fleet 5a3ef72: Fleet: a visible way back to the device listing 0d3ad79: Report what a build was made from, via its os-release 695c639: Release 0.1.1 f6310b5: worker: let readers revalidate instead of re-downloading 21ff7fa: Fleet: sort by name by default 08fdc32: Packages: expand the treemap to the viewport ee14eef: Discover snapshots through the proxy, and say so while looking 6d340e2: Fleet: let the brand link leave the fleet 3aa25f9: export --fleet: carry each build's flash layout in the index 0c29740: Fleet: a flash-map view, and stepping between builds d186df6: Release 0.1.2 4658816: Read the kernel's own config out of the image b3f8bda: Release 0.1.3 dc7caea: Modules: list the built-in ones behind their count 29d88c2: Fold the kernel config into one Kernel tab e519ed3: Landing page: say whose releases these are, and what is in them 66c3de5: Drop zone: say what buildscope reads, not just how 17c4c3f: README: document integrating buildscope into a Buildroot build 0f7cc0f: docs: bring the other three up to date c2e10a9: Opt-in help balloons, as the other thingino web apps do them 5266e0f: Help toggle: fill it while on, so hover cannot impersonate it e9545a9: Explain context source and scan mode where they are shown fbcd86c: Read Ingenic JZLZMA, which no standard tool does 67150ad: Carve a layout for images that keep no readable environment 2db1768: Landing page: line the releases card up with the drop target cf80ac9: Escape every < in the report payload of an exported page fbd4720: Reduce a build name to a leaf before it becomes a tar member 5aa499b: Stop a crafted image from driving the terminal it is inspected on 91fd534: Version 0.1.4 0acd0ad: Take the footer version from Cargo.toml, not package.json 5885747: Drift: compare a profile against its own past, not its neighbour 3e48f4f: Keep the terminal filter off machine output 7bf0bb3: Drift: a partition that spans the others carries no delta d249364: Version 0.1.5 10141f9: Name the comparison tab after the column it is about 5c7ec4a: Delta: compare kernel config and U-Boot environment ed14ed4: Selects: stop the native control clipping its own text 1930750: Fleet proxy: stop a rate-limited API call hiding published releases a154a23: Write the map-key separator as an escape, not a raw NUL d8bf394: Fleet proxy: hold settled releases far longer 48e62dc: Fleet proxy: version the cache keys 3f613ab: Capture how a build was configured 9d62e92: Show the build configuration, and diff it 10db583: Version 0.1.6 df5d2c9: Keep the builder out of the captured config 53e46f0: Version 0.1.7 dc563a9: Fleet proxy: serve branch releases too, not just firmware-* 1ddc408: Fleet proxy: bump the cache version for the tag-rule change afa9252: Fleet proxy: an unknown tag is not a settled one
  • f8dfd79 timps: bump TIMPS_VERSION to v1.7.8 C11 data-race hardening (audio.mute, daynight thread, OSD .enabled), osd.vars_file documentation + QA coverage, empty-credentials exposure documentation. https://github.com/Lu-Fi/timps/releases/tag/v1.7.8 Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
  • d31ebfb package/open-tx-isp: update to 96c5dc2 Update open-tx-isp from f3757d1 to 96c5dc2 Hash change: f3757d1f736336b0de6fb0a0a2fd5bc8a20309e1 -> 96c5dc2b5733d4879e38b94356871bd4bc55edbe Changelog: 09438ef: Keep incomplete T41 TMO fail-safe after cold boot 2d9600d: Gate T41 recovery traces off hot paths bcf6d1d: Add reusable capture queue core for V4L2 96c5dc2: Record optimized T41 checkpoint and client state
  • c3084e0 package/llhttp: add missing hash for v9.4.3 The .mk was already at 9.4.3 but the .hash file still only had the v9.4.2 entry. Download the v9.4.3 tarball and record its SHA-256.
  • 3fa4180 scripts/update_packages: also update .hash file for release bundles When updating a GitHub release-bundle package, automatically download the new tarball, compute its SHA-256, and record it in the package's .hash file. Previously the script only bumped the _VERSION in the .mk file, leaving Buildroot without a matching hash and causing build failures.
  • 6e723f3 package/open-tx-isp: update to f3757d1 Update open-tx-isp from ad9db44 to f3757d1 Hash change: ad9db44cb71b25460ee50e6bcbc5cfc27a5a0958 -> f3757d1f736336b0de6fb0a0a2fd5bc8a20309e1
  • 6e5277b package/lightnvr: update to 0.36.7 Update lightnvr from 0.36.6 to 0.36.7 Hash change: 0.36.6 -> 0.36.7 (No changelog available)
  • 8852396 webui: paranoid mode: run CDN rewrite after all package finalize hooks The paranoid CDN -> local rewriting was registered as a per-package TARGET_FINALIZE_HOOKS on thingino-webui. Streamer packages like timps install their own HTML overlays via THEIR finalize hooks, and when thingino-webui is processed first its paranoid rewrite fires before those overlays land - leaving CDN <script>/ tags intact on timps-specific pages (preview, streamer-main, config-motion, etc.). Move the hook to ROOTFS_PRE_CMD_HOOKS which runs after every package's finalize hooks. Plugin assembly (ASSEMBLE_PLUGINS) also completes before this point and only injects local paths, so the order is safe. Closes #1396 Signed-off-by: Paul Philippov paul@themactep.com
  • ae9331a webui: motors: skip tilt validation on pan-only cameras When all tilt GPIOs are -1 the hardware has no tilt axis and steps_tilt = 0 is legitimate. Skip tilt GPIO and steps validation in that case instead of blocking the entire form with "Tilt max steps must be a positive number". Also fix the error display: the fallback showAlert used textContent which rendered
    tags literally. Show each validation error as a separate alert instead. Closes #1402 Signed-off-by: Paul Philippov paul@themactep.com
  • 86a961a thingino-raptor-hal: own the vendor selects (#1398) * thingino-raptor: condition the ingenic hardware selects on the ingenic vendor Selecting Raptor pulls in ingenic-lib, ingenic-lib-libimp, libimp-debug, ingenic-system-libs-neo (+libalog), libaudioprocess-neo, ingenic-lib-audioprocess and the Ingenic musl/uClibc shims. Those are Ingenic silicon, but Raptor reaches the hardware through thingino-raptor-hal rather than linking them directly, so the streamer itself is not tied to a vendor. Condition them on BR2_SOC_VENDOR_INGENIC, which the SoC vendor choice provides. BR2_PACKAGE_LIBSCHRIFT, THINGINO_FONTS, THINGINO_LOGO and COMPY stay unguarded -- they are vendor-neutral. The IVS sub-options (ingenic-lib-jzdl, ingenic-lib-persondet) are left alone; they sit under features that are Ingenic by definition. Every existing board resolves BR2_SOC_VENDOR_INGENIC=y, so this is inert for them by construction. * thingino-streamer: source the raptor library Config.in files package/thingino-raptor-{hal,ipc,common}/Config.in are sourced nowhere, so BR2_PACKAGE_THINGINO_RAPTOR_{HAL,IPC,COMMON} are undefined and the three selects naming them in thingino-raptor/Config.in are silent no-ops. Kconfig does not warn when a select names a symbol it has never seen. Nothing reads the three symbols today, so this is latent rather than broken -- the packages build because Buildroot builds anything named in a _DEPENDENCIES list. It stops being latent in the next commit, which moves raptor's vendor selects into the HAL's Config.in and needs that file to actually be read. Each of the three currently declares a bare bool and nothing else, so defining them changes no package selection. * thingino-raptor-hal: own the vendor selects Moves raptor's Ingenic library selects into the HAL, replacing the per-line if BR2_SOC_VENDOR_INGENIC guards from the first commit. This is @themactep's review point: raptor the application does not know what silicon it runs on, the HAL does, so the HAL should carry the vendor knowledge. Rather than repeating the guard on each library, the HAL selects one hidden backend symbol per vendor and that symbol carries the libraries. A new vendor is one select and one block, not nine guards. The .mk gets the matching treatment -- one ifeq per vendor around its DEPENDENCIES, per the same review. The two if BR2_TOOLCHAIN_USES_* conditions are kept: both shims declare a matching depends on, so dropping them would be selecting a symbol whose dependency is unmet. Depends on the previous commit. Without it nothing sources thingino-raptor-hal/Config.in, and moving the selects into a file Kconfig never reads would drop them: on a raptor board LIBIMP_DEBUG and INGENIC_LIB_AUDIOPROCESS have no other selector at all, and LIBIMP, SYSTEM_LIBS_NEO, _LIBALOG, LIBAUDIOPROCESS_NEO and INGENIC_UCLIBC are only selected by other streamers, which are not enabled when raptor is. No functional change for Ingenic: BR2_SOC_VENDOR_INGENIC is the Kconfig default and every existing board resolves to it. --------- Co-authored-by: John Chia john@johnchia.com
  • 7353048 Config.in: move the Ingenic selects into a per-vendor block (#1397) * Config.in: condition the ingenic-only selects on the ingenic vendor BR2_THINGINO_SYSTEM_PACKAGES hard-selects ingenic-diag-tools, ingenic-lib, ingenic-pwm, ingenic-sdk, ingenic-musl and BR2_TARGET_UBOOT. Those are Ingenic silicon, but the menu cannot simply be turned off by a non-Ingenic vendor: the same "if BR2_THINGINO_SYSTEM_PACKAGES" gates the Config.in sources for the whole application layer -- thingino-core, -jct, -system, -webui -- so disabling it to escape the vendor selects takes the application layer with it. Condition them on BR2_SOC_VENDOR_INGENIC instead, which the SoC vendor choice now provides. Every existing board resolves BR2_SOC_VENDOR_INGENIC=y, so this is inert for them by construction. * Config.in: move the Ingenic selects into a per-vendor block Replaces the per-line if BR2_SOC_VENDOR_INGENIC guards from the first commit with the shape @themactep proposed in review: one file per vendor, one select to reach it. Adding a vendor is one line here and one file, not a guard on every select. One deviation from the sketch in that review. select has to be a property of a config, and source is a top-level statement, so bare selects in the sourced file do not parse and source cannot go inside this menu's property list either. The vendor file therefore defines a hidden symbol that the menu selects. No functional change for Ingenic: BR2_SOC_VENDOR_INGENIC is the Kconfig default and every existing board resolves to it, so the same six packages are selected under the same conditions. --------- Co-authored-by: John Chia john@johnchia.com
  • 3fe80e9 mbedtls: shrink TLS OUT I/O buffer 16 KB -> 4 KB per connection (#1412) timps optimization review 2026-07-31, S4: mbedTLS allocates a 16 KB IN plus 16 KB OUT buffer per TLS connection (~34 KB heap each). The IN side must stay at 16 KB - peers may legally send full-size records and shrinking it safely needs the Max-Fragment-Length extension, which common clients do not negotiate. The OUT side only bounds the records we send: mbedtls_ssl_write() hands back partial writes and every consumer in the image (timps, libcurl, libwebsockets, ustream-ssl, libmosquitto, wpa_supplicant) already loops on short writes. Only hard requirement is that our own outgoing handshake messages fit; the self-signed ECDSA/RSA device certs are far below 4 KB. Saves ~12 KB heap per concurrent TLS connection for every mbedTLS user on the target. Verified on cam-garage (wuuk/T31X): TLS 1.3 handshake, 170 KB snapshot and MJPEG streaming over timps HTTPS, uhttpd on 443 - all clean with the rebuilt library. Co-authored-by: Claude Sonnet 5 noreply@anthropic.com
  • 19703ce thingino-onvif: media GetProfiles must not fault when audio output is disabled (#1413) media_audio_output_supported() sends an AudioOutputNotSupported SOAP fault as a side effect of returning 0. GetProfiles/GetProfile used it as a plain conditional around the optional AudioOutputConfiguration block, so any configuration with audio.output_enabled=false (or every profile at audio_decoder=NONE) emitted that fault into the middle of the GetProfiles answer and broke profile discovery for every client. Adds a silent media_audio_output_available() predicate for the profile responses; the explicit AudioOutput actions (GetAudioOutputs, GetAudioOutputConfiguration[s|Options], GetCompatibleAudioOutput- Configurations) keep the faulting variant, which is correct there.
  • 5282ee9 package/prudynt-t: update to 585aac4 Update prudynt-t from c630ae7 to 585aac4 Hash change: c630ae797a86b29e83999fe324323932ec33460c -> 585aac4db0520dc9b1f78f15b6c4f7a3ecd9a9cd Changelog: 585aac4: audio: add mic_hq toggle (48kHz vs 16kHz) with matching bitrate
  • cc95244 cameras: preset t10/t20 units to 20 fps and 16k audio bitrate to lower cpu load
  • f6a706b sysupgrade: point self-update to ciao branch Signed-off-by: Paul Philippov paul@themactep.com
  • c701c51 all-patches: gcc16 MXU2 backend register-allocation fixes Four fixes on top of the initial 16.1.0 port, found by hardware validation of the shim delegate mode (setjmp + address-taken vector locals made LRA loop, then fail to spill): - mips_secondary_reload_class: regno<0 MXU2-mode pseudos reload via lu1q/su1q directly, no GPR intermediate - mov_mxu2: GPR alternatives disparaged (!*d/!*q) - mips_register_move_cost: COP2<->COP2 = ORV cost, GPR<->COP2 expensive - allocno-class steering + preferred_reload_class for MXU2 modes T20-validated with the rebuilt SDK: builtins 382/382, shim plain 441/441, shim -mmxu2 delegate 441/441, dsp 7/7.
  • f34a671 all-patches: add MXU2 patches for gcc16 toolchains binutils/2.45.1: MXU2 rebase of the 2.44 patch (offsets only; opcode rows moved ahead of UDI so lu1q/su1q disassemble correctly under -M mxu2; ASE-gated, plain disassembly unchanged). gcc/16.1.0: the 15.2.0 backend patch, applies unchanged. The gcc16 toolchain defconfigs already select binutils 2.45.1 and gcc 16.1.0, so these version dirs were silently skipping MXU2 until now. Validated via GROUP=github BOARD=toolchain_xburst1_uclibc_gcc16 make sdk, then on T20 hardware: 382/382 native builtins, 431/431 shim, 7/7 dsp.
  • 2570d26 daynightd: bump default night_threshold from 20 to 25 Signed-off-by: Paul Philippov paul@themactep.com
  • d55c462 bump prudynt-t to c630ae7 (backchannel thread sync fix)
  • f9981b6 fix: restore MXU v2 support for XBurst1 SoCs (T10/T20/T21/T30) The GCC 16 transition (5020dde) introduced empty C stubs (0006-mxu-v2-stubs.patch) that replaced the pre-compiled mxu-v2-ex.obj binary asset. The stubs returned soc_support_mxuv2() = 0 for all SoCs, which told the kernel that MXU v2 was absent. The kernel then never enabled the COP2 coprocessor, causing libimp.so's SmartH264 encoder (H264_SMA_CalMBFlag) to raise 'Coprocessor Unusable' -> SIGILL on the first MXU instruction. Fix by removing the harmful stubs patch entirely. The cumulative kernel patch (0001) already references mxu-v2-ex.obj correctly, and the binary assets hook now uses a versioned tarball so each kernel version can ship its own pre-compiled objects. Also make the binary assets hook version-aware so future kernel versions can have their own bundles: thingino-binary-assets-$(LINUX_VERSION).tar.gz
  • 91e7690 dropbear: add wtmpx/wtmp/lastlog disable patch for 2026.94 The dropbear version was bumped from 2026.91 to 2026.94 in the buildroot submodule, but no patch directory was created for the new version, so the wtmpx/wtmp/lastlog disable patch was silently dropped. Without this patch, dropbear tries to write to /var/log/wtmp at login and emits: 'wtmpx_write: problem opening /var/log/wtmp: No such file or directory'
  • 15391f2 thingino-diag: redact SSID and encryption key from WIFI-INFO output Pipe iw/iwconfig output through sed to redact sensitive fields: - ESSID (iwconfig) / ssid (iw) - Encryption key (iwconfig) Matches existing redaction patterns used for WPA-STATUS and WPA-CONF. Signed-off-by: Paul Philippov paul@themactep.com
  • 062acce fix: preserve string values for daynight select fields in photosensing config fix: preserve string values for daynight select fields in photosensing config
  • 299b16e fix: preserve string values for daynight select fields in photosensing config initial_mode and force_mode use elements with string values ("day", "night", ""). The save handlers converted all non-checkbox fields through Number(), which turned "day" into NaN and then fell back to 0 (a JSON number). daynightd checks for JSON_STRING type, so the values were silently ignored on boot and dropdowns appeared empty after reboot. Fix: treat elements as string-valued in both saveDaynightParam() and the save button click handler. Reported by: <@1113896715825713305>
  • 4a29c65 wifi: fix captive portal DHCP regression on WiFi-only cameras Commit 179a502 (wifi: skip wired uplink polling when no wired interfaces exist) introduced a regression where watch_wired_uplink() returns early on WiFi-only cameras before reaching the portal_confirmed call. This means udhcpd and dnsd never start, so clients can associate with the THINGINO-xxxx AP but never receive a DHCP lease. Restructure the guard so any_wired_iface_exists only skips the polling loop. The portal_confirmed call always runs, ensuring DHCP/DNS starts whether or not wired interfaces are present. Reported-by: C-Walk Fixes: 179a502 (wifi: skip wired uplink polling when no wired interfaces exist) Signed-off-by: Paul Philippov paul@themactep.com
  • 0616c02 snmpd: relocate documentation, add user tool, register the service with mdnsd
  • eba1e54 agents: add ascii only rule for scripting
  • 6f7c492 package/timps: update to v1.7.7 Update timps from v1.7.3 to v1.7.7 Hash change: v1.7.3 -> v1.7.7 (No changelog available)
  • 70f3fdd package/prudynt-t: update to e5d4946 Update prudynt-t from be78b46 to e5d4946 Hash change: be78b46092c47b652ed71251c0d960177ddb8793 -> e5d4946ecc7e0874ca362f33ebcdcf9b5d346fcd Changelog: 0bbb467: fix: add missing <unistd.h> for GCC 16 compatibility e5d4946: handle_image: adjust encoder framerate dynamically on running_mode change
  • eecb410 daynight: delegate night-mode FPS halving to prudynt Instead of reading fps from /etc/prudynt.json, halving it, and pushing it back via the prudynt API (which triggered an auto-save, persisting the transient night-mode value to disk), just send the running_mode. Prudynt now handles the FPS adjustment internally via hal::encoder::set_framerate() when the running_mode changes, leaving the config file untouched. Fixes the ratcheting FPS degradation described in issue #1401. Signed-off-by: Paul paul@earendil.org
  • d0ae7c4 toolchain: leave the retired gcc13 fragments alone Upstream dropped gcc13 in 7505ea1, which deleted ext-gcc13-glibc.fragment and ext-gcc13-musl.fragment. Templating their URLs here turned the merge into a modify/delete conflict on both files. Restoring them to their merge-base content, rather than deleting them on this branch, leaves this branch's version identical to the base. The merge then resolves to upstream's deletion with no conflict, and the cumulative diff stops mentioning gcc13 at all.
  • 02bfdb4 agents: update information
  • 876d7ad makefile: default to uclibc and uboot 2013.07 in ciao branch
  • cf7506a buildroot: switch from releases to rolling updates
  • 36f175d sysupgrade: add sigmastar quirks, rewrite existing partition checking
  • 991d73d toolchain: switch to gcc16, drop gcc13, clean up
  • b0aeb85 Update buildroot to latest version
  • afcc5b5 configs: toolchain: point loc-gcc14-uclibc at the uclibc toolchain The uclibc local fragment had BR2_TOOLCHAIN_EXTERNAL_PATH set to /opt/thingino/gcc14-musl-$(KERNEL_VER), a copy-paste from the musl fragment, so it looked for a musl toolchain while declaring BR2_TOOLCHAIN_EXTERNAL_CUSTOM_UCLIBC.
  • 7bdc72f configs: toolchain: enable locale on buildroot uclibc fragments The br- fragments built uClibc without locale, while every CI toolchain profile and both ext- fragments have BR2_TOOLCHAIN_BUILDROOT_LOCALE=y. Locale selects UCLIBC_HAS_XLOCALE, which decides the ctype ABI: with it libc exports _ctype*_loc() functions, without it bare __ctype_b data pointers. So selecting the buildroot toolchain type produced a libc whose ctype ABI did not match any published tarball, and the ingenic-uclibc shim, written against the xlocale interface, broke. gcc14 was additionally missing WCHAR, which ext-gcc14-uclibc already declares (locale selects it too, set explicitly to match siblings).
  • 37e8c43 toolchain: drop gcc13
  • d258d2e Fix formatting in SNMPD configuration flow diagram
  • 94d60ba docs: add thingino-snmpd documentation Comprehensive documentation for the new SNMP monitoring package, covering architecture, configuration, usage examples, monitoring system integration (LibreNMS, Zabbix, Prometheus, Nagios), bundle distribution, troubleshooting, and security considerations. Signed-off-by: Paul paul@thingino.com
  • c4ed62e webui: move paranoid CDN rewriting to finalize hook apply_paranoid_mode.py ran during INSTALL_TARGET_CMDS, before plugin packages (thingino-snmpd, thingino-gpio, etc.) installed their HTML pages. This meant plugin pages kept CDN references even in paranoid mode while core pages got rewritten to local /a/vendor/ assets. Move only the CDN rewriting step to TARGET_FINALIZE_HOOKS. Vendor files are still installed during the main install step since they don't depend on plugin ordering. Signed-off-by: Paul paul@thingino.com
  • 02c2f77 thingino-snmpd: add mini-snmpd 2.0 package with WebUI plugin thingino-snmpd: add mini-snmpd 2.0 package with WebUI plugin
  • 85262f4 snmpd: add snmpd test script Add scripts/test-snmpd.sh — exercises all MIB groups exposed by mini-snmpd 2.0 (system, interfaces, IP, host resources, memory, disks, CPU load/stats, agent counters). Signed-off-by: Paul paul@thingino.com
  • 1aad882 Merge branch 'ciao' into mini-snmpd
  • 22521d9 package/ingenic-diag-tools: bump for the dump column header
  • 55316ed package: port gpio-diag callers to the new CLI gpio-diag is now verb-first, so gpio-diag PIN func N drive M' becomes gpio-diag mode PIN funcN' plus gpio-diag drive PIN M'. This changes behaviour on the MMC pin setups. The old tool dispatched on argv[2] and read its value from argv[3], so everything from drive' on was parsed as nothing and silently dropped: the drive strength those scripts asked for was never applied. It is applied now. pwm-ctrl only ever set a function, so it is a straight translation.
  • 8841ccc package/ingenic-diag-tools: point at thingino/ingenic-gpio The tool was rewritten from Ingenic's GPL-2.0 vendor u-boot and kernel sources and now lives at thingino/ingenic-gpio under GPL-2.0, replacing the AGPL-3.0 fork of Ingenic-community/jz-diag-tools. The Makefile now emits gpio-diag directly, so the install no longer renames the binary. The CLI changed and is not compatible with the old one: commands are verb-first (dump, get, level, mode, drive, bias, toggle, reg) instead of pin-first. Callers in this tree need updating.
  • 510f3e4 uboot: regenerate 2026.07 master patch (ingenic-t-series @ 689f7efcc293)
  • 9f72e09 fix: add numeric prefix to pwm and accessory module files The S11modules init script loads module files from /etc/modules.d/ in glob order. Without numeric prefixes, pwm and accessory files could load in unpredictable positions relative to numbered entries. Prefix pwm as 15-pwm (after 10-avpu, before 20-isp) and accessory as 50-accessory (after 40-audio, keeping USB device modules last). Signed-off-by: Paul Philippov paul@themactep.com
  • 6295113 linux: add gcc16 header
  • c1fb59f clean up
  • 74a8780 thingino-snmpd: add mini-snmpd 2.0 package with WebUI plugin Adds an SNMP agent so cameras can be polled by an NMS (LibreNMS, Zabbix, Observium, check_mk) for uptime, CPU load, memory, disk usage, network interface counters and hwmon temperature sensors. Read-only SNMP v1/v2c with optional SNMPv2c traps; SNMPv3 is out of scope upstream. Built from the 2.0 release tarball, which ships a configure script, so no autoreconf is needed. Configured with --without-config to drop the libConfuse dependency: every setting comes from the "snmpd" section of /etc/thingino.json, assembled into command line arguments by the init script. --without-systemd avoids installing a unit file, and IPv6 follows BR2_INET_IPV6. Includes: - S60snmpd: reads snmpd.* from thingino.json, filters out mount points the camera does not have, and keeps values with spaces intact (location, contact, description) - 50-snmpd.json: defaults staged for thingino-core, with enabled=false so the daemon stays off until configured - WebUI plugin (config-snmpd.html + config-snmpd.js + json-config-snmpd.cgi + thingino-snmpd.webui.json), adding an SNMP entry to the Services menu - thingino-snmpd.bundle, so the package can be shipped as a .tgz bundle Verified on a T31X camera (kernel 3.10.14, uClibc): 83 KB stripped binary, 221 OIDs in a full walk, dskTable exposing / and /overlay, and sysDescr falling back to PRETTY_NAME from os-release when description is empty. Signed-off-by: Matias De lellis mati86dl@gmail.com Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
  • 6eb56fb scripts: make libstdc++ gdb.py removal version-agnostic Replace the hardcoded libstdc++.so.6.0.34-gdb.py check with a glob that matches any libstdc++.so.6.0.*-gdb.py, accommodating future GCC updates that ship version-bumped filenames (e.g. 6.0.35). Signed-off-by: Paul Philippov paul@themactep.com
  • 28df902 toolchain: template the target architecture into the fragment urls The eleven ext-*.fragment files name their release asset with a literal "-linux-mipsel.tar.gz". Only the build host and the SoC tag are interpolated, so the target architecture is the one dimension of the toolchain naming scheme that cannot vary. A non-MIPS board has no way to name its toolchain through a fragment and has to override BR2_TOOLCHAIN_EXTERNAL_URL wholesale in its camera defconfig, which duplicates the whole URL per board and silently breaks whenever the release tag or naming changes. Resolve the architecture once and template it in, reusing the mechanism already there: SED_CONFIG_VARS substitutes seven $(VAR) templates into every fragment before appending it, so this adds one clause rather than new machinery. SOC_TARGET_ARCH is resolved in thingino.mk rather than read from the BR2_mipsel/BR2_arm that the SoC fragment already sets, because fragments are appended to .config and never included as makefiles -- the symbol does not exist when the substitution runs. Inert for every board in the tree: SOC_TARGET_ARCH is "mipsel" on the Ingenic path, so all eleven URLs resolve to the byte they resolve to today. The cost of a further architecture is one line.
  • c99ad33 toolchain: template the target architecture into the fragment urls The eleven ext-*.fragment files name their release asset with a literal "-linux-mipsel.tar.gz". Only the build host and the SoC tag are interpolated, so the target architecture is the one dimension of the toolchain naming scheme that cannot vary. A non-MIPS board has no way to name its toolchain through a fragment and has to override BR2_TOOLCHAIN_EXTERNAL_URL wholesale in its camera defconfig, which duplicates the whole URL per board and silently breaks whenever the release tag or naming changes. Resolve the architecture once and template it in, reusing the mechanism already there: SED_CONFIG_VARS substitutes seven $(VAR) templates into every fragment before appending it, so this adds one clause rather than new machinery. SOC_TARGET_ARCH is resolved in thingino.mk rather than read from the BR2_mipsel/BR2_arm that the SoC fragment already sets, because fragments are appended to .config and never included as makefiles -- the symbol does not exist when the substitution runs. Inert for every board in the tree: SOC_TARGET_ARCH is "mipsel" on the Ingenic path, so all eleven URLs resolve to the byte they resolve to today. The cost of a further architecture is one line.
  • 08bebfe soc: declare the sigmastar soc model The SoC vendor choice offers Ingenic and SigmaStar, and its help text says it selects "which SoC model space is offered below" -- but only Ingenic has one. Selecting SigmaStar in menuconfig leaves no way to name the SoC, and BR2_SOC_FAMILY stays empty for it because that symbol's default chain is keyed entirely on BR2_INGENIC_SOC_MODEL. Nothing in Kconfig can gate on the family for a non-Ingenic vendor. Mirror BR2_INGENIC_SOC_MODEL: a prompted string gated on the vendor, plus a BR2_SOC_FAMILY default keyed on it. Only one vendor's model symbol is ever non-empty, so the two halves of the chain cannot both match and their order does not matter. Ingenic .configs are unaffected -- the new symbol is invisible without the SigmaStar vendor and defaults to the empty string.
  • 5d41689 package/thingino-webui: add paranoid mode build flag for offline asset bundling Add BR2_PACKAGE_THINGINO_WEBUI_PARANOID config option. When enabled: - All CDN references in HTML are rewritten to local /a/vendor/ paths - Optimized vendor assets are installed (PurgeCSS-pruned Bootstrap CSS, fonttools-subsetted Bootstrap Icons, standard Bootstrap JS) - Adds ~248 KB to firmware image - Camera works fully offline, no external requests When disabled (default): - HTML pages reference CDN assets with onerror fallbacks - No vendor files installed — saves space - Graceful degradation when internet is unavailable Also included: - tools/scripts to regenerate optimized assets (optimize-bootstrap.sh, optimize-icons.sh) - apply_paranoid_mode.py for CDN→local HTML rewriting - assemble_plugins.py fix: plugin-injected assets now inherit cache- busting timestamps from data-asset-ts - tool-sensor-data: show warning banner when chart.js CDN is blocked in paranoid mode - wait.html: use CDN reference like other pages Signed-off-by: Paul Philippov paul@themactep.com
  • 3ec4e9c toolchain: switch default GCC to 16 Flip core.fragment, the Config.in choice default, the Makefile fallback, and the resolver fallback from 15 to 16 together. Type stays EXTERNAL so builds download the published gcc16 tarballs. Verified with a pristine vanhua_z55i full image build: gcc 16.1.0 across userspace and kernel, image packs clean.
  • d3ee36e package/thingino-sensor-info: userspace sensor detector, replaces sensor-info script New package builds sinfo from github.com/thingino/sensor-info and installs /usr/sbin/sinfo with a sensor-info compatibility symlink, linked dynamically to keep images small. The old script downloaded a per-SoC, per-kernel sinfo.ko from a GitHub release at runtime; the userspace tool needs no module and works on every SoC. thingino-system stops installing the script; the sensor-utils option now selects BR2_PACKAGE_THINGINO_SENSOR_INFO so dev-camera images keep a sensor-info command.
  • 465e256 uboot 2013.07: add compiler-gcc16.h for GCC 16 toolchain support GCC 16 requires a compiler-gcc16.h header. Since GCC 16 introduces no new attributes or builtins beyond what GCC 15 supports, simply include the GCC 15 header. Signed-off-by: Paul paul@themactep.com
  • 261b2a1 toolchain: add GCC 16 selection and fragments Add BR2_THINGINO_TOOLCHAIN_GCC_16 to the version choice (default stays GCC 15) and the br/ext/loc gcc16 fragments for all three libcs, ported from feat/gcc16. Deviation from that branch: br-gcc16-uclibc enables BR2_TOOLCHAIN_BUILDROOT_LOCALE so an inline-built uclibc toolchain has the same xlocale ABI as the published toolchain tarballs; without it the libc stops exporting _ctype*_loc() and vendor-blob ctype compat in ingenic-uclibc breaks.
  • 4f03dc4 configs/github: add GCC 16 toolchain build profiles Mirror the nine gcc15 profiles (xburst1, xburst1_4_4, xburst2 x uclibc/musl/glibc) with GCC 16.1.0 and binutils 2.45.1. Locale and pthread-debug settings carried over unchanged so gcc16 tarballs keep the same libc feature set as gcc15.
  • 95507ef toolchain: add GCC 16 selection and fragments Add BR2_THINGINO_TOOLCHAIN_GCC_16 to the version choice (default stays GCC 15) and the br/ext/loc gcc16 fragments for all three libcs, ported from feat/gcc16. Deviation from that branch: br-gcc16-uclibc enables BR2_TOOLCHAIN_BUILDROOT_LOCALE so an inline-built uclibc toolchain has the same xlocale ABI as the published toolchain tarballs; without it the libc stops exporting _ctype*_loc() and vendor-blob ctype compat in ingenic-uclibc breaks.
  • b27589e Pin buildscope v0.1.7 Captures how each camera was configured: the defconfig verbatim plus the expanded Buildroot options, both viewable and diffable between releases.
  • 384dda0 sysupgrade: take over watchdog instead of just disarming it Disarming the watchdog leaves the camera with no recovery if the flash hangs (e.g. SSH timeout during a slow erase). Replace the simple disarm with a takeover: kill the original daemon, then start a new watchdog from tmpfs with a 30-second timeout fed every 10 seconds. If the flash hangs, the watchdog fires and reboots the camera. On success, the tmpfs watchdog is disarmed cleanly just before the final WDT reset or reboot -f. Same pattern as stage2 detach path, adapted for the inline full-upgrade and rootfs-only paths. Signed-off-by: Paul Philippov paul@themactep.com
  • a2b7ba5 sysupgrade: suppress dd stderr in full upgrade to prevent output interleaving Busybox dd writes 'records in' and 'records out' as two separate stderr writes. On slow MTD flash the second write can be delayed long enough that it arrives at the SSH client after 'Full upgrade complete' echoc, producing garbled interleaved output like: 132+0 records in 132+Full upgrade complete. Rebooting... 0 records out Redirect dd stderr to /dev/null since the progress is already announced by the echo_c line that precedes each partition flash. Signed-off-by: Paul Philippov paul@themactep.com sysupgrade: use tmpfs busybox for reboot after overwriting rootfs The full-upgrade and rootfs-only paths overwrite the rootfs partition, then call 'reboot -f' which resolves to the system busybox on the now-destroyed rootfs. If the kernel needs to page in any part of the binary, it gets EIO and the reboot fails silently, leaving the camera hung with no way to recover short of a power cycle. Clone busybox to tmpfs before the flash and use the tmpfs copy for the final reboot so it runs from a live filesystem. The boot-only and kernel-only paths are unaffected (boot-only does not overwrite rootfs; kernel-only goes through the stage2 detach path which already runs from tmpfs). Signed-off-by: Paul Philippov paul@themactep.com sysupgrade: disarm hardware watchdog before erasing flash The full-upgrade and rootfs-only paths flash large partitions (up to 16 MB) while the system watchdog daemon keeps feeding the hardware timer with a 60-second timeout. If any partition erase+write exceeds that window, the watchdog fires and resets the CPU mid-flash, corrupting the SPI flash and bricking the camera. Kill the watchdog daemon before the dd/flashcp loop. SIGTERM makes busybox watchdog write the magic V character to disarm the hardware timer, then exit cleanly. The stage2 detach path already does this via takeover_watchdog(). Signed-off-by: Paul Philippov paul@themactep.com sysupgrade: stop background services before raw MTD writes Processes reading or writing to mounted filesystems while the underlying MTD partitions are being raw-written can cause kernel panics, read garbage, or corrupt jffs2 metadata on the data partition. Call stop_services() before the dd loop in both the full-upgrade and rootfs-only paths. It stops all init services except SSH, networking, and wireless (which are needed to maintain the OTA connection). The watchdog is already disarmed just above this call, so it is harmlessly skipped by the K99watchdog exclusion. Signed-off-by: Paul Philippov paul@themactep.com sysupgrade: add blank line after process list in stop_services Signed-off-by: Paul Philippov paul@themactep.com
  • 5206694 v2013-07.fragment: remove redundant FORMAT_CUSTOM and FORMAT_CUSTOM_NAME FORMAT_CUSTOM=y is already set by core.fragment. FORMAT_CUSTOM_NAME is always finalized by the U-Boot board configuration section in the Makefile (via UBOOT_BIN_NAME), so the value here was always overridden anyway. Signed-off-by: Paul Philippov paul@themactep.com
  • a6b7370 Makefile, core.fragment: deduplicate U-Boot config overrides Remove BR2_TARGET_UBOOT_BOARDNAME and BR2_TARGET_UBOOT_BOARD_DEFCONFIG from the SOC-derived section of Makefile since they are properly finalized in the U-Boot board configuration section that runs after the version fragment. Also remove BR2_TARGET_UBOOT_BOARD_DEFCONFIG and BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME from core.fragment for the same reason — the U-Boot board section is the canonical authority and always runs after both the core and version fragments. Eliminates 'overriding recipe' / 'reassigning to symbol' warnings during config assembly. Signed-off-by: Paul Philippov paul@themactep.com
  • ff37394 Makefile: remove duplicate backup-overlay target Signed-off-by: Paul Philippov paul@themactep.com
  • c1eb95b thingino-ha: add camera config sensor and device model from os-release Adds IMAGE_NAME to os-release at build time by extracting the # NAME: line from the camera defconfig. Uses it as the default device model in HA MQTT discovery instead of the generic 'Thingino Camera'. Also adds: - camera_config sensor: always-on diagnostic sensor reporting IMAGE_ID - hw_version in device JSON: sourced from IMAGE_ID (camera config name) - Generalized get_os_release_field() to fetch any field from os-release Signed-off-by: Paul Philippov paul@themactep.com rootfs_script: quote IMAGE_NAME in os-release to prevent shell syntax error IMAGE_NAME values contain spaces and parentheses (e.g. Wyze Cam v3 T31X). The echo heredoc used bare ${IMAGE_NAME}, which expanded outside of any shell quoting and produced a bare unquoted value in /etc/os-release. When sourced by /etc/profile, the parentheses trigger: -sh: /etc/os-release: line 20: syntax error: unexpected ( and all subsequent variables (BUILD_ID, BUILD_TIME, HOSTNAME, etc.) are lost to any script that sources the file. Add escaped double-quotes matching the pattern already used by BUILD_ID, BUILD_TIME, PRETTY_NAME, and others. Signed-off-by: Paul Philippov paul@themactep.com
  • bf2b7fa soc: fold the ingenic default into the vendor else branch Review feedback: assigning SOC_VENDOR twice reads as a redefinition -- ingenic first, then sigmastar -- when only one value is ever wanted. Semantically inert. SOC_VENDOR resolves identically for every state of the vendor symbols, including the unset case that keeps thingino.mk usable before .config exists: ingenic BR2_SOC_VENDOR_SIGMASTAR=y sigmastar BR2_SOC_VENDOR_INGENIC=y ingenic and still expands to ingenic for jooan_w8u_t23n_sc2336_atbm6132u and iget_c5pt_t41lq_gc4023_jl1101.
  • 549e6cc S93ha: drop wait_for_ha_shutdown polling loop The 20-second polling loop waiting for processes to gracefully exit was unnecessary during shutdown — the MQTT broker detects TCP disconnect via keepalive if we miss the offline message. SIGTERM followed by a 1s grace period and then SIGKILL achieves the same result without stalling. This brings stop() from ~12s down to ~1.2s. Signed-off-by: Paul Philippov paul@themactep.com
  • 17a7e4b soc: declare the SoC vendor as a choice SOC_VENDOR is hardcoded to "ingenic" at thingino.mk:8 and has no Kconfig counterpart, so there is nothing a board can set to say it is not an Ingenic part. Add a "SoC vendor" choice, default Ingenic, and derive SOC_VENDOR from it. Ingenic stays the make-level fallback rather than only the Kconfig default: thingino.mk is parsed on paths where .config does not exist yet, and every existing defconfig sets no vendor symbol at all, so an unset vendor has to keep resolving to ingenic. BR2_INGENIC_SOC_MODEL gains a depends on the Ingenic vendor. It is the entry point to the whole Ingenic SoC database -- BR2_SOC_FAMILY's default chain is keyed on it -- so it is exactly the symbol that should disappear for a non-Ingenic part. Generating .config for four boards spanning both kernel versions, before and after, the only difference is the two new symbols: jooan_w8u_t23n_sc2336_atbm6132u > BR2_SOC_VENDOR_INGENIC=y atom_cam2_t31x_gc2053_atbm6031 > # BR2_SOC_VENDOR_SIGMASTAR is not set iget_c5pt_t41lq_gc4023_jl1101 smart_nvr_a1n_eth No pre-existing symbol changes value, so every board builds what it built before.
  • 86d4839 libhelix-aac: build the portable C path on arm assembly.h picks a MULSHIFT32/FASTABS/CLZ implementation per platform and ends the chain in "#error Unsupported platform in assembly.h". Both of its ARM branches are disabled by misspelt guards: assembly.h:246 #elif defined (XXX__arm) && defined (ARMCC_VERSION) assembly.h:368 #elif defined(GNUC) && defined(XXXX__arm) so an ARM GCC build matches no branch and stops at the #error on all 15 sources that include the header. The portable C branch just below covers ARDUINO, mips, powerpc and Solaris, but not arm. Add arm/aarch64 to that branch. It is the same path mips takes, so this is the plain-C implementation thingino already ships on Ingenic -- no inline assembly, and no change to any existing target. Reviving the disabled ARM assembly branch is the other option, but it is switched off upstream for a reason nobody wrote down, and this decoder feeds the WebRTC audio path. Evaluating the old and new conditions under the preprocessor, the branch taken changes for arm and aarch64 only: mips old=TAKEN new=TAKEN powerpc old=TAKEN new=TAKEN i386 old=NOT_TAKEN new=NOT_TAKEN arm old=NOT_TAKEN new=TAKEN aarch64 old=NOT_TAKEN new=TAKEN No MIPS target can reach the added clause, so every board in the tree builds the object it builds today.
  • 581d9cf S93ha: fix stop() stall caused by watchdog/ha-daemon restart race The stop() function had a signal-delivery race with the watchdog: 1. kill WATCHDOG_PID sends SIGTERM but kill(1) returns before the signal is delivered 2. stop_daemon kills ha-daemon and removes its PID file 3. The watchdog (still alive) sees the missing PID file and calls S93ha restart, spawning a new ha-daemon 4. wait_for_ha_shutdown finds ha-daemon running -> infinite loop Fixes: - S93ha stop(): create /run/ha-stop flag before any kills so the watchdog bails out even if it survives signals - S93ha stop(): killall + pidof verification loop before stop_daemon to ensure watchdog is truly dead - S93ha stop(): rewrite stop_daemon to use pidof+kill instead of start-stop-daemon -K -n (which doesn't reliably match shell scripts on all BusyBox versions) - S93ha start(): clear /run/ha-stop on startup - ha-watchdog: check /run/ha-stop before restarting and exit if set Signed-off-by: Paul Philippov paul@themactep.com
  • 179a502 wifi: skip wired uplink polling when no wired interfaces exist Add any_wired_iface_exists() guard that checks whether eth0 or usb0 exist before entering the 10-second polling loop. On Wi-Fi-only cameras (no wired interfaces) watch_wired_uplink returns immediately instead of wasting 10 seconds in a futile poll. Signed-off-by: Paul Philippov paul@themactep.com
  • 053f858 ha: kill ha watchdog first
  • b0e707a package/timps: update to v1.7.3 Update timps from v1.7.2 to v1.7.3 Hash change: v1.7.2 -> v1.7.3 (No changelog available)
  • 42ee055 thingino-ha: use hostname as camera identity instead of MAC or SoC serial Derive HA_CAMERA_ID and mqtt-sub %id from hostname instead of interface MAC or SoC serial. The default hostname already includes the serial suffix for uniqueness, and users can override it to retain HA configuration across hardware swaps. Also updates mqtt-sub-dispatcher camera_id() and documentation to reflect the hostname-based identity. Signed-off-by: Paul paul@thingino.com
  • e26d7d0 ha: fix shutdown hang caused by watchdog respawn race - Kill watchdog using its PID file instead of killall — killall matches process comm ("sh" for scripts), so it silently did nothing against the watchdog shell script. The watchdog survived, saw the missing ha-daemon PID file, and respawned everything during shutdown. - Kill watchdog BEFORE ha-daemon to prevent see-then-respawn race. - Reorder ha-daemon cleanup() to kill children before the MQTT offline publish, and wrap the publish with timeout 1 to avoid stalling on an unreachable broker. - Wrap the ha-watchdog offline publish with timeout 1 for the same reason. - Add ha-watchdog (via pkill -f) to the SIGKILL fallback. Signed-off-by: Paul Philippov paul@themactep.com
  • e5e93a0 ingenic-sdk: fix gpio-userkeys config hook ordering and error handling The previous fix (c334a03) moved GENERATE_GPIO_USERKEYS_CONFIG from INSTALL_TARGET_CMDS to TARGET_FINALIZE_HOOKS, but TARGET_FINALIZE_HOOKS from ingenic-sdk still runs before thingino-core's merge hook due to alphabetical package ordering. At that point button_reset hasn't been merged into thingino.json yet, so the config was silently skipped. Move the hook to ROOTFS_PRE_CMD_HOOKS, which runs after all TARGET_FINALIZE_HOOKS are complete, guaranteeing thingino.json is fully assembled. Also add 2>/dev/null || true to jct get calls: jct exits non-zero when a key (e.g. gpio.chime) doesn't exist, which broke the build. Signed-off-by: Paul Philippov paul@themactep.com
  • c6cd96c wifi: run wired-gateway probe in background so boot is not held The 10x1s wired-uplink retry loop ran in rcS foreground, stalling every boot for the full 10 seconds on wifi-only cameras where the success condition can never occur. Run the probe detached: wired preemption and the deferred portal confirmation keep their exact schedule and semantics, rcS just no longer waits on them. The original wired-gateway check (fa99b28) was a sub-second single-shot; the blocking loop was introduced incidentally in f9ebb07.
  • 508aebe odhcp6c: drop unused odhcp6c-update install and deprecated -v flag The daemon applies state via its built-in default script path, which overlay/usr/lib/netifd/dhcpv6.script provides; the example script installed to /usr/sbin/odhcp6c-update was referenced nowhere. The -v flag is deprecated in current odhcp6c and only produces a syslog warning. Also remove the unused TMP_LOG variable.
  • 03233a1 prudynt: bump
  • 8acd1b4 package/timps: update to v1.7.2 Update timps from v1.6.4 to v1.7.2 Hash change: v1.6.4 -> v1.7.2 (No changelog available)
  • 3d7b381 thingino-ha: derive HA_CAMERA_ID from SoC serial instead of MAC Replace the MAC-address-based camera identity with the SoC serial number (last 4 digits from 'soc -s'). The serial is immutable, always available regardless of networking, and matches the suffix already used in default hostnames. This obsoletes the interface-name guessing (eth0/wlan0/eth1/usb0) that broke on USB-Ethernet cameras in #1222. Signed-off-by: Paul paul@thingino.com
  • 8f0ba74 thingino-ha: include usb0 in HA_CAMERA_ID interface detection (#1379) thingino-ha: include usb0 in HA_CAMERA_ID interface detection
  • 8de0221 fix: correct CONFIG_ENV_OFFSET for SPI NOR layout CONFIG_ENV_OFFSET was set to 0x50000 (320KB), which lands in the 'backup' partition (mtd2). The actual 'env' partition (mtd1) is at 0x40000 (256KB). This mismatch means: - firstboot -f erases /dev/mtd1, but U-Boot's env lives at 0x50000 (backup partition) and is never actually wiped - The U-Boot environment persists across factory resets Fix: set CONFIG_ENV_OFFSET=0x40000 to align with the env partition (mtd1) defined in the ciao branch partition layout: boot(256K/0x0) env(64K/0x40000) backup(64K/0x50000) kernel(0x60000) Reported-by: Josh Signed-off-by: WLTB-Gino noreply@wltechblog.com Co-authored-by: WLTB Gino gino@wltb.local
  • e9c4245 prudynt-t: bump to be78b46 (RTSP timestamp fixes, debug dump, NUL-safe parser) - Send RTCP SR before RTP packets to fix "Non-monotonic DTS" / "Timestamps are unset" warnings in FFmpeg recordings - Audio anchor guard band prevents backward DTS jumps - general.debug_dump_path config option for capturing oversized RTSP requests to external storage - NUL-safe request boundary scan handles buggy clients (LibVLC 2.0.3 / LIVE555) that send raw RTCP on the control socket - Salvage last valid request from overflow buffer to keep sessions alive - clientAddr set in acceptClient for accurate source IP in dump filenames Signed-off-by: Paul Philippov paul@themactep.com
  • 56d3137 thingino-ha: Add usb0 interface to camera ID retrieval thingino-ha: include usb0 in HA_CAMERA_ID interface detection
    ha-common derives HA_CAMERA_ID by reading the MAC of the first
    available interface among eth0, wlan0 and eth1. Cameras that reach
    the network through a USB-ethernet adapter expose it as usb0 (with
    eth0/wlan0 absent), so the loop matches nothing and HA_CAMERA_ID is
    left empty.
    An empty ID makes every topic malformed (cameras//..., MQTT client id
    thingino-ha-cmd-, discovery under homeassistant/.../thingino_/...), so
    ha-daemon exits right after start and the camera never registers in
    Home Assistant even though ha.enabled=true and the MQTT broker is
    reachable. WiFi cameras are unaffected because they match wlan0.
    Add usb0 to the interface list so USB-ethernet cameras get a stable
    identity. WiFi cameras keep matching wlan0 first, so behaviour is
    unchanged for them.
    Fixes #1222
  • c4bc3d6 docs: document RTSP timestamp fixes and debug dump feature Add RTSP timestamp fixes section to streamer.md covering the initial RTCP SR burst and audio anchor guard band. Add prudynt-debug-dump.md documenting the general.debug_dump_path config option for capturing oversized/malformed RTSP requests to external storage. Signed-off-by: Paul Philippov paul@themactep.com
  • f5d2464 Pin buildscope v0.1.5 Fixes diff --json emitting unparseable output, and stops a whole-chip mtdparts alias being reported as the entire flash being freed when a layout change drops it.
  • c334a03 ingenic-sdk: move gpio-userkeys config generation to finalize hook GENERATE_GPIO_USERKEYS_CONFIG reads gpio.button_reset from /etc/thingino.json, but the camera-specific GPIO settings are only merged during target-finalize (by thingino-core). Running it during INSTALL_TARGET_CMDS means button_reset is never present, so the gpio-userkeys module config is silently skipped. Move the call to INGENIC_SDK_TARGET_FINALIZE_HOOKS so it runs after thingino.json is fully assembled. Signed-off-by: Paul Philippov paul@themactep.com
  • 9657a04 wyze-accessory: fix echo >> absorbing next command when make += joins define blocks When multiple accessory variants are enabled (e.g. SPOTLIGHT + CAR), GNU make's += operator joins the last line of one define block with the first line of the next without a newline. This caused: echo ch341 >> /etc/modules.d/accessory -D -m 0755 ... The install command became arguments to echo, corrupting the modules.d file and preventing car_control from being installed. Fix by adding a blank line at the end of each conditional define block so the shell commands are properly separated regardless of += behavior. Signed-off-by: Paul Philippov paul@themactep.com
  • a25e7b7 sysupgrade: compute total flash size by summing all MTD partitions full_upgrade_partition_size() previously relied on an "all" partition in /proc/mtd, which does not exist on all cameras. When absent, the function returned 0, causing the free-space check to fail with: Firmware is larger than flash chip: 16777216 > 0 Sum all individual MTD partitions (skipping the header line and the "all" partition if present) so the check works regardless of whether the kernel exposes a concatenated "all" device. Signed-off-by: Paul Philippov paul@themactep.com
  • b6b1bef pre-commit: fix pipe subshell swallowing shfmt errors, fix bashism in json-imp.cgi Replace echo|while pipes with heredoc-based loops so set -e catches shfmt/prettier/sort failures inside the loop body. Replace bash-specific ${1:0:1} slice in json-imp.cgi with a POSIX case pattern, fixing shfmt parsing error on merge.
  • 202cb6f libhelix-mp3, libflac: fail the build too; drop the .mk comment Extends the previous commit's fix to the two remaining packages built the same way, and removes its explanatory comment from libhelix-aac.mk, whose reasoning is already in that commit's notes. All three packages share one BUILD_CMDS shape, and they are the only three in the tree that do: a $(foreach ...) whose commands are joined by ";", followed by a link of "find ... | xargs $(TARGET_CC) -shared". Without "set -e" a source that fails to compile does not stop the loop, and a shared link permits undefined symbols, so the package builds green and installs a library missing whatever did not compile. libhelix-mp3 carries the identical gate that libhelix-aac tripped -- assembly.h:353, included by 8 of its 15 sources -- and would fail the same way on the same target; it was not hit there only because that build does not select it. libflac's own "#error Unsupported platform" is a narrower ppc-hwcaps path (cpu.c:257) rather than the same trigger, but its BUILD_CMDS has the same shape and the same silent partial-link outcome for any source that fails. Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • 1a51809 libhelix-mp3, libflac: fail the build too; drop the .mk comment Extends the previous commit's fix to the two remaining packages built the same way, and removes its explanatory comment from libhelix-aac.mk, whose reasoning is already in that commit's notes. All three packages share one BUILD_CMDS shape, and they are the only three in the tree that do: a $(foreach ...) whose commands are joined by ";", followed by a link of "find ... | xargs $(TARGET_CC) -shared". Without "set -e" a source that fails to compile does not stop the loop, and a shared link permits undefined symbols, so the package builds green and installs a library missing whatever did not compile. libhelix-mp3 carries the identical gate that libhelix-aac tripped -- assembly.h:353, included by 8 of its 15 sources -- and would fail the same way on the same target; it was not hit there only because that build does not select it. libflac's own "#error Unsupported platform" is a narrower ppc-hwcaps path (cpu.c:257) rather than the same trigger, but its BUILD_CMDS has the same shape and the same silent partial-link outcome for any source that fails. Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • 3aa830e Revert "sysupgrade: add status=progress to dd for per-partition transfer progress" The camera's busybox does not support status=progress, causing dd to fail with "invalid argument 'progress' to 'status'". This reverts commit 3134bf2341820deeb549eab88777b01c4dbb3f78. Signed-off-by: Paul Philippov paul@themactep.com
  • 3134bf2 sysupgrade: add status=progress to dd for per-partition transfer progress Busybox is built with CONFIG_FEATURE_DD_STATUS=y, so status=progress shows real-time throughput during each partition write. Signed-off-by: Paul Philippov paul@themactep.com
  • 1fa169d sysupgrade: let dd print transfer stats during full upgrade Remove 2>/dev/null so dd reports records in/out, giving visibility into write progress for each partition. Signed-off-by: Paul Philippov paul@themactep.com
  • 7e75ea4 sysupgrade: flash partitions directly from firmware image without temp files Previously the full upgrade path extracted each partition to a temp file in /tmp and then called flashcp on it. On memory-constrained cameras the combined size of the firmware image plus the extracted partition file exhausted tmpfs, producing a truncated file that caused flashcp to segfault. Drop the intermediate file entirely: flash_eraseall each mtd partition, then dd directly from the firmware image at the correct offset. No extra space is needed beyond the firmware image itself. Signed-off-by: Paul Philippov paul@themactep.com
  • d62fe3d sysupgrade: verify extracted partition size before flashing If the firmware binary is shorter than the sum of all MTD partitions, dd produces a truncated file and flashcp may segfault on it. Check the extracted size matches the partition size and die with a clear message before handing bad input to flashcp. Signed-off-by: Paul Philippov paul@themactep.com
  • 36bbfe1 sysupgrade: fix subshell pipe so flash failures actually stop the script The tail ... | while read loop ran in a subshell, so die (which calls exit) only killed the subshell — the main script continued to print "Full upgrade complete" and attempt reboot after a failed flash. Replace the pipe with a temp file + input redirection so the loop runs in the main shell and die() properly aborts. Signed-off-by: Paul Philippov paul@themactep.com
  • a532db9 sysupgrade: use hardware watchdog reset before reboot -f on full upgrade The full upgrade path did a plain reboot -f after flashing, which can fail with EIO because the rootfs has been overwritten and the kernel may have stale page cache entries for the reboot binary. Add the same pre-reboot sequence already used in stage2's go_reboot(): sync, sleep 5, trigger the Ingenic WDT reset via /proc/jz/reset/reset, then fall back to reboot -f. Signed-off-by: Paul Philippov paul@themactep.com
  • 3c26abc lightnvr: add tarball hash for v0.36.6 Signed-off-by: Paul Philippov paul@themactep.com
  • bb234e1 jct: add tarball hash for v1.2.0
  • c93c02f install packages system handler by default
  • 61fde40 package/thingino-jct: update to v1.2.0 Update thingino-jct from v1.1.0 to v1.2.0 Hash change: v1.1.0 -> v1.2.0 (No changelog available)
  • 2c6455c package/open-tx-isp: update to ad9db44 Update open-tx-isp from fddb684 to ad9db44 Hash change: fddb6843814385dad8b684dd922bc488cbcb70c2 -> ad9db44cb71b25460ee50e6bcbc5cfc27a5a0958 Changelog: 74a033c: share T41 exposure and scaler pipelines 33603c9: share T23 polyphase scaler generation 7486de9: share T31 flicker exposure and repair ISP tuning 42948f7: share T41 fixed-point division fef815c: share T23 fixed-point division 07c2a95: add tests 76d6f9c: share native 64-bit fixed-point multiplication bbba792: preserve accepted T31 AE code generation 13633bc: share T23 wrapped fixed-point multiplication c1c133d: share T23 and T41 fixed-point add subtract 2ebc0a5: share T23 and T41 64-bit add subtract 2a5c061: share generic T23 and T41 fixed point add subtract 86ea753: share exact signed fixed point rounding 4b2576c: restore T31 full-rate pre-dequeue and high-gain profile 4c7fd31: share full-width fixed point multiply on T41 43acaed: share full-width fixed point divide on T41 a2fb1c9: move T41 fixed point log2 into shared math 1c663ed: move T41 exp2 into shared math 4406c6c: share T41 Q7 tuning ratio without shifting text 54c035d: share frame channel wire ABI across active SoCs 1c3f2d0: share frame buffer state flag policies a80cba4: stabilize shared frame image format ABI a5eb611: t40: support SDK sensors in canonical module 67a4c72: Check pt 315faa9: complete shared frame channel contracts 994a604: share frame request wire contract aec02a9: share subdevice link ABI a3206d0: share recovered link detach operation b7ff3f2: share subdevice graph resolver f77e9a3: share subdevice graph wire ABI 87d6f44: share subdevice link state core 163cccf: share remote pad event resolver b50702b: share recovered subdevice state policy 7251cb0: share T40 subdevice core policies f85440d: fix T31 frame buffer ownership and timestamps ad9db44: document T31 DMA-done buffer rotation
  • a32a595 package/lightnvr: update to 0.36.6 Update lightnvr from 0.36.5 to 0.36.6 Hash change: 0.36.5 -> 0.36.6 (No changelog available)
  • c1791e4 fixed-size partitions, config backup/restore, selective upgrades Replace the sysupgrade re-exec/GitHub dance for boot, kernel, and rootfs OTA with a minimal flash-ota script that receives pre-assembled, partition-sized files and flashes them directly to the matching MTDs. Host-side (scripts/fw_ota.sh): - Pads partition files to exact MTD sizes (boot 256K, env 64K, rootfs 64K-aligned) - Uploads flash-ota.sh + individual partition files to /tmp/ - No more concatenation + camera-side extraction Camera-side (package/thingino-sysupgrade/files/flash-ota): - Resolves MTD names early, clones busybox to tmpfs for rootfs mode, remounts / ro before erasing rootfs - Auto-detects flashcp -A support to avoid double-erase - Stops streamer, flashes, reboots — 85 lines total Makefile targets now pass partition files directly: - ota-kernel: (uImage) - ota-uboot: (+ u-boot-env.bin from images dir) - ota-rootfs: (+ data.jffs2 from images dir) - ota-full: unchanged (uses sysupgrade with full firmware) sysupgrade bug fixes (no longer used for partial OTAs): - Replace fragile '! echo | grep -qE' with case patterns (busybox compat) - Clear GITHUB_URL immediately after getopts when a local file is present - Skip file-move when fw_file already exists in workdir Signed-off-by: Paul Philippov paul@themactep.com sysupgrade: use flash_partition helper to avoid double-erase Add flashcp_has_A() cache and flash_partition() helper that auto-detects flashcp -A support. When available, uses flashcp -A (single-pass auto-erase); otherwise falls back to flash_eraseall + flashcp. Applied to all flash sites: boot, env, rootfs, data, and full-upgrade loop. Signed-off-by: Paul Philippov paul@themactep.com
  • a4743e9 Pin buildscope v0.1.4 Fixes three ways a crafted image could act on the machine reading it: terminal escapes from a partition name, a tar member escaping the directory it unpacks into, and a payload that broke an exported page.
  • 2b6328d package/prudynt-t: update to ad6294e Update prudynt-t from 4e29b88 to ad6294e Hash change: 4e29b8858478e6a229fb75f946b4db5f6d034f0d -> ad6294ec99829b6e9ea790f75cb7105e23b85026 Changelog: b141310: api: secure config endpoints with X-API-Key, add CORS, bind to all interfaces 62a06cf: api: persist RTSP password changes to disk and restart RTSP server ad6294e: httpmjpeg: remove unused auth helpers and is_loopback
  • a233c5d os-release: derive ARCHITECTURE instead of hardcoding mips ARCHITECTURE was the literal "mips", which is correct for every target thingino currently builds -- this is groundwork, not a bug fix. /etc/os-release is read at runtime rather than only at build time: soc -a reports from it and the web UI displays it. On a MIPS build the derived value is identical, so this changes nothing for existing targets; it only stops the field being wrong if the tree ever builds for another architecture. Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • 2b700a9 libhelix-aac: fail the build instead of shipping a broken library The compile step is a $(foreach ...) whose commands are joined by ";", so a source that fails to compile does not stop the loop. The link that follows is "-shared" over whatever .o files exist, and a shared link permits undefined symbols, so the package builds green and installs a library missing whatever did not compile. Found while building for a non-MIPS target, where 15 of the 28 sources hit "#error Unsupported platform in assembly.h" and the resulting .so contained 13 objects. Nothing failed; the first caller died with symbol lookup error: /lib/libhelix-aac.so: undefined symbol: UncoupleSBRNoise This is a no-op on any target where every source already compiles -- it only changes what happens when one does not. Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • 761ed62 libhelix-aac: fail the build instead of shipping a broken library The compile step is a $(foreach ...) whose commands are joined by ";", so a source that fails to compile does not stop the loop. The link that follows is "-shared" over whatever .o files exist, and a shared link permits undefined symbols, so the package builds green and installs a library missing whatever did not compile. Found while building for a non-MIPS target, where 15 of the 28 sources hit "#error Unsupported platform in assembly.h" and the resulting .so contained 13 objects. Nothing failed; the first caller died with symbol lookup error: /lib/libhelix-aac.so: undefined symbol: UncoupleSBRNoise This is a no-op on any target where every source already compiles -- it only changes what happens when one does not. Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • 7107873 Pin buildscope v0.1.3, which recovers the kernel's own config v0.1.2 reads no kernel config, so the tab has nothing to show. It also fixes the uImage payload bound, which on a carved image cost the built-in device trees as well.
  • 3f9ed9a Pin buildscope v0.1.2, which records each build's flash layout v0.1.1 writes an index without partition layouts, so the fleet view has nothing to compare and offers no map.
  • 1d93bba telegrambot: substitute $chat_id in command strings before execution The run_command() function was passing command strings verbatim to popen(), so $chat_id was never expanded. Replace every occurrence of the literal $chat_id with the actual numeric chat ID value before the shell sees the command. Fixes #1367 Signed-off-by: Paul Philippov paul@themactep.com
  • ece1953 fix: imp-control missing API key breaks prudynt color/ISP commands imp-control communicates with prudynt via its HTTP API (/api/v1/config). Prudynt requires an X-API-Key header for /api/v1/config, read from /etc/thingino-api.key. imp-control was not sending this header, causing all ISP commands (ispmode, brightness, contrast, etc.) to fail silently with 401. - imp-control: read /etc/thingino-api.key and include X-API-Key header in all curl requests - S10daynightd: generate the API key file early (before starting daynightd), so it exists when daynightd first calls color on/off. Previously the key was only created at S48 (webui-config), leaving a window where prudynt's API was inaccessible to local tools. - S31prudynt: after prudynt starts and its HTTP API is ready, re-sync the ISP daynight mode from /run/thingino/daynight_mode. This fixes a boot race where daynightd (S10) tried to set the ISP mode before prudynt (S31) was listening. Signed-off-by: Paul paul@earendilworks.com
  • 684c705 webui: gate WireGuard button on feature flag, reorder offcanvas nav - WireGuard VPN button now only appears when thinginoUIConfig.device.wireguard is set (via wireguard.webui.json plugin featureFlags) - toggleWireGuard() bails early if WireGuard feature flag is absent - Offcanvas nav: move Information block to bottom, just before Help Signed-off-by: Paul Philippov paul@themactep.com
  • 9c4f57d webui: use port 8080 config API directly with X-API-Key auth Replace CGI middleware passthrough (/x/json-prudynt.cgi, /x/json-prudynt-save.cgi, /x/json-prudynt-config.cgi, /x/json-config-rtsp.cgi) with direct port 8080 API calls. - All config read/write now hits http://{camera}:8080/api/v1/config - API key loaded from /x/api-key.cgi and sent as X-API-Key header - apiFetch() helper awaits key promise before sending requests - Export config now uses dump_config action + Blob download - OSD save uses POST with action.save_config for persistence - SEI OSD check uses osd.sei.enabled path Signed-off-by: Paul Philippov paul@themactep.com
  • 3dc3bec Pin buildscope v0.1.1, which records what a build came from v0.1.0 predates the os-release capture, so its reports carry no branch or revision and the fleet overview has nothing to show in that column.
  • c66ca36 pack: correct where the size report is written It goes to the build root, beside uenv.txt, not into images/ -- which is what the CI glob that collects it already assumes.
  • b04c33f pack: correct where the size report is written It goes to the build root, beside uenv.txt, not into images/ -- which is what the CI glob that collects it already assumes.
  • c7ef3cd Add the buildscope fleet snapshot to stable builds Same shape as master, adapted: the output path follows the branch input, and the release tag comes from prepare-release rather than the matrix. Guarded on should_build like the other jobs there.
  • d4e7cff package/prudynt-t: update to 4e29b88 Update prudynt-t from 0f3fa5e to 4e29b88 Hash change: 0f3fa5edbcafd1513afce6f34430edea2a9cc18b -> 4e29b8858478e6a229fb75f946b4db5f6d034f0d Changelog: 740ff75: osd: replace burnin background bool with color, nest SEI under osd.sei 713302c: osd: auto-migrate old osd.enabled/elements to osd.sei on config load 62c64af: osd: rename sei.elements -> sei.entries 7e6ce62: osd: fix entries null-wipe on query ac650c5: api: add REST GET endpoints for config domains 80b6947: osd: fix burnin outline, background via alpha blending in putBlock 2a241b8: osd: skip burnin passes when color alpha is zero 4e29b88: api: move config GET endpoints before auth check
  • 8f9d9d3 webui: fix autocomplete warning on HA config page Replace form-level autocomplete=off (ignored by Chrome) with autocomplete=current-password on the password field. Signed-off-by: Paul Philippov paul@themactep.com
  • bcaba05 webui: drop redundant console.error in timelapse toggle The error is already shown to the user via showAlert; the console.error was just noise that made it look like the error wasn't being handled. Signed-off-by: Paul Philippov paul@themactep.com
  • 1f5537a webui: replace preview.js null-query with parallel REST GETs loadConfig() now fetches image/motion/privacy/rtsp/stream0/stream1 in parallel from :8080/api/v1/config/* instead of sending a monolithic null-filled POST through the CGI. Signed-off-by: Paul Philippov paul@themactep.com
  • f9001ca Pin buildscope to the commit that has export --fleet
  • e72a3ee Add buildscope fleet snapshot to master firmware builds Build the buildscope CLI once as a static musl binary and reuse it across the camera matrix, rather than paying the host-package cost in each of the 170 jobs. Each job uploads its buildscope-report.json; a new fleet job collects them and publishes fleet-index.json and fleet-reports.tar.gz to the release.
  • 4514aff package/buildscope: pin a revision that reads this fleet's images The host tool writes a size report at the end of pack. The revision it is pinned to decides what that report can say, and the earlier pin predated the work that matters here: UBI volumes and UBIFS on the NAND boards, squashfs contents and per-file compressed cost, the device trees that are built into the kernel and appended to U-Boot rather than shipped as files. It also predated the report moving out of images/ and losing the builder's home directory from its path, both of which change what a build leaves behind. Pinned by full hash, as an unpinned host tool would make builds unreproducible.
  • 80202be webui: use REST GET for OSD config reads Replace null-filled POST queries with clean GET to :8080/api/v1/config/osd. Signed-off-by: Paul Philippov paul@themactep.com
  • 109074f webui: osd.sei.elements -> osd.sei.entries Signed-off-by: Paul Philippov paul@themactep.com
  • 995f2b7 webui: replace burnin background switch with color picker, nest SEI OSD under osd.sei - Replace burnin background checkbox with full color selector (swatch + picker + hex field + alpha slider), matching fill/outline UX - Change API field from osd.burnin.background (bool) to osd.burnin.background_color (hex string #RRGGBBAA, default #80) - Nest SEI OSD under osd.sei (enabled + elements) for consistency with osd.burnin - Update timps bridge docs: osd.enabled -> osd.sei.enabled Signed-off-by: Paul Philippov paul@themactep.com
  • 1915392 thingino-ha: skip WiFi RSSI on Ethernet-only cameras, rename Live View to Preview - Add ha_has_wifi() helper to detect wireless interfaces - RSSI discovery and state publish now gated on ha_has_wifi - Rename 'Live View' camera entity to 'Preview' to avoid confusion with actual RTSP live streams Signed-off-by: Paul Philippov paul@themactep.com
  • 88189b9 webui: install json-osd-sei.cgi with 0755 permissions Signed-off-by: Paul Philippov paul@themactep.com
  • 6ead84a webui: add json-osd-sei.cgi SSE bridge, convert consumers to SSE - New /x/json-osd-sei.cgi: SSE bridge that polls prudynt :8080 and pushes events as text/event-stream, deduplicated by content - preview.html SEI overlay: single persistent SSE connection - sei-rotate.js: SSE, closes after first rotation received Signed-off-by: Paul Philippov paul@themactep.com
  • 9d081b3 webui: restore :8080/api/v1/osd-sei — CGI endpoint does not exist Signed-off-by: Paul Philippov paul@themactep.com
  • d45046b webui: revert SSE to fetch polling — /x/json-osd-sei.cgi returns text/html Signed-off-by: Paul Philippov paul@themactep.com
  • dee5f12 preview: switch SEI overlay from fetch polling to SSE Signed-off-by: Paul Philippov paul@themactep.com
  • 84063a0 sei-rotate: switch from poll to SSE, remove inline polling from streamer pages - sei-rotate.js: use EventSource (SSE) instead of fetch polling, close connection after first rotation event received - streamer-{main,substream,image,sensor}.html: remove redundant inline polling scripts, rely on sei-rotate.js Signed-off-by: Paul Philippov paul@themactep.com
  • cc62e08 sei-rotate: skip preview.html to avoid double-polling with its own handler Signed-off-by: Paul Philippov paul@themactep.com
  • 66f4a88 thingino-diag: add wireless information thingino-diag: redact raw hex PSK and add overlay tree dump Redact unquoted 64-char hex PSK values in wpa_supplicant.conf that were leaking through the existing quoted-psk-only sed pattern. Also add a tree /overlay/ section so diagnostics include the overlay filesystem contents. Signed-off-by: Paul Philippov paul@themactep.com
  • f78f308 webui: adjust osd modal form layout
  • 0598b99 package/prudynt-t: bump to 0f3fa5e (@ glyph for beats) Signed-off-by: Paul Philippov paul@themactep.com
  • 8393e1f package/prudynt-t: update to 980f01e Update prudynt-t from d81e6e9 to 980f01e Hash change: d81e6e93b1b2b9d906a7bb19c840fa13e403a0f9 -> 980f01e73d1b1e66b8549148af9a954532b29908 Changelog: e7de9c4: osd: add Font5x7 glyph set, configurable burn-in fill/outline colors 9cd9cbe: docs: comprehensive OSD documentation for burn-in and SEI layers 091e526: motion: exclude burn-in OSD area from motion detection ROI d2963a6: docs: document burn-in motion detection exclusion 8bb5fc5: osd: add @b/%b Swatch Internet Time (.beats) token for burn-in c4b51db: osd: restrict .beats token to @b only (%b conflicts with strftime) 42364da: font5x7: add # (hash) glyph 980f01e: font5x7: add / (slash) glyph
  • cd726ab package/open-tx-isp: update to fddb684 Update open-tx-isp from f5224df to fddb684 Hash change: f5224df98e1326d9c443fa344e645211805cd1d5 -> fddb6843814385dad8b684dd922bc488cbcb70c2 Changelog: 2ef03b2: Check pt 29b2a38: Work on GIB d4c8315: Enable the full pipeline b13acb5: Check pt ec502f7: Check pt de6515a: mostly stable 12fcefa: more OEM matching c6e1a43: more OEM matching 5243486: Check pt avpu stalls 995b7bb: flickr is gone c132e02: Check pt c1abc35: Stream1 doesn't crash 7e574e2: Check pt f903758: multi-channel working b3b4064: Check pt e287cd9: Check pt 0e816ff: Dead code cleanup + CSI timing stabalization fix around sc2336 e61b962: Check pt 10927e3: Check pt fc4ab81: ADR working 37f7ce7: AWB work 308418e: Check pt 0d8ff79: Check pt 7dc544e: AWB color correction hacks + enable GIB block 511b46d: Revert WB register address change (0x1804 caused purple), keep GIB enabled 7312fa5: Fix AWB stats collection: bit16=0 gives raw Bayer data, fixes sepia e19ea2f: AWB stats fix (bit16=0) + GIB disabled pending investigation 4d35e4b: Check pt work on Gib acfc893: GIB deferred enable: bypass until libimp sends DEIR params b378e8d: AWB work e55374c: Fix AWB gain registers: 0x1804/0x1808/0x180c (OEM vic_mdma_enable+offsets) c1a9ae0: Implement OEM-exact cm_control 3x3 BT.601 saturation matrix 22092b0: Fix BCSH: compute OffsetRGB2yuv from tuning binary (was hardcoded) 263ad8d: Fix BCSH saturation: S-vector packing, EV interpolation, clip0/HLSP 419f1e0: Check pt 8f491c2: Add netlink param dispatch, AF params, fix MDNS/netlink timing d4f30af: Implement OEM-exact MDNS DMA buffer setup and enable ca22141: MDNS work a03add0: Check pt 6a062fb: Check pt MDNS 781ba3e: Check pt dacc0e1: check pt 52f881a: FIXED (AWB stats collection). 6c121fb: testing b2134b9: Check pt f3f7cf3: exclude c55369f: Fix color pipeline regressions — restore working image quality ea7fc44: Fix AE register clobbering and improve DMA buffer allocation 3c1166c: Revert WB gain registers to 0x183c/0x1840/0x1844/0x1810 71637ce: Revert WB registers to 0x183c/0x1840/0x1844/0x1810 (working colors) 51bfb0e: Add explicit AWB stats enable (0xb000=1) from OEM trace analysis 05a1153: Check pt 7d00fc4: AWB stats now working a8f25b6: Fix AE stats DMA: load params from tuning binary, fix zone grid config 4548677: Fix AE zone parsing: read Y luminance from DMA word[1] when word[0] is zero aa80ce6: Fix AE overexposure: stop re-arming 0xa000 per-frame, use OEM-exact zone parse edccb9b: Fix AE exposure: read Y from DMA word[1], zero _ae_parameter per OEM 83f60a4: Fix WB gain registers: write to 0x1804/0x1808/0x180c instead of no-ops efe6dd6: Fix AWB zone_rgbg scaling and restore AE grid config f6062b3: Fix fix_point_div_64: left-shift numerator by q before dividing 9891972: Fix AE/AWB: use OEM-exact word[0] Y extraction, fix AWB DMA corruption 3ebc1a7: Implement internal AE algorithm: exposure convergence + sensor writes 7e814ae: Fix AE overexposure: keep static AE params instead of zeroing them 9e88994: Fix AE limits: sensor-agnostic fallbacks, disable broken tuning load a795091: Fix tuning binary loading, sensor gain tracking, and log2 computation 66261b5: Fix AE parameter field mapping: correct max AG/DG indices, add tisp_ae_target 6a0bb59: Fix AWB CT: remove incorrect zone_rgbg scaling, add CT diagnostics f24fc4d: Fix AWB zone_rgbg: restore << q shift for Q8→Q18 format conversion 458e3ba: Fix AWB CT: divide out cof_bg before << q shift on bg channel 3715f5f: Fix sensor gain/exposure writes, add image style controls, reduce log noise 754620d: Check pt 8a64761: Clean up tuning block init: OEM-exact GIB, deferred MDNS, remove dead code 59174e0: Enable MDNS: implement OEM tx_isp_set_buf DMA registers and buffer size calc eb888d5: Fix AWB zone_rgbg: restore << q shift for Q8→Q18 format conversion 82a82f4: Fix AE zone extraction and AWB DMA re-arm corruption 68fb0ee: Re-enable GIB block: bypass register now matches OEM target 0xb5742249 71bebe5: Fix sensor gain/exposure writes, add image style controls, reduce log noise fd3858d: Fix log levels: silence ioctl spam, restore AE/AWB diagnostics, add AE tables e631ef2: Use uncached KSEG1 addresses for AE/AWB DMA buffers 6e3da92: Fix sensor gain/IT writes: trigger I2C workqueue after AE updates 43d40e1: AE convergence safety: 2x step cap, gain index limit, sensor expo diagnostics 8992d00: Remove AE gain cap and debug logging, match OEM _ae_reg init fe4c202: Disable GIB block: BLC subtraction zeros data at high sensor gain 9d080e1: AE convergence safety: 2x step cap, gain index limit, sensor expo diagnostics 21b4432: Re-enable GIB block with tighter AE convergence 6d11e40: Fix AE convergence stall at low IT values fc61e17: Revert GIB re-enable: confirmed BLC still zeros data at high gain e266e3a: Fix AE/AWB pipeline: remove conflicting AE1, enforce block whitelist, fix AWB Ct_Detect 463c239: GIB: fix BLC source (use OEM static defaults), defer block enable d10ab61: Fix GIB Bayer case 0x08: swap ch0/ch4 to match OEM b4a26ae: check pt d49ccee: GIB/CSI/VIC fixes: BLC from binary, unconditional LUT writes, multi-sensor support 39358dd: CSI/VIC bring-up: move vic_write32(0x10) to vic_start, enable CSI clocks in activation 6496c3e: CSI: move VIC 0x0c kick after rate calc, before wrapper writes f2f987f: OEM matching b9063a3: Fix AWB→BCSH CT event pipeline and revert AE step cap ad83c02: Ungate BCSH CT update from MDNS bypass bit e2130d8: check pt ff56de8: Check pt df74956: GIB/GB block investigation: lean system_reg_write, whitelist removal, GB fixes b481453: Fix ad0_cache shift loop, 0xc00c56c6 V4L2 dispatch, DN switch, poll/wake 7d18d5a: ADR OEM-exact params_refresh, GIB/MDNS bypass controls, DN switch improvements 90c3008: Check in docs 7a2d301: Merge tuning-blocks-correct into main fea3022: Document all 32 bypass register bits in pipeline architecture 4ac2579: Remove non-OEM frame buffer zeroing that caused MDNS R=G=B 8d3ae2c: Default GIB bypassed, MDNS enabled — baseline for image tuning 3e55457: Disable MDNS UV processing to fix pink tint and block artifacts c4719d2: Remove dead mdns_intp_generated.c, fix MDNS UV disable in correct file c160919: Match OEM: enable MDNS in tiziano_mdns_init, remove deferred enable 8fe0d87: TEST: GIB DG nudge — force value change to trigger HW latch 6edd163: OEM BCSH matrix matching 5cf92a4: More OEM matching d99edd4: OEM f9ea81a: Implement ~60 missing OEM functions for full ISP pipeline coverage 836a7ac: OEM fab4061: Enable DN switch with OEM-exact call order, fix tisp_cust_mode_s_ctrl e6f8b1a: Re-enable RDNS in DN switch (all 18 OEM functions active) 4765029: Implement missing gamma/RDNS functions, re-enable all 18 DN calls 9e3aa1a: Implement missing CCM attr functions, disable RDNS in DN switch 4c89d27: Bypass GIB by default — BLC write-gate causes black circular image 66655eb: Revert GIB bypass — disabling GIB kills AWB stats 7dbd675: Fix GIB/GB write-gate: use back-to-back volatile stores 0b64cd0: Implement missing interrupt/stats functions for OEM parity d9b0558: Implement 33 missing s_ctrl commands for OEM ioctl parity 94198ef: Implement ~30 missing g_ctrl commands for OEM ioctl parity 5ce6026: Fix check_state build error — tx_isp_subdev has no state member bd010ef: Add forward declarations for g_ctrl/s_ctrl dispatch functions fe61891: Replace g_ctrl/s_ctrl stubs with real implementations bc86a31: Implement deferred stubs: tisp_s_defog_enable + frame_done_wait b480acb: Resolve all TODO items across driver codebase 7eb03f4: FIX R=G=B: use _wb_static not _awb_cof for AWB zone ratio calibration bcbb052: Fix s_ctrl dispatch gaps and AWB parameter handling to match OEM 8deb403: Confirm R=G=B is upstream of WB gains; revert latch experiment 49d3d6c: Force-bypass GIB+GB+MDNS: confirms GIB as R=G=B root cause f77a683: Stable bypass config: GIB+LSC+ADR+GB+MDNS bypassed 91cdedc: Re-enable ADR: improved contrast and dynamic range b9284b3: Re-enable LSC: lens shading correction without regression 65ca3dd: GIB investigation: reg 0x106c shows stale value, R=G=B confirmed 4564f5d: GIB investigation: register values correct, HW activation issue 20ccc36: Check pt 7eb2f5f: better represent OEM logic 9dabd24: OEM exception_handle pipeline reset, MDNS enabled, AE step cap fix 99da383: AE dark-image fix, OEM bypass mask, ADR tone mapping overhaul 6c38516: Add ISP tuning math reference document 471fb64: check pt fcf8005: BCSH DN fixes, revert subsection gamma swap, add CCM diagnostics d30ed80: Temporarily re-bypass GIB/GB to restore AWB stats d29cc50: Revert Toffset_RGB2YUV and TransitParam changes that corrupted color 2835c2a: Implement TransitParam from OEM decompilation (default passthrough) 62efa04: Full OEM TransitParam: Cslope, Sstep, HDP/HBP/HLSP slopes from OEM 9515b0a: Add forward declaration for tiziano_bcsh_TransitParam d14d7fb: Move TransitParam globals to top of file for visibility 3414951: Fix __udivdi3 link error: use div_u64 for 64-bit division on MIPS32 bb98c19: Revert BCSH hysteresis gating — update every frame unconditionally 8f25f4b: ADR grid fix + AE convergence: OEM-exact ae0_tune2 ordering and step clamp d6c6609: ADR DMA diagnostic: confirm per-block stats arriving, identify uniform curve cause bbf2095: GIB/GB still kills AWB stats — revert to bypassed, add ADR weight diagnostics c31817d: Enable DPC from tuning binary (OEM-exact), add ADR weight + block diagnostics 372361a: Enable MDNS UV chroma temporal denoise (OEM-exact) 43ceef7: OEM-exact SDNS rewrite: 213 register writes via system_reg_write db53e92: Check pt sdns work 8621f5e: OEM-exact: all refresh wrappers, AF hardware params, missing functions a73e2a6: Fix tisp_s_sdns_ratio: per-channel h_s scaling, re-enable MDNS, fix braces c73154e: Add 22 missing AE functions from OEM decompilation bdd5c9c: AE DG via system_reg_write_ae, rename to OEM tisp_log2_fixed_to_fixed, destub AE hist/scene_luma dd12933: Remove non-OEM post-engine AE/AWB writes, restore OR mask 0x34002029 f90a5f1: Fix AE FIFO deadlock, OEM-exact JZ_Isp_Ae_Dg2reg, 64-bit log2 functions f1857f8: Check pt fc72e49: Fix AE convergence: FIFO domain, alloc IT clipping, full ae0_weight_mean2, Phase H reduction f649866: Check pt 7045fa4: faster AE convergence 6e36f5d: Fix data_9a2ec/GIB_CFG_DEIR_EN mismatch, revert GIB bypass pending HW root cause 3735aac: Check pt db86e41: faster AE convergence 368b362: Add DVP (parallel) sensor interface support in VIC start a77c122: Restore OEM-exact bypass OR mask 0x34000009 973bb12: Add VIC stop/restart to exception_handle pipeline reset 8ebcaef: Add force_bypass_dpc and force_bypass_lsc module params for AWB bisection f7f401a: Remove dead GC2053-hardcoded validation function and sensor name fallback 29b71af: Remove remaining GC2053-hardcoded values for multi-sensor support 5a0e52c: Fix sensor detection: use catch-all else instead of name matching a43db16: Remove fabricated isp_trigger_frame_data_transfer and DMA_READY handler 656a553: Remove fabricated tx_isp_arm_day_night_drop_window f1b50a4: Fix three DPC divergences from OEM that likely kill AWB stats bb6b698: Implement __enqueue_in_driver matching OEM (0xa3cc) 4ba03c7: Fix else-without-if build error in tx_isp_subdev.c bde9e3e: Fix data_9ab10 undeclared error: move declaration before first use 9587989: Add tisp_g_dpc_str_internal and unify dpc_ratio variable 415361d: Implement OEM buffer rotation for MSCA DMA address cycling 5f0deab: Add absFun and apical_isp_hvflip_update e914b92: Add math helpers and OEM symbol stubs (WIP — getters need proper impl) cedd897: Fix system_yvu_or_yuv: system_reg_write returns void 587b0d3: Add 9 buffer/module/lifecycle functions for OEM symbol parity 6ad9b30: Add 17 proc/debug/show/tuning functions for OEM symbol parity c525bf0: Add forward declaration for tisp_g_defog_str_internal 710fee2: Add forward declarations for tisp_af_get_metric and tisp_g_mscaler_mask_attr 22e3dbc: Add DN transition handler, GIB register verification, OEM-exact data_9a2ec 7aaba1b: Fix AWB deadlock: don't early-return on zero zones during bootstrap 4b9cbd4: Fix data_9a2ec init: OEM is 0x0, not 1 — affects ae0_tune2 and GIB reg 0x106c c018b45: Rewrite tisp_simple_intp to match OEM 32-bit arithmetic exactly 98ec02d: Fix day-mode ISP bypass and AE stats handling 1d0357c: good progres d653d75: isp: restore oem ae0 interrupt path 5a95395: isp: restore ae histogram dma path c859531: isp: feed ae fifo from prior target 96981f6: isp: stop forcing sc2336 day awb tables b1fbdef: isp: restore bcsh luma offset transform 0e35943: isp: bypass dpc on sc2336 b634011: isp: declare sensor name helper early 43d2543: Revert "isp: bypass dpc on sc2336" ab0a3de: Check pt dd034d0: Fix ADR 9571b1f: Good with ADR disabled 6af1ddb: Load AE target lists from runtime tuning blobs cd01e51: Restore AE EV thresholds for target interpolation b51f35f: Restore OEM AE FIFO target-domain input 05ff160: Stable image d4ab71a: Fix ADR tuning path against OEM behavior a9c83d9: Align OEM day/night tuning events and BCSH refresh path a585e98: Check pt 967207f: isp: baseline AWB stabilization eb773e9: check pt 3f2924c: check pt 01d32d3: Merge branch 'main' of https://github.com/opensensor/open-tx-isp c252816: Check pt t41 0eb3b27: check pt tools ce98a4b: factoring out common logic of open-tx-isp driver I bcf8546: Iterate on factoring out common driver math II 5b970b7: Factor out more common elements of the tx-isp driver ab8a13d: share tuning ABI and frame layouts across active SoCs fddb684: share checked frame buffer layouts across active SoCs
  • f781a7e package/llhttp: update to v9.4.3 Update llhttp from v9.4.2 to v9.4.3 Hash change: v9.4.2 -> v9.4.3 (No changelog available)
  • c3d219e webui: swap burn-in and SEI OSD order in preview modal Signed-off-by: Paul Philippov paul@themactep.com
  • 32035a4 webui: SEI selects 5rem, color wrappers 10rem Signed-off-by: Paul Philippov paul@themactep.com
  • 740e83f webui: SEI color pickers -> swatch+text pattern, accept 6 or 8 hex Signed-off-by: Paul Philippov paul@themactep.com
  • 0f229b3 webui: SEI font/outline gap-1 -> gap-2 Signed-off-by: Paul Philippov paul@themactep.com
  • 102d6d4 webui: modal format/scale gap-1 -> gap-2 Signed-off-by: Paul Philippov paul@themactep.com
  • 5228edc webui: fix modal fill/outline gap-1 -> gap-2, restore corrupted label Signed-off-by: Paul Philippov paul@themactep.com
  • c994588 package/prudynt-t: bump to 091e526 (precise burn-in ROI exclusion) Signed-off-by: Paul Philippov paul@themactep.com
  • 1ecbbcc pack: write a buildscope size report when the tool is available Attributes the rootfs to the packages that installed it and reads real usage out of every image into images/buildscope-report.json, which needs the build tree that pack still has and distclean removes. Prefers the copy BR2_PACKAGE_HOST_BUILDSCOPE installs into HOST_DIR and falls back to PATH, so a report is available without enabling the package. Guarded on the tool being present, and never fails the build.
  • 9bc0d1e package/buildscope: host tool for build size reports Cargo host package pinned by commit, following the thingino-dfu and scriba pattern. Host-only, so it needs Rust for the build machine and not for the target: the option depends on the host architecture alone and selects the Rust compiler, which defaults to the prebuilt toolchain. The repository is a cargo workspace whose root is a virtual manifest, so the subdir points cargo at the CLI crate; the lockfile and the vendored dependencies sit at the archive root and are found from there.
  • 12c187d pack: write a buildscope size report when the tool is available Attributes the rootfs to the packages that installed it and reads real usage out of every image into images/buildscope-report.json, which needs the build tree that pack still has and distclean removes. Prefers the copy BR2_PACKAGE_HOST_BUILDSCOPE installs into HOST_DIR and falls back to PATH, so a report is available without enabling the package. Guarded on the tool being present, and never fails the build.

Don't miss a new thingino-firmware release

NewReleases is sending notifications on new releases.