Changes in this release:
- b53de03 ingenic-sdk: bump to 070e4ff7, drop now-upstream patches The isp-vtable-trace, t31 audio amp-mute, and t31 motor TCU-stop changes are upstream in ingenic-sdk now; drop the carry-along patches and pin the newer commit. Signed-off-by: Paul Philippov paul@themactep.com
- eb7aef1 scripts/update_packages.py: drop .backup file creation The script is proven reliable and the .mk files are tracked in git, so the .backup files are redundant. Restore-on-failure fallback still covers write errors. Signed-off-by: Paul Philippov paul@themactep.com
- 97fd12c package/lightnvr: update to 0.41.15 Update lightnvr from 0.41.12 to 0.41.15 Hash change: 0.41.12 -> 0.41.15 (No changelog available)
- a3c1847 webui: make fMP4 the default prudynt preview prudynt now installs its fMP4 player as /preview.html (the default preview URL), matching raptor and timps. The MJPEG preview moves out of core thingino-webui into the prudynt package as /preview-mjpeg.html and is linked from the Streamer menu. Both preview pages render one combined endpoint list via a new shared preview-endpoints.js. Signed-off-by: Paul Philippov paul@themactep.com
- e7dea9d uclibc: add patches for upcoming version
- 5ef8358 gcc: add patches for upcoming version
- f0614db binutils: add patches for upcoming version
- cba6a34 Makefile: verify host en_US locale for from-source uClibc The from-source uClibc toolchain (BR2_TOOLCHAIN_BUILDROOT_UCLIBC=y) generates its locale data on the build host: uClibc-ng's gen_locale calls setlocale(LC_ALL, "en_US.UTF-8") and bakes the result into the toolchain. On a host without that locale the build fails deep inside uClibc with a cryptic "undeclared __LOCALE_DATA_CATEGORIES" error. Fail at parse time with a clear message when BUILDROOT+UCLIBC is selected and the host cannot provide en_US. External and local toolchains bundle prebuilt locale data and are unaffected. Signed-off-by: Paul Philippov paul@themactep.com
- 299bbca linux-headers: apply thingino versioned kernel patches Building the toolchain from source (BR2_TOOLCHAIN_BUILDROOT=y) builds a separate linux-headers tree from the vanilla kernel tarball before the kernel itself is configured. That tree never received the thingino versioned patches, so scripts/unifdef.c kept its
constexprvariable and failed to compile under GCC 16, where C23 makesconstexpra keyword. Symlink package/all-patches/linux-headers to package/all-patches/linux so Buildroot's version-aware global patch lookup applies the same patches to the headers as to the kernel. Signed-off-by: Paul Philippov paul@themactep.com - d836336 Fix NFS boot mount: pass bare host to ip route get mount_nfs passed the full nfs_share spec (host:path) to ip route get, which requires a bare IP address. The reachability guard always failed, so the hook exited before attempting the mount and the NFS share was never mounted on boot. Signed-off-by: Paul Philippov paul@themactep.com
- 7874034 Add default config for netwatch
- 6857bc7 send2: build curl/mosquitto_pub arg vectors instead of sh -c strings The send2* action scripts assembled a curl/mosquitto_pub command line as a string and ran it through sh -c, embedding user data (subjects, names, captions, messages, credentials) unquoted. Any value containing spaces, quotes, or shell metacharacters was word-split or reinterpreted on eval, breaking the send (e.g. webhook JSON bodies parsed as multiple args). Build each command as a positional-argument vector and execute it directly so every value survives as a single intact argument. Also: - send2storage: copy into date-nested paths from the filename template instead of mv-ing to a /tmp path that was never created; create parent dirs as needed. - send2mqtt: use add_to_garbage for the JSON temp file (previous garbage="$garbage ..." wrote to an orphan var, leaking it) and drop an unused escape helper. - send2telegram: JSON-escape the caption in the sendMediaGroup payload. - send2gphotos: replace shell_escape string building with direct args. ha-common: fall back to direct mosquitto_pub when the publish FIFO is missing so standalone callers (e.g. ha-event during motion) don't error when ha-daemon is not running. Signed-off-by: Paul Philippov paul@themactep.com
- 57808ce Add event-driven NFS mount and network watchdog Mount the NFS share from the if-up/if-post-down hooks instead of a boot-time race in S43mounts, and add a connectivity watchdog (S52netwatch) that reboots the camera after repeated ping failures, with WebUI settings on the Network page.
- 1e4d674 scripts/update_packages.py: kill git helper processes on timeout git ls-remote/fetch spawn git-remote-https helpers that inherit the stdout/stderr pipes. On a stalled network, subprocess.run killed only the git parent after the timeout while the helpers kept the pipes open, so communicate() blocked forever and the script hung mid-scan. Run git in its own session and kill the whole process group on timeout instead. Signed-off-by: Paul Philippov paul@themactep.com
- d4f34e0 thingino-mmc: pass cd_gpio_pin only when gpio.mmc_cd is set S09mmc unconditionally passed cd_gpio_pin=59 when the profile had no gpio.mmc_cd entry. cd_gpio_pin overrides the card-detect pin from the board platform data, so the default forced a detect GPIO onto boards that declare none (GPIO_MMC_CD_N == -1) and made jzmmc sense a phantom card on a floating pin. Pass the parameter only when gpio.mmc_cd is explicitly configured and non-empty. Signed-off-by: Paul Philippov paul@themactep.com
- ea63e9e linux 3.10.14: jzmmc: create mmc0 proc dir in process context jzmmc_detect_change() runs as the card-detect debounce timer (softirq, atomic context) and called jz_proc_mkdir("mmc0") on card insertion, which goes through proc_mkdir() -> kmalloc(GFP_KERNEL). With CONFIG_DEBUG_ATOMIC_SLEEP this trips "BUG: sleeping function called from invalid context" at mm/slub.c:926 on any XBurst1 camera whose MMC0 is removable and has a card present when the timer fires. Move the /proc/jz/mmc0 creation into jzmmc_probe() and its removal into jzmmc_remove(), both process context. The directory carries no per-card state, so eager creation is equivalent. Signed-off-by: Paul Philippov paul@themactep.com
- 7042a0b cameras: vanhua_s37i: drop MMC support (no SD/SDIO on board) The S37I is Ethernet-only; the Swan board header declares GPIO_MMC_CD_N == -1 (no card-detect, no SD slot, no SDIO). Keeping BR2_PACKAGE_THINGINO_KOPT_MMC/MMC0 enabled built jzmmc_v12.ko, registered a REMOVABLE MMC0 host, and let S09mmc load the driver with a default cd_gpio_pin=59 that overrode the board's "no card-detect". The floating GPIO 59 read as "card inserted" and jzmmc_detect_change() then tripped a sleeping-in-atomic BUG while creating /proc/jz/mmc0. Signed-off-by: Paul Philippov paul@themactep.com
- 9a17c1a package/thingino-sensor-info: update to 202270a Update thingino-sensor-info from 625667a to 202270a Hash change: 625667a0d58838dd3b8cac31062727c61fa38366 -> 202270aa0070f92bb6969735438f09adedfe5261 Changelog: c0f5fb3: add T32 support 9e6d40b: t32: mux the MCLK pin, and mark hardware-validated 202270a: README: document t32
- 96764d5 prudynt-t: bump to fMP4 preview + API-key stream auth Picks up the live fMP4 endpoints (/ch0.mp4, /ch1.mp4) and now requires the shared API key on those and the direct MJPEG routes, matching the webui. Signed-off-by: Paul Philippov paul@themactep.com
- bdd88ce prudynt-t: authenticate fMP4 preview with the API key The streamer now requires the shared API key on /chN.mp4. Fetch the key from /x/api-key.cgi and append ?token= to the stream URLs so the in-page player and the copyable endpoint links keep working. Signed-off-by: Paul Philippov paul@themactep.com
- a4efa19 wyze-accessory: add floodlight control and HA integration Add on/off and brightness control plus optional night-time motion activation for the Wyze Floodlight v1 accessory. - floodlight_ctl reads brightness/motion settings from thingino.json, gains a bare
oncommand, and adds amotionsubcommand - add a Settings -> Floodlight WebUI plugin in the doorbell style - expose a Home Assistant light entity with 1-100% brightness, auto-enabled on floodlight builds - hook night-time motion activation into the streamer motion scripts - document the accessory and its Home Assistant entity Signed-off-by: Paul Philippov paul@themactep.com - 15d9d7d docs: document nav-item fields (incl. action) in AGENTS.md Follow-up to the webui nav-action merge: record the per-item fields and the opt-in "action" behaviour in the agent-facing plugin section, and point at docs/dev/webui-plugin.md for the full reference. Signed-off-by: Paul Philippov paul@themactep.com
- 2ee113d package/timps: bump to v1.9.10 hal_ingenic T40/T41 OSD + sensor GPIO fix, on_motion via posix_spawn (avoids OOM-killing timpsd on memory-constrained boards), motion. sensitivity stale-readback + lost-persist fix, timps-qa RC touch- stream fix for encoder..rc readback timing. Hash verified via a real git-archive fetch (submodules included). Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 0ecda0c package/timps: fix v1.9.9 tarball hash entry Buildroot's git downloader names the archive timps-v1.9.9-git4.tar.gz (BR_FMT_VERSION_git = -git4), so the timps-v1.9.9.tar.gz entry added in 9939d58 never matches and check-hash aborts with "No hash found". Co-Authored-By: Claude Opus 5 noreply@anthropic.com
- 5fed7ca camera: move Shelly Camera S1 to supported
- 7362b2a package/prudynt-t: add volume slider to fMP4 preview Add a volume slider between mute and zoom. Dragging it sets the video volume and unmutes; the mute button restores full volume when unmuting from a zeroed slider. Signed-off-by: Paul Philippov paul@themactep.com
- 5f22f0b package/prudynt-t: serialize fMP4 stream switches Rapid Main/Sub switches could still leave the new MediaSource half-fed because start() created it before the previous run() had fully stopped. Chain each switch off the previous run's completion promise and add error/abort/timeout settling to appendSegment so a switch can never hang waiting on a stale append. Signed-off-by: Paul Philippov paul@themactep.com
- 3d98ae3 package/prudynt-t: make fMP4 channel switching race-free Switching Main/Sub could stall playback: the old run() loop and the new one shared module-level sourceBuffer/mediaSource, so a stale append could land in the new MediaSource. Add a session token checked after each await, capture the source buffer locally in appendSegment, and drop the throw-prone removeSourceBuffer/endOfStream from teardown. Signed-off-by: Paul Philippov paul@themactep.com
- 809188d package/prudynt-t: minimal mute/zoom controls for fMP4 preview Drop the native video controls (pause/progress/PiP) and add just two buttons: a mute toggle and a fullscreen toggle. The stream is always playing; a pause event auto-resumes. Signed-off-by: Paul Philippov paul@themactep.com
- 5614e51 package/prudynt-t: inject plugin preview body into fMP4 page Add the THINGINO_PLUGIN_PREVIEW_BODY marker so plugin overlays (PTZ jog controls, etc.) are injected into the fMP4 preview page the same way they are into the MJPEG preview. Signed-off-by: Paul Philippov paul@themactep.com
- ba690c4 package/prudynt-t: decode audio track in fMP4 preview player The stream now carries an AAC track. Detect the mp4a sample entry in the init segment and add the matching codec to the SourceBuffer so audio plays alongside video. Signed-off-by: Paul Philippov paul@themactep.com
- 17dd4f3 package/prudynt-t: add fMP4 live-preview page New /preview-fmp4.html page plays the H.264 fMP4 stream served by prudynt's HTTP server (port 8080) via MediaSource, reusing the existing encode. Kept alongside the MJPEG preview. Added as "Live View (fMP4)" in the Streamer menu. Signed-off-by: Paul Philippov paul@themactep.com
- 378cbdf camera/cinnado_d1: drop prudynt websockets The fMP4 live-preview endpoint now lives in the built-in HTTP server (HTTPMJPEG, port 8080), so the libwebsockets UI/control server and its zlib dependency are no longer needed. Signed-off-by: Paul Philippov paul@themactep.com
- d35d47a build: auto-repack rootfs on package/overlay changes The rootfs image rule depended only on the kernel, so a package reinstall or overlay edit left rootfs.squashfs and the firmware image stale until the files were removed by hand. Make the rule depend on the per-package target trees, the overlay directories, and the post-build script, so make / make fast / make pack regenerate and repack automatically. Signed-off-by: Paul Philippov paul@themactep.com
- 6e7b151 camera/cinnado_d1: enable prudynt websockets Enables the libwebsockets UI/control server (port 8089), which also exposes the fMP4 live-preview endpoint /ch0.mp4. Signed-off-by: Paul Philippov paul@themactep.com
- d9426dd buildroot: update to 2026.08 release
- 22607f1 uboot: rename patch files for proper numbering
- 9939d58 package/timps: update to v1.9.9 Update timps from v1.9.8 to v1.9.9 Hash change: v1.9.8 -> v1.9.9 (No changelog available)
- e359f6d package/open-tx-isp: update to 9315bed Update open-tx-isp from b26b7e0 to 9315bed Hash change: b26b7e0cac51d0fead0d61c8f9fd1e1d5b99943d -> 9315bede913c7a75b4800f94da8657a8d2836398 Changelog: 72a6720: t41: retain Thingino V4L2 startup and saturation safeguards 915582b: t41: initialize proc seq state and reject unrecovered diagnostics 5a21e27: t41: expose sensor-calibrated neutral-mesh AWB estimates 66c4556: t41: recover calibration-driven AWB writers and correct TMO offsets 2ccaf92: docs: distinguish the remaining RTSP audio synchronization warning c3d57d3: docs: link the validated shared-origin RTSP audio fix 6f74239: t41: recover scalar local TMO filtering with independent hardware tests 006cc72: t41: drive scalar TMO from frames and replace captured CCM with calibration math ef72f15: t41: compute BCSH from calibration and honor color block routing 9de245b: t41: recover calibrated AE metering, black normalization and WB gain math 085314c: t41: allocate sensor gain through its callback and gate tuning readiness 3ac149e: t41: verify calibrated gamma against OEM and follow live exposure 7f2343a: t41: compute DPC thresholds and masks from gain calibration f9a0696: t41: replace captured demosaic profiles with calibrated algorithms f10f9c3: t41: avoid unchanged gain fanout and routine AWB warning traffic e8620cd: t41: recover complete calibrated SDNS and share tuning strength math 2d9076a: t41: drive luminance denoise from calibrated gain tables 27d9977: t41: replace captured sharpening and chroma denoise with calibrated math 514677d: t41: recover calibrated temporal denoise and gate DMA on valid buffers e6f3128: t41: replace captured LCE curves with calibrated histogram processing eef3d24: t41: recover and oracle-check generic ADR processing primitives fe42b8b: t41: recover complete ADR frame history and calibration transitions e081504: t41: replace captured ADR profile with owned native frame processing 0aaed3a: t41: dispatch native ADR statistics in the safe ISP interrupt path 505965b: t41: bootstrap ADR statistics from the validated initial map 8d9c96c: t41: distinguish calibrated ADR bypass from enabled-path smoke tests 9586af4: docs: record native ADR live validation and calibrated bypass cea8bce: t41: recover generic mesh and ring lens-shading interpolation 94a433c: t41: recover LSC geometry and flipped calibration lifecycles 94679ab: t41: own live LSC state and recover staged tuning callbacks 0fec083: t41: avoid diagnostic MMIO and log spam on normal gain changes 71a6fdd: docs: record native LSC live and persistent validation 58014b7: t41: recover generic AWB statistics, priors and special regions 26b18fc: t41: recover fixed-point AWB temperature surface interpolation e061efb: t41: recover generic AWB gray-world fallback 98a858d: t41: recover AWB class aggregation and temporal convergence 537ca77: t41: recover generic AWB clustering and illuminant selection 10b0792: t41: generate universal AWB distance weights mathematically 53aa95a: t41: validate the connected AWB pipeline against OEM frames f90a7d0: t41: recover owned AWB initialization and control transitions 05be9cd: t41: prepare and test frame-owned AWB runtime adapter f15bee0: t41: connect frame-owned AWB with explicit userspace ownership fe620b5: t41: restore transactional public AWB controls and readback 6cd93c7: docs: record native AWB live controls and persistent validation 0553b9d: t41: recover calibrated AE convergence ramp and deflicker lattice 0c43b39: docs: record physical T41 AE ramp and flicker oracle gate 6a2551a: t41: recover generic automatic AE exposure and gain allocation 1c43bcb: t41: validate flicker state and use sensor exposure limits fcf9dd9: docs: define T41 daytime parity exit gates 0506257: fix(t41): generate and load scaler curves for every output channel 335cacd: fix(t41): keep input capture owned across output restarts 8178bbd: docs(t41): record shared-graph multi-output checks and remaining gates 07cb726: fix(t41): expose independent V4L2 outputs and quiesce capture DMA 9315bed: fix(t41): route public anti-flicker policy to native AE
- c311aff package/lightnvr: update to 0.41.12 Update lightnvr from 0.41.10 to 0.41.12 Hash change: 0.41.10 -> 0.41.12 (No changelog available)
- 6044555 package/ingenic-sdk: update to 9a2a2b5 Update ingenic-sdk from 498cf14 to 9a2a2b5 Hash change: 498cf14a97d07fd14995e1c1ae27ae77a5453cc2 -> 9a2a2b5d32cff7ade44c41741f3e2af3bf6137ad Changelog: 3d7725a: add IQ file for IMX307 from Vanhua S37, set it default choice 9a2a2b5: add IQ file for GC1084 from OKam QC3
- b177162 uboot: update patches for 2013.07 WIP
- 63ee569 Revert "webui: size the preview mjpeg to the rendered canvas" This reverts commit eeedadb.
- cbea534 prudynt-t: bump to JPEG-follows-source geometry
- eeedadb webui: size the preview mjpeg to the rendered canvas Read the final rendered size of the preview frame and pass it as w/h parameters to the mjpeg endpoint, so the encoder produces exactly what the canvas shows. The request is bound to a debounced ResizeObserver on the frame, so the size is only reapplied once the canvas transformation has settled rather than on every intermediate resize step. Signed-off-by: Paul Philippov paul@themactep.com
- ce75af5 prudynt-t: bump to sensor-default stream geometry
- 89cf093 prudynt-t: bump to single-source stream geometry + mjpeg base-size reset
- 10bd51d motors: install and wire the PTZ preset bar preview-motors-presets.js builds the preset bar under the preview (10 slots, click to move, long-press to save) and was never committed, so reflashes dropped it. Add it to the plugin preview.scripts and the package install list. Signed-off-by: Paul Philippov paul@themactep.com
- a019e9b webui: preview uses the streamer's native JPEG size, no w= param Drop the dynamic preview-size computation entirely: the pane size no longer influences the MJPEG request. The streamer sends its configured JPEG size and the browser scales it via CSS (img-fluid), which removes the per-layout-reconfig churn and the tiny-JPEG symptom at the source. Signed-off-by: Paul Philippov paul@themactep.com
- e45de65 webui: clamp preview stream width to a minimum of 320 px computePreviewStreamWidth returned any clientWidth >= 16, so a pane mid-layout requested a 16-64 px MJPEG. Clamp to 320 px so the preview requests a sane size until the canvas settles. Signed-off-by: Paul Philippov paul@themactep.com
- 5f931bb webui: heartbeat payload via shell builtins, cache slow fields thingino_heartbeat_native_payload forked ~20 processes per interval (cat|tr pipelines, cut, jct|tr, sed, wg, light x3). Read runtime files with the read builtin, strip jct quotes with parameter expansion, and refresh the slow hardware fields (wg, ir850/ir940/white lights) only every 3rd interval. Drops the per-interval fork/exec count from ~20 to ~3 (+4 every 3rd interval). Signed-off-by: Paul Philippov paul@themactep.com
- 7116316 package/thingino-dfu: the DFU gadget shares the bootrom's id a108:4d44 was retired in 2026-07; the comment named it as the gadget's. The rule itself matches on vendor and is unchanged.
- c587b74 package/thingino-dfu: the Rust tool, 2.0.0, from its release
- a58bfc8 cameras: add alarm gpio to vanhua s37
- de955cd packages: bump prudynt-t and jct to the optimization commits prudynt-t: ba9225f -> 0cd8fbf (exception/RTTI removal, pool-backed video channel, contiguous RTSP send queue, conditional config writes, cached config serialization, runtime state files). jct: v1.2.0 -> v1.2.1 (get/set/del_nested_item no longer strdup+strtok). Signed-off-by: Paul Philippov paul@themactep.com
- e8d23c7 webui: heartbeat daemon caches payload; SSE relays it Enable S99heartbeat (previously commented out) as a single aggregator: it sources heartbeat-lib.sh and writes the payload to /run/thingino/heartbeat.json once per interval. The SSE endpoint (json-heartbeat.cgi) and one-shot endpoint (json-heartbeat-slow.cgi) now relay the cached file instead of each re-aggregating from all sources. This removes the per-tab fork/exec + jct/wg/ircut churn: N open tabs now cost one aggregation per interval plus N file reads, instead of N aggregations. Signed-off-by: Paul Philippov paul@themactep.com
- b390c15 webui: heartbeat reads prudynt runtime files instead of a JSON round-trip thingino_heartbeat_native_payload called
prudyntctl jsonevery 5s to get mic_enabled/spk_enabled/running_mode. Read /run/prudynt/mic.active, spk.active and running_mode instead, which prudynt now maintains on state change. Signed-off-by: Paul Philippov paul@themactep.com - 836421e docs: record pool-backed MsgChannel in prudynt roadmap Phase 2's remaining per-NAL allocation is now eliminated: the channel and video taps share a NaluPool and recycle buffers on read/evict/clear. Signed-off-by: Paul Philippov paul@themactep.com
- 6f6c759 docs: record Phase 2 status in prudynt optimization roadmap Mark wrap_buf, taps_copy, and codec-config copies as fixed; document the remaining per-NAL channel-copy allocation and why it needs a pool-backed MsgChannel rather than a hot-path edit. Signed-off-by: Paul Philippov paul@themactep.com
- 740e938 docs: add prudynt memory/latency optimization roadmap Four-phase plan grounded in measurements from a T31 build: compiler-flag overhead removal (done: -227 KB, -22.6% binary), zero-allocation frame path, libstdc++ removal, and a decision gate on a full C rewrite. Signed-off-by: Paul Philippov paul@themactep.com
- 5ed54ef cameras: vanhua_s37i: fix flash size 16MB -> 8MB Stock dump is 8MB and the NOR reports ID 0x204017 (64Mbit); the 16MB image overflowed the flash and corrupted the bootloader region. Signed-off-by: Paul Philippov paul@themactep.com
- 00a7e65 uboot: netconsole ipaddr falls back for non-IPv4 IP values The injected ipaddr took $(strip $(IP)) verbatim, so a non-literal IP (e.g. IP=cam.local, valid for the ssh-style detection path) was written into uenv.txt as-is. U-Boot then fails to parse it, net_ip stays 0, and NetLoop refuses NETCONS on the very board with no serial port to say so. Guard the value with a dotted-quad case so hostnames and empty IP fall back to 192.168.1.10; only literal IPv4 values are injected. Signed-off-by: Paul Philippov paul@themactep.com
- 90f6ca7 mqtt: trust OS certs instead of --capath /etc/ssl/certs The thingino mbedTLS mosquitto backend does not implement --capath. It logs "tls-capath is not yet supported" and, with peer verification on and no CA loaded, returns MBEDTLS_ERR_X509_CERT_VERIFY_FAILED. Every MQTT client in the image passed --capath /etc/ssl/certs, so MQTTS against a Let's Encrypt broker (Home Assistant, port 8883) failed. Point every consumer at the OS certificate store instead: --tls-use-os-certs for mosquitto_pub/sub and MOSQ_OPT_TLS_USE_OS_CERTS for ha-mqtt-pubd. The mbedTLS backend supports that and loads /etc/ssl/certs/ca-certificates.crt. Also drops the hardcoded cert path. Fixes: #1599 Signed-off-by: Paul Philippov paul@themactep.com
- 3c9461e script to help to recover mp4 recordings damaged by nfs timouts
- 412b12b package/uhttpd: bump
- 9f15136 uboot: reorganize patches for 2026.07. tarball to head, head to thingino, extras.
- 5c8e2ec Makefile.utils: parallelize build-all The build-all loop built every camera sequentially. Drive it with xargs -P so BUILD_ALL_JOBS cameras build at once (default 4; each camera's own make is already -j parallel, so 4 concurrent kernel builds is the practical ceiling for most machines). Each camera now builds into its own log file via a small helper script instead of teeing full output to the terminal; the helper drops an .ok/.fail marker that the target aggregates into the same summary as before. Signed-off-by: Paul Philippov paul@themactep.com
- 787f026 docs: document container image update check variables Add CONTAINER_SKIP_UPDATE_CHECK and CONTAINER_IMAGE_CHECK_TTL to the build-container.sh environment variable table. Signed-off-by: Paul Philippov paul@themactep.com
- 65856bd docs: document kernel version pinning Describe the two kernel sources (3.10.14 official tarball vs the custom thingino-linux repo), the KERNEL_HASH pin table in thingino.mk, and how to bump pins with scripts/update_kernel_hashes.sh. Signed-off-by: Paul Philippov paul@themactep.com
- 7db8f49 scripts: add update_kernel_hashes.sh Report or bump the kernel commit pins in thingino.mk. Runs the same branch-to-hash map that pins the custom-git kernels, compares each pin against the remote branch tip, and with --apply rewrites stale pins in place. Hashes come straight from git ls-remote, so nothing is typed by hand. Exit 1 in report mode when a pin has drifted, so it can gate CI. Signed-off-by: Paul Philippov paul@themactep.com
- 298c6a2 thingino.mk: pin kernel commits, drop parse-time ls-remote KERNEL_HASH was resolved with git ls-remote at make parse time for every non-3.10.14 kernel, so a build was both slow (network round-trip) and non-reproducible (the hash advances as branches move). Replace it with a branch-to-commit map so known branches are pinned and the network is only hit for unmapped ones. The existing ingenic-t23-4.4.94 pin (b8a1f1e) is no longer reachable from any ref on the remote, so it is repointed to the current tip. All nine hashes verified as commits against github.com/gtxaspec/thingino-linux. Signed-off-by: Paul Philippov paul@themactep.com
- 338e329 build-container.sh: TTL-cache container image update check The remote digest lookup (skopeo or podman manifest inspect) ran on every invocation. Cache the last-check timestamp and only re-check after CONTAINER_IMAGE_CHECK_TTL seconds (default 600). Set CONTAINER_SKIP_UPDATE_CHECK=1 to skip the check entirely for offline or CI use. Signed-off-by: Paul Philippov paul@themactep.com
- 6bacc51 build-container.sh: delegate camera selection to select_camera.sh The wrapper carried a ~146-line copy of scripts/select_camera.sh's fzf/whiptail/dialog/numbered-list UI. Replace it with a thin wrapper that keeps the CAMERA= short-circuit and IP auto-detection, then calls the shared script. The two implementations had already drifted. Signed-off-by: Paul Philippov paul@themactep.com
- 9ec9058 Makefile.targets: share ram-build/ram-dev copy-back logic The artifact copy-back block was duplicated verbatim between ram-build and ram-dev. Extract it into a ram_copy_artifacts variable so the two targets only differ where they actually differ (which make target runs and whether the tmpfs tree is wiped). Signed-off-by: Paul Philippov paul@themactep.com
- 8cc8eb1 board.mk: use make builtins instead of shell Replace two parse-time shell spawns with GNU make builtins: - $(shell echo "$(CAMERA_CONFIG)" | wc -w) -> $(words $(CAMERA_CONFIG)) - $(shell basename ... | sed -E "s/_defconfig//") -> $(patsubst %_defconfig,%,$(notdir ...)) Verified equivalent across configs/cameras, configs/cameras-exp and configs/github (whose defconfigs sit at the top level). Signed-off-by: Paul Philippov paul@themactep.com
- e66e040 Makefile.utils: drop inert .DEFAULT prerequisite '.DEFAULT: check-config' declared check-config as a prerequisite of the catch-all rule, but GNU make never builds .DEFAULT prerequisites, so the line was dead and contradicted the comment directly above it, which states check-config is not a prerequisite. Signed-off-by: Paul Philippov paul@themactep.com
- 9ce6911 pre-commit: run git diff --cached once The hook invoked 'git diff --cached --name-only --diff-filter=ACMR' six times, once per file category. Capture the staged list once and derive each category from it with case patterns. The case globs are equivalent to the git pathspecs they replace: '*' in a shell case pattern matches '/', same as git's default wildmatch, so vendor files under www/a/ keep matching. Signed-off-by: Paul Philippov paul@themactep.com
- 3ef6782 scripts: remove orphaned thingino_config_gen.sh Nothing invokes it. /etc/thingino.json is assembled by thingino-core.mk, which merges configs/common.thingino.json, the per-camera staging file, and THINGINO_USER_JSON_FILES in the finalize hook. The script was also broken beyond the duplicate path: its SYSTEM_CONFIG pointed at configs/thingino.json, which does not exist. Signed-off-by: Paul Philippov paul@themactep.com
- b2dc5ae sysupgrade: add timps.conf and onvif.json to cfg-backup.list Reported by a timps user: an OTA upgrade doesn't preserve /etc/timps.conf. cfg-backup.list is a flat, hand-maintained manifest with no per-package registration - both timps (persists settings written via its /control API) and onvif (its own runtime-written config) write a config file under /etc that was never added to the list, so a full ota/ota-full reflash (which wipes the data/overlay partition outright) leaves nothing to restore either from. A plain rootfs-only ota-upgrade doesn't hit this today (its squashfs image carries no appended data segment, so the data partition is left untouched) - the gap only bites on a full reflash, but the fix is the same either way: the pre-flash cfg-backup snapshot needs to actually contain the file. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- a2c5291 package/wifi-atbm6132cu: update to f2e8ae0 Update wifi-atbm6132cu from 31615cc to f2e8ae0 Hash change: 31615cc8357bd8bbe86e964bff0ec211a2fbd6c1 -> f2e8ae06dd8a439461d22e70504f246320a87414 Changelog: f2e8ae0: configs: add ATBM6132CU config for Ingenic hosts
- 6f7aa85 package/lightnvr: update to 0.41.10 Update lightnvr from 0.41.4 to 0.41.10 Hash change: 0.41.4 -> 0.41.10 (No changelog available)
- 8751ecb cameras: add wlan gpio to wansview q7
- 6421ddd timps: remove duplicated WS-reconnect block in preview-motors.js The 'Merge remote-tracking branch upstream/ciao into ciao' merge on our fork (abb7567) duplicated the bfcache/visibilitychange/15s- backstop PTZ WS reconnect block instead of resolving it to one copy - both merge parents had it once, the merge emitted it twice. That merge commit's content reached upstream/ciao via #1600 (sync-timps-package- ciao), so the duplicate is now here too. The stale second copy is also missing .then(syncPositionTransport), racing the SSE position fallback. Net effect on every timps+motors build: two pageshow listeners, two visibilitychange listeners, two 15s setInterval timers, doubled reconnect attempts and doubled console.info on recovery. File now matches upstream/master's copy exactly (965 -> 925 lines). Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 5bae81a package/timps: shfmt-format timps-irprobe This file has failed shfmt -i 0 -ci since it was introduced in #1507 (merged with a red format check). Fixed identically to how it was already fixed on master in #1598, so both branches match. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 2676b32 package/timps: sync package to current state Brings package/timps up to date with our ciao development branch: hardened TIMPS_REAPPLY_MOTORS_UI gate (also keyed on the streamer choice, plus the rationale for using a finalize hook here), the SSE position-stream fallback in preview-motors.js, REC button error surfacing (control bar + tool-record status line), and README/version notes. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 2d401a4 webui: document the mse watchdog's video.paused assumption Fable's adversarial review of 69a660d flagged this as the one unconfirmed assumption worth noting, not a bug: the mse watchdog treats video.paused as always meaning "the user chose this" for a player holding data. True for every case checked; no repro found where a revealed muted video reports paused=true with a full buffer outside an actual pause. Comment only, no logic change. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 9ca49cd webui: add a progress watchdog to the preview player Lifecycle events alone don't recover a suspended tab: when the browser parks the pending reader-loop read, it never resolves or rejects, so
runningstays true and both handlers correctly do nothing. Watch data progress instead and force a reconnect after 20s of no bytes (or frozen MSE playback) while visible. Also cap the /control probe at 8s - with the per-origin socket pool full it hung forever before video.src was ever assigned. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com - bb0b1d4 webui: reset rt retry budget on Connect too, not just mse Same wart Opus found and fixed for mse: a Connect click from the "gave up after 5 attempts" dead end reused the exhausted rtRetries counter and gave up again after a single try. Reset both modes' retry state on Connect regardless of which is about to start, since mode can change between a give-up and the next click. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- a9d79c6 webui: auto-reconnect the buffered (MSE) preview player rt mode had scheduleReconnect (5 tries, 500ms->8s backoff); mse mode had nothing - any drop left a dead player until a manual click. Add scheduleMseReconnect, modelled on it: minimal teardown only, never stopStream(), so the session token stays put and the pending retry survives - while a real Connect/stream/mode switch bumps it and cancels the retry through the same guard. Clean end-of-body retries too: every cause named there (daemon restart, client-limit eviction) is transient, and a deliberate stop comes from this page and bumps the session anyway. Also mirrors rt's 401/5xx triage - without the token renewal the retry can never recover from a timpsd restart, since the per-boot token rotates. Budget resets on the first accepted append, not on the bare 200, so a server that accepts-then-drops can't loop forever. Live-verified on Garage: daemon restart -> 5 backoff attempts -> token renewal -> Connected; 503 saturation -> retries -> recovers without a click; give-up message and manual Connect both correct. Co-Authored-By: Claude Opus 5 noreply@anthropic.com
- ddb611f webui: reconnect PTZ WS and video stream after a backgrounded tab pagehide/pageshow only fire on real navigation or a bfcache freeze; plain tab-switching only fires visibilitychange. Neither the motors WS nor the video stream had any reconnect tied to either, so a long-backgrounded tab (Edge's tab-freeze after ~20min, or rt mode's own scheduleReconnect exhausting its retry budget) left both dead until a manual reload/click. Add pageshow + visibilitychange reconnect hooks to both, resetting rtRetries so a stale exhausted budget doesn't instantly re-fail the first attempt. Live-verified against Garage (Fable): rt mode self-recovers within ~6s of the tab becoming visible again after a forced connection failure. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 09fe423 package/prudynt-t: update to ba9225f Update prudynt-t from 862a73a to ba9225f Hash change: 862a73aef26f41ff00b7d80d909ff6d9526a77d0 -> ba9225ff8e9167376b876efbc6935d94300b2c5c Changelog: mjpeg: round preview size to nearest multiple of 16
- f066ec6 mount nfs with hard sync to prevent file corruption
- 91650d7 prudynt-t: check MP4 recorder write errors
- e097d3b webui: cleanup
- 3936570 webui: correct asset hash
- 9c68a1d mdnsd: bind all interfaces in client mode S50mdnsd pinned mdnsd to the first up non-loopback interface. On a camera with a no-carrier eth0 and an active wlan0 that selects eth0, so the camera announces mDNS nowhere and disappears from LAN scans. Let mdnsd 1.1 watch all interfaces in client mode; it tracks netlink address changes, so interfaces that come up later are picked up. Keep the single-interface pin only for AP/portal mode to avoid the captive-portal login prompt. Signed-off-by: Paul Philippov paul@themactep.com
- e679768 webui: make Cameras on LAN discovery complete and bounded mquery -w only stops the event loop after select() returns. Once the query retries are exhausted libmdnsd schedules its next wakeup a day out (its GC timer), so a -w longer than the three-second retry schedule blocks until the next mDNS packet. Drop the browse window to three seconds and run two passes, merging results, so dropped multicast replies on busy Wi-Fi segments don't silently remove cameras. Capture the browse output before resolving per-camera TXT records so the TXT query burst can't compete with the browse socket, and batch the TXT queries four at a time instead of firing them all at once. Signed-off-by: Paul Philippov paul@themactep.com
- d27ce69 thingino-motors: bump fork pin to caa4bf3 Co-Authored-By: Claude Opus 5 noreply@anthropic.com
- 03a69db package/timps: bump to v1.9.8 Co-Authored-By: Claude Opus 5 noreply@anthropic.com
- 41b6378 webui: show timps and motors versions in the page footer Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 803e2fc package/prudynt-t: bump
- 31b68ce webui: link camera build IDs to their GitHub commits The Cameras on LAN table renders each responder's build ID (branch+short hash, e.g. ciao+2e8d0a0) as plain code. Turn the hex commit suffix into a link to the corresponding commit page on GitHub; values that are not branch+hex stay plain text. Signed-off-by: Paul Philippov paul@themactep.com
- 2e8d0a0 webui: parallelize per-camera mDNS TXT queries The scan ran one mquery -t 16 -w 1 per discovered camera, serially, and each -w is a fixed 1s wait, so a LAN with ~17 cameras took ~22s. Fire all TXT queries as background jobs and collect their results from a temp dir, so the metadata phase costs ~1s regardless of fleet size. Signed-off-by: Paul Philippov paul@themactep.com
- 1354cb6 webui: render streamer as plain text Signed-off-by: Paul Philippov paul@themactep.com
- 9e5d4ab webui: highlight the local camera row instead of a badge Drop the 'this camera' badge in favor of a subtle orange tint on the local camera's row, using Bootstrap's --bs-table-bg-state mechanism so it survives striped and hover states. A legend below the table explains the highlight. Signed-off-by: Paul Philippov paul@themactep.com
- a0bf3b1 webui: cache Cameras on LAN results and add column sorting Serving the page no longer rescans: json-cameras.cgi caches the last scan in /tmp and returns it on plain GET, so the page loads instantly. A refresh=1 query forces a fresh scan and rewrites the cache; only the Rescan button sends it. Sortable columns follow the file manager pattern: click a header to sort, click again to reverse. IP addresses sort numerically; other columns use locale comparison. Signed-off-by: Paul Philippov paul@themactep.com
- feb3909 webui: show model, build, and streamer on Cameras on LAN page Advertise metadata in the _thingino._tcp service so discovered cameras are more than a name and an address. S50mdnsd now emits txt records carrying the image model (product=), the branch and commit hash from BUILD_ID (version=), and the streamer in use (streamer=), detected by binary presence rather than pidof since strero starts after mdnsd. json-cameras.cgi follows up the browse with a per-instance TXT query and merges the fields into its response; tool-cameras renders them as Model, Streamer, and Build columns. Signed-off-by: Paul Philippov paul@themactep.com
- 507683f webui: add Cameras on LAN discovery page List thingino cameras discovered on the local network via mDNS. The new x/json-cameras.cgi runs mquery -w 4 _thingino._tcp and returns deduplicated responders as JSON, filtering unsolicited announcements of other service types; the page renders them in a table with a link to each camera web UI and marks the local camera. Enable BR2_PACKAGE_MDNSD_MQUERY in core.fragment to ship the mquery client; mdnsd already advertises _thingino._tcp from S50mdnsd. Signed-off-by: Paul Philippov paul@themactep.com
- 6963f82 package/lightnvr: update to 0.41.4 Update lightnvr from 0.41.3 to 0.41.4 Hash change: 0.41.3 -> 0.41.4 (No changelog available)
- e2cd05d package/timps: tighten audio.talk_ws/backchannel sed to avoid dup match
- 5fbceea package/timps: bump to v1.9.7 (fixes BC_WS+no-TLS build error)
- 698081e package/timps: tri-state audio.talk_ws, BC_WS buildable without TLS Drop the TLS build dependency (default y only on TLS builds), document audio.talk_ws 0/1/2, and derive the /talk WebSocket scheme from the reported TLS state instead of hardcoding wss://. Preset stays 1.
- d08566d package/timps: auto-enable audio.backchannel/talk_ws when compiled in
- ca47d88 package/thingino-motors: update to 0475b71 Update thingino-motors from a143521 to 0475b71 Hash change: a14352177ce3d6af09adcf7966dd6376fb7283f0 -> 0475b7190da981870c1ea78c669734d9c87dc6dc Changelog: 0475b71: README: document the WebSocket PTZ control path
- 5a738bc package/lightnvr: update to 0.41.3 Update lightnvr from 0.41.1 to 0.41.3 Hash change: 0.41.1 -> 0.41.3 (No changelog available)
- f677340 wifi: add ATBM6132CU support for Shelly S1 Use the 606x-c driver with its Ingenic-specific ATBM6132CU config. The generic interval-completion mode associates and obtains DHCP on T23 but stalls normal traffic; the Ingenic config keeps TX completion interrupts enabled. Select the new package from the Shelly S1 profile and register the USB interface with the common Wi-Fi setup. Signed-off-by: Matt Davis matteius@gmail.com
- ebebb91 package/timps: default BC_WS to y once its dependencies are met
- 8e788bd package/timps: auto-enable http.https when TLS+WebUI-TLS are both built in
- 7274ecc agent-adapter: add gotify to send2 service lists gotify was wired into the motion scripts and webui but not the thingino-agent whitelists, so the agent rejected motion/outputs/send2/gotify and send2/services/gotify/* paths. Add gotify to agent_send2_service_supported and agent_print_send2_capabilities, and add an agent_send2_service_has_send_photo helper (gotify supports neither photo nor video) so send_photo capability is reported per service. Gate the send-photo settings paths the same way send-video already is, and persist motion.send2gotify in agent_apply_config. Signed-off-by: Paul Philippov paul@themactep.com
- 978f216 package/timps: fix stale hash for v1.9.6 tarball
- ee74214 send2pushover: whitelist in agent-adapters and cleanup Add pushover to the agent-adapter send2 service lists (prudynt-t and raptor) so the thingino-agent can enable and configure it, matching the motion-script and webui wiring. Also fix the mqtt.host indentation regression in send2.json, correct the -z help text (-2 is the lowest priority), switch the shebang to #!/bin/sh, and tighten the verbose-mode NOTE. Signed-off-by: Paul Philippov paul@themactep.com
- d690d49 package/thingino-motors: bump WS pin - fixes a crash and a DoS The version #1581 merged (a454107) has two bugs found in post-merge review, both fixed and live-verified since: an unhandled SIGPIPE that silently kills the daemon on any wss:// write to a peer that already reset the connection (trivially hit - a rejected self-signed cert is enough), and a handshake timeout that never actually enforced its 5s deadline (pre-auth slow-loris, 4 connections exhaust the listener). Pin now points at the fork commit with both fixes.
- cc6165e make ota: go easy on memory requirements
- 8fafbf5 cameras: add experimenal zintronic ikpw530tv profile
- 8534a51 package/timps: fix real Makefile bug - ifeq can't nest in a define body Split the WS-only lines into their own conditionally defined variable, referenced unconditionally - ifeq/endif can't appear inside a define...endef recipe body, it's shell text, not re-parsed as Make. Caught by a real cleanbuild; verified via printvars on the actual recipe text this time. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- fac5684 package/timps: restore WS-aware UI now that the fork is a real PR target Ships the full WebSocket client again - motorsWs flips true and the token CGI installs only when BR2_PACKAGE_THINGINO_MOTORS_WS is on. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- f18eb3a package/thingino-motors: don't pull the WS fork for a DW9714-only build WS is unavailable there anyway (Config.in's !DW9714_ONLY depends on), so a DW9714-only timps camera has nothing to gain from the fork. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 4b3cc24 Revert S59motor - was accidentally undoing Paul's own recent fix The -d/-p and invert_x/invert_y-note changes came from our own ciao, which predates 3654ae1 (Paul's own commit dropping -d because it flooded syslog) and an earlier invert restructure that removed the motors -I calls this note was warning about. Neither applies to upstream's current file; dropped both, S59motor now matches upstream exactly. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 9d4f317 package/thingino-motors: drop joystick/CSS/UI files, keep them timps-exclusive The improved joystick, sensitivity slider, and CGIs stay in package/timps's own overlay - a non-timps streamer now gets upstream's plain WWW files instead. Keeps just the WS daemon option/build and the one shellcheck fix. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- bc078d5 package/thingino-motors: WebSocket PTZ control path Optional low-latency control path (BR2_PACKAGE_THINGINO_MOTORS_WS, default on when timps is the streamer) alongside the existing CGI path, which stays fully functional as the automatic fallback. Also carries the joystick/sensitivity-slider WebUI work and a version badge, both already independent of the WS transport. The daemon source this pulls in when WS is enabled lives on a fork (https://github.com/Lu-Fi/thingino-motors, branch thingino-motors-websocket - a strict superset of this repo's upstream pin, verified via merge-base) rather than in this tree, so no daemon source is duplicated here - only the Buildroot package definition and the WebUI/CGI side. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 8aecd6f motors UI: keep WS mentions out of the CGI-only overlay The overlay copies still referenced the WebSocket daemon by name in comments (json-motor.cgi) and shipped a full WS client module (preview-motors.js) despite motorsWs staying false. Reworded/stripped to CGI-only, functionally unchanged. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- cd7185c Revert package/thingino-motors change, out of scope for this PR The shellcheck fix belongs to package/thingino-motors, not package/timps; splitting it into its own PR. The timps copy keeps the fix. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 00a62a0 motors: silence shellcheck SC2317 on the deliberate unreachable fallback json-motor.cgi's trailing json-motor-command-unhandled line is an intentional dead-code safety net (comment above it explains why); shellcheck's exit code doesn't distinguish info-level findings. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 6fba098 package/timps: sync package to current state (32 commits since last sync) Mirrors this fork's package/timps as of Lu-Fi/thingino-firmware@ciao, one commit instead of a 32-commit history replay (several were superseded in-branch, e.g. two tag corrections). Highlights: timps became a real WebUI plugin instead of forking core files (a8b6c2c); a symlink-traversal + CGI validation fix (e0d9b6f); the browser-mic talk feature and its WebUI button; several bugfixes (motion-grid toggle, privacy editor recovery, TLS cert default, DROP_LIBSTDCPP); the just-opened #1578 motors-UI overlay is included here too, since this supersedes it. Currently pinned to v1.9.6. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- c56104b linux 3.10.14: add BY25Q256 Boya Micro 32MB SPI NOR support (t31)
- 44f18c3 package/prudynt-t: update to 2d9bb99 Pins the stable branch to the MJPEG size/quality fixes (downscale via SetChnResizeMode, quality through encoder reconfig, width/height independence). Signed-off-by: Paul Philippov paul@themactep.com
- 1b82203 webui: request canvas-sized MJPEG preview preview.js streams full sensor resolution (2304x1296, ~100KB/frame) regardless of how small the preview element is, wasting bandwidth and CPU on the encoder. Request the stream at the on-screen preview width with q=60 and let the daemon derive the height from the source aspect ratio. The ch0/ch1/video MJPEG CGIs now forward -w and -h independently so a width-only request reaches prudyntctl. Signed-off-by: Paul Philippov paul@themactep.com
- b75b92c package/openimp: update to 1374dc4 Update openimp from e700f22 to 1374dc4 Hash change: e700f22b910b14e6eeef08f0839beeacc586664e -> 1374dc42660d3bdaa973d7e5ea288cfcd9ef9412 Changelog: bb85b6d: t31: stabilize Prudynt capture and encoder handoff e213d49: encoder: produce real JPEG preview frames 1374dc4: t31: attest CPU-owned encoder streams
- 2478cef package/open-tx-isp: update to a8e27d5 Update open-tx-isp from 9dc37f0 to a8e27d5 Hash change: 9dc37f038072e34613cc79700bc8b28d62d26c24 -> a8e27d5b57b111db19a1db3cf0b7eb413d98241b Changelog: d7dc437: t20: own repaired ISP and capture path a74c7b4: docs: record full-resolution T20 RTSP gate 6660f74: t20: enforce one repaired core layout 7078b10: t31: reject frame DMA outside physical DDR 8d2c3ae: t20: restore audit-visible firmware paths a8e27d5: t10: integrate recovered ISP baseline
- 78ce79b package/lightnvr: update to 0.41.1 Update lightnvr from 0.41.0 to 0.41.1 Hash change: 0.41.0 -> 0.41.1 (No changelog available)
- 3654ae1 thingino-motors: start motors-daemon without debug logging S59motor passed -d, the legacy alias for -D, which enables LOG_DEBUG output to syslog. That flooded logread with per-connection accept, cleanup, and speed messages. Drop -d and keep the default LOG_INFO logmask; -p (skip reset) is unchanged. Signed-off-by: Paul Philippov paul@themactep.com
- 4b7d306 uboot: pylibfdt: Fix Python 3 API usage
- 5bb70f0 uboot: extend NetConsole to USB-Ethernet (OTG) boards NetConsole already works over the on-chip MAC on wired boards. Boards with no wired Ethernet but a USB OTG data port can reach the network over a USB-Ethernet dongle instead, and the 2013.07 U-Boot already has everything needed for it: isvp_common.h builds the DWC2 host controller and the ASIX host-Ethernet drivers on every board but T31LC, and board_usb_init() puts the OTG in host mode. So this is a build-integration change only, with no U-Boot patch: - The opt-in symbol now depends on wired Ethernet OR a USB OTG data port (BR2_PACKAGE_THINGINO_KOPT_DWC2_OTG), so USB-only cameras can select it. - thingino-uboot.mk marks such boards (no BR2_ETHERNET, but OTG) with THINGINO_UBOOT_NETCONSOLE_USB and injects a preboot that brings the bus up and selects the dongle before redirecting the console: preboot=usb start;setenv ethact ${nc_ethact};setenv stdout serial,nc;... nc_ethact=asx0 usb start enumerates the dongle and registers it as an Ethernet device; ethact makes it active, because the on-chip MAC is still registered as device 0 and would otherwise take the traffic. nc_ethact defaults to asx0 (ASIX AX88772); an AX88179 is axg0. Verified end to end on a Wyze Cam v3 (wyze_cam3_t31x_gc2053_rtl8189ftv: T31X, WiFi + OTG, no wired Ethernet, no serial header) with an ASIX AX88772C dongle: Ctrl-C over UDP interrupts autoboot into an interactive prompt, commands execute with output returning over UDP, and
printenv ethactreports asx0 -- the dongle, not the on-chip MAC. Because usb start runs inside preboot, enumeration and link-up complete before the countdown starts, so bootdelay needs no extra margin for USB: across 18 reboots the prompt was caught on every attempt at bootdelay 2, 3 and 4, and on 5 of 6 at bootdelay 1. The injected default stays at 5, which also covers a cold power-up (those runs were warm reboots). Wired boards are unchanged: with BR2_ETHERNET set, THINGINO_UBOOT_NETCONSOLE_USB stays unset and the wired preboot is injected as before, which a rebuild of a wired camera confirms. - 3810144 buildroot: patch host-bison for gcc16.2
- 957aec2 thingino-diag: redact sensitive fields in thingino.json dump The diagnostics report dumped /etc/thingino.json verbatim, leaking credentials, PII, MAC addresses, and internal network details. Pipe the dump through a redact_json filter that masks sensitive values by exact quoted key name, leaving non-sensitive configuration intact. Signed-off-by: Paul Philippov paul@themactep.com
- d6634af Remove duplicate dhcp-v6-enabled line from thingino-kopt thingino-ethernet already appends dhcp-v6-enabled true to /etc/network/interfaces.d/eth0 when IPv6 is enabled. The copy in thingino-kopt used >> against a file that only thingino-ethernet creates, which failed in the isolated per-package staging dir. Signed-off-by: Paul Philippov paul@themactep.com
- 9333a82 Update buildroot to latest version
- e93b9b1 package/timps: update to v1.9.5 Update timps from v1.9.3 to v1.9.5 Hash change: v1.9.3 -> v1.9.5 (No changelog available)
- e11e11b package/thingino-raptor-hal: update to 43dfb8d Update thingino-raptor-hal from f3b8baa to 43dfb8d Hash change: f3b8baa90551667c8b15d52f9541475d562040c4 -> 43dfb8d644133e2ce7c457cea585669e10eb3a5d Changelog: 250577b: encoder: let CBR reach its target, default min QP 34 -> 15 375e03e: hal: select the pipeline backend at creation 2d584e1: hal: support deferred V4L2 bitrate updates 780837c: hal: support deferred V4L2 GOP updates 9d3f943: hal: mount the deferred V4L2 controls in the backend table 558fd61: hal: v4l2 backend reports its own media clock 8d8fa94: isp: report exposure field validity 43dfb8d: hal: harden legacy V4L2 buffer handoff
- 33041a4 package/thingino-raptor: update to a6faf5c Update thingino-raptor from 9b921cb to a6faf5c Hash change: 9b921cb254f08d4783457b1191001fd08f5921c6 -> a6faf5cc93a90034ae65dfb6e5348bbb19913f2e Changelog: ef6feff: rvd: declare full-range video in the SPS VUI at frame fetch e716895: rvd: fall back to a single DMA buffer when a stream never produces 87b6ee5: config: say what min_qp/max_qp -1 actually selects ee135e7: rvd: declare the BT.601 matrix in the SPS VUI 029c946: rsd-555: size OutPacketBuffer from the ring frame bound c6a33db: rsd-555: per-media sink buffers, log uncaught exceptions da67ebc: rmr: declare the playback grid step in timelapse fragments 5e21463: tests: pair the timelapse DTS grid with mux durations b39fcd9: rvd: stamp the encoder frame counter into the rings de0978f: rvd: drive the V4L2 path through the HAL backend table 71f2b0f: rvd: apply the [image] ISP defaults on the v4l2 path too 02f647d: ric: load IR-cut pulse timing from device metadata d9360f8: ric: stabilize night detection and probe behavior cd07d0a: ric: complete the night-detection landing 94d6e95: build: relink rvd when HAL inputs change 4642051: rvd: select T20 V4L2 node by stream geometry a6faf5c: ric: raise the default IR-cut pulse to 100ms
- d3a64fa package/openimp: update to e700f22 Update openimp from fc1bf00 to e700f22 Hash change: fc1bf00c002c83b2e611ca987aa8dcf909fd00c4 -> e700f22b910b14e6eeef08f0839beeacc586664e Changelog: ace751e: dma: fail closed on invalid physical allocations 0c62c74: encoder: ignore quiet first-GOP rate-control transients e700f22: t20: add OpenIMP ISP capture and AVC support
- 472b731 package/open-tx-isp: update to 9dc37f0 Update open-tx-isp from 4ebcc41 to 9dc37f0 Hash change: 4ebcc41c4ab95adf8dfa127f4ae4892b143ccb34 -> 9dc37f038072e34613cc79700bc8b28d62d26c24 Changelog: 35f09d7: driver: integrate recovered T20 ISP caf18db: t31: synchronize frame buffer metadata lifetime 4e67fbb: t31: reuse V4L2 capture buffers across restarts e028fd5: t31: preserve rational sensor frame rates 7fe9a15: t20: complete device-tested ISP pipeline 9dc37f0: docs: record T20 three-path device validation
- f6fd8cb package/lightnvr: update to 0.41.0 Update lightnvr from 0.40.1 to 0.41.0 Hash change: 0.40.1 -> 0.41.0 (No changelog available)
- 74e782b uboot: move the env partition offset to match 320k uboot partition size
- dbdd790 sysupgrade: run full flash detached in stage 2 The full-upgrade partition loop ran in the foreground over SSH from the live rootfs. Once the rootfs partition was flashed, the shell and sshd backing the session were running from a dead filesystem, so the SSH session dropped mid-flash and fw_ota.sh reported a false failure. Route full upgrades through sysupgrade-stage2 with a new full mode. Stage 2 detaches, runs from tmpfs, feeds the watchdog, logs to /tmp/sysupgrade-flash.log, and prints the 'Flash process running with PID' sentinel so fw_ota.sh switches to its reboot-wait path. Add wc to the tmpfs applet set used by stage 2. Signed-off-by: Paul Philippov paul@themactep.com
- 57f1e97 uboot: suppress bogus 16MiB warning for 4-byte-addressed NOR The Ingenic SFC NOR driver accesses chips larger than 16MiB natively by entering 4-byte address mode (EN4B/EX4B) and setting addr_size to 4. The generic spi_flash_probe warning only knows about CONFIG_SPI_FLASH_BAR, so it wrongly reports the upper half as unreachable. Only warn when the descriptor does not advertise 4-byte addressing. Signed-off-by: Paul Philippov paul@themactep.com
- c2c8a05 uboot: inject ipaddr for NetConsole (fix regression) NetConsole needs a non-zero ipaddr or NetLoop refuses the protocol. An earlier change dropped the injected ipaddr= line on the grounds that isvp_common.h already defines CONFIG_IPADDR, which env_default.h emits into the default environment -- but that only covers a blank or CRC-invalid saved environment. A normally flashed camera has a valid saved environment (the env partition, built from uenv.txt), and U-Boot replaces the default env with it wholesale; a variable absent from the saved env is not filled in from CONFIG_IPADDR. So a full-image flash left ipaddr unset and NetConsole broke: the boot log floods "*** ERROR: 'ipaddr' not set" and input over UDP never works. Re-inject ipaddr into uenv.txt alongside preboot and bootdelay, only when netconsole is enabled and only when not already set by a camera or user uenv file. CONFIG_IPADDR stays as the blank-env fallback. Reproduced and fixed on a vanhua_fjz_t31x_gc4653_eth: after a full flash
fw_printenv ipaddrreported "not defined" and netconsole could not be interrupted; with ipaddr set, Ctrl-C over UDP reaches the prompt and commands run. The build now injects it, so a fresh flash works out of the box. - 11ac623 package/thingino-system: move usr/sbin scripts out of overlay blink, gpio, led, lssdio, send2termbin, service, timectl, and tzselect were shipped via the global rootfs overlay. Install them from thingino-system instead, where the rest of the system utilities live. Signed-off-by: Paul Philippov paul@themactep.com
- 8415059 package/prudynt-t: clamp T31 nrVBs=1 when pre-dequeue is enabled Update to 6ade254 and pass -DISP_CH0_PRE_DEQUEUE_TIME through to the build. tx-isp forces a single-buffer schedule on the non-scaled physical channel when isp_ch0_pre_dequeue_time is configured; requesting 2+ buffers then makes the driver reject the schedule and dump the stack ("one buffer schedule only support nrvbs = 1"). 6ade254 clamps the non-scaled channel's auto buffer count to nrVBs=1 at init when the flag is set, so the rejection never happens. The package now exposes BR2_ISP_CH0_PRE_DEQUEUE_TIME(_VALUE) as that define. Hash change: b609f309426bf6447b4f965825d5125d178a70a6 -> 6ade2540e3e8e0871837fa89a2ddec09d50cbdbb Signed-off-by: Paul Philippov paul@themactep.com
- 94867f9 linux: per-device dts from the camera profile dir A single .dts next to the defconfig replaces the family's stock kernel tree (shark/marmot/goat/tucana), copied by the kopt extension before every kernel build. Replaces the Kconfig choice menu, whose first entry was silently selected when no board was picked, and the extraction-time install that leaked deselected trees. After changing a profile dts, br-linux-rebuild picks it up.
- b7f73d7 wyze-accessory: fix the doorbell button chime path 387e6aa renamed the sound files from th-* to *, but 3ad2abe had re-imported this rule into wyze-accessory 26 days earlier and the rename missed it, so the button has been playing a file that does not exist.
- 3907ccb Increase SFC NOR boot partition from 256K to 320K Align with the master branch layout. Bump U_BOOT_SIZE_KB and every hardcoded dependency on the old 256K boot region: U-Boot env offset (CONFIG_ENV_OFFSET), fw_ota.sh boot pad, sysupgrade range download, the OTA test fixtures, and the stitcher's U-Boot size guard. Drop the dead overlay-wipe sed in thingino-uboot.mk whose 0x40000 erase was leftover cruft (the placeholder it expands no longer exists). Signed-off-by: Paul Philippov paul@themactep.com
- 9c198c5 uhttpd: anchor pgrep/pkill matches busybox pgrep matches an unanchored regex against comm, and this script's own comm S60uhttpd contains uhttpd: stop() killed the restart invocation itself before start() ran, and every liveness pgrep was vacuously true.
- 5b7ad0e Makefile: drop duplicate build time report Revert ea90114. pack already prints build duration via save_partition_info.py in $(CAMERA).md. Keeps GREEN and THINGINO_BUILD_START_EPOCH, still used elsewhere.
- 91ac831 add experimental profile for wyze v3 with external rt5370 usb wifi dongle
- 1dd3908 add Shelly S1 config to experimental
- 0279fd7 configs: sort defconfig entries
- 6ec1dcf z55: repin AVPU clock to 600 MHz on MPLL The z55 defconfig selects BR2_AVPU_CLK_486MHZ with VPLL as parent, copied from stock firmware parameters (869657a). 486 MHz cannot be synthesized from any programmed T31X PLL by integer division, and the AVPU_CLK map in thingino.mk has no 486 entry, so no avpu_clk= parameter is emitted at all: the driver falls back to its 550 MHz default, which VPLL cannot produce either, and the AVPU silently runs at 400 MHz (VPLL/3). At 400 MHz the z55 barely sustains H.265 25fps with 3 video buffers, high CPU usage and occasional dropped frames. Repin to 600 MHz with MPLL parent (exact MPLL/2 on T31X). Device-tested: sustains H.265 30fps (sensor rate) with 2 buffers, no dropped frames. Note: this overlaps the broader clock audit finding that 486 MHz is unresolvable in thingino.mk for all boards selecting it; the systemic map fix is tracked separately. Tested-by: Nic 1407719539633946778+nic@users.noreply.github.com
- 9831db0 network: install ifplugd scripts only on pluggable-ethernet devices The overlay shipped S41ifplugd and ifplugd.action to every image, so WiFi-only cameras carried a dead init script, and buildroot's busybox still installed its own long-option S41ifplugd underneath (broken with CONFIG_LONG_OPTS off). Override BUSYBOX_INSTALL_IFPLUGD_SCRIPT to install thingino's short-option init script plus the missing action script, gated on CONFIG_IFPLUGD. thingino-ethernet (wired) and usbnet (USB dongle) enable that option, so the scripts only land on pluggable-ethernet devices. Signed-off-by: Paul Philippov paul@themactep.com
- 02b5c22 network: keep dhcp-v6-enabled tied to the IPv6 option The rootfs overlay ships interfaces.d/eth0 to every build, so carrying dhcp-v6-enabled there turns IPv6 DHCP on even where BR2_PACKAGE_THINGINO_KOPT_IPV6 is disabled and odhcp6c is absent. Move eth0 out of the overlay. thingino-ethernet installs it on wired cameras and usbnet installs it alongside usb0 for USB adapters that present as eth0; each appends the flag only when the IPv6 option is set. Signed-off-by: Paul Philippov paul@themactep.com
- 5fcfc28 package/openimp: update to fc1bf00 Update openimp from 36c1e8e to fc1bf00 Hash change: 36c1e8e5b7b5d7a96ed8e231055b4e2a83aa60b3 -> fc1bf00c002c83b2e611ca987aa8dcf909fd00c4 Changelog: 8003957: t30: import ISP capture DMA buffers 7301f91: t30: build the OpenIMP tuning daemon 216e7fc: t21: add open ISP and Helix encoder support 86f97cc: Merge remote-tracking branch 'origin/main' into feat/t30-v4l2 9dcf8ea: t30: preserve AVC capture timestamps 61c57f7: encoder: stabilize native rate control fc1bf00: t21: complete native V4L2 H.264 path
- 783726f package/open-tx-isp: update to 4ebcc41 Update open-tx-isp from 77b1794 to 4ebcc41 Hash change: 77b179445ffc3231870f33c82b3ddeb9387b1981 -> 4ebcc41c4ab95adf8dfa127f4ae4892b143ccb34 Changelog: ae0c772: t30: add public V4L2 DMA-BUF capture eabd151: t30: make ISP module teardown safe 904c0a3: t21: bound 3dns tuning interpolation 344d4a0: t30: use stable owners during child teardown 0f442a2: t31: preserve child platform driver ownership f53cfc9: t30: prevent firmware state corruption across reloads 8c305fc: Merge remote-tracking branch 'origin/main' into feat/t30-v4l2 89e1563: t30: stabilize calibration-driven AWB 457b3e1: t30: wake APICAL worker during teardown fdd7ef2: t30: address AWB gains by APICAL color channel c78a43b: t30: restore frame-end noise reduction pipeline 6849618: t30: publish compact AE gain state a373ff7: t30: restore tuning-driven ISP digital gain bca0fcb: t30: report complete NV12 frame size 5aa3428: t30: restore calibration-driven AE and AWB state flow 1a9f2ed: t30: fix CMOS frame gain reconstruction 41a6b58: t31: restore fast cold-start AE convergence 4ebcc41: t21: add generic V4L2 capture pipeline
- deb302c package/thingino-raptor-ipc: update to c9b0ee5 Update thingino-raptor-ipc from dd67187 to c9b0ee5 Hash change: dd6718708b75b52af87dfe543685e21788226e6e -> c9b0ee500fc2621e8f11d25f770bc45ee88825ca Changelog: c9b0ee5: ring: invalidate slots the arena reservation overwrites
- dbb4ae2 package/thingino-raptor-common: update to 32bdd0d Update thingino-raptor-common from f1c01d3 to 32bdd0d Hash change: f1c01d317969ce9247bbf215678985d338a48f15 -> 32bdd0d5346700c40c10fe4b5a2d3379b8861548 Changelog: dd361a3: tests: follow the section-less set refusal 32bdd0d: media clock: adopt the producer-to-monotonic tracker from rsd
- da5b93d package/thingino-raptor: update to 9b921cb Update thingino-raptor from 1780490 to 9b921cb Hash change: 17804903e1414d426802df0967b3bdbd72219f58 -> 9b921cb254f08d4783457b1191001fd08f5921c6 Changelog: dfcdd46: fix(rsd): anchor video RTCP to media clock 631116d: style: format RTCP media clock changes 3bcfc92: fix(rsd): track video media clock continuously f518705: Merge PR #32 media clock foundation d35ac3d: fix(rwd): anchor video RTCP to media clock 7d613fe: fix(rwd): drain queued video frames before waiting 287e210: rwd: preserve video across UDP backpressure f751fc4: test(rwd): cover send-queue recovery c7e2f91: style(rwd): apply project formatting 3f30cc9: fix(rwd): pace WebRTC video bursts 38c89d4: test(rwd): link send queue and pacer in sanitizer build 37a5217: rwd: report per-client delivery timing 70e0331: rwd: honor RTCP keyframe feedback 0a69dec: style(rwd): format delivery statistics 7e4128c: rod: clamp an OSD region to the frame it goes on bfc5e61: rhd: reopen a JPEG ring whose producer has been replaced 711bc2a: rhd: take back the slot from a client that never asks for anything 05b3899: rvd: round a bad ring slot count instead of dying on it 93596b4: build-asan: compile rwd_sendq.c and pin faac to 2.1 38dc42c: mock_hal: stamp video frames from the media clock 694f24b: Merge PR #32: anchor video RTCP to the media clock 56a8057: rsd: estimate the media clock from the median of per-second minima dfe4733: Merge PR #34: preserve WebRTC video under backpressure 25ce9f9: Merge PR #35: pace WebRTC video and recover cleanly aa42adf: rwd: a client that stopped sending is not a failed send 6eb5243: rsd: count natural keyframes against the recovery-IDR throttle c8c60ab: rwd: anchor the audio sender report to capture time 73b86f0: rsd, rwd: take the media clock from raptor-common b53da79: rsd-555: declare the configured bitrate in b=AS 8a4de78: rsd: refuse RTSP JPEG endpoints wider than RFC 2435 can carry 493fa2d: rsp, rwc: honor the peek_done overflow verdict 1e2175c: rsd-555: widen the RTP send buffer for keyframe fanout 1a17f8a: rhd: read the newest frame after jpeg ring overflow 7cf3639: rmr: keep the 16.16 sample_rate shift out of int UB 4606dae: Merge PR #40: clamp an OSD region to the frame it goes on c4809ed: Merge PR #41: reopen a JPEG ring whose producer has been replaced fb0a4eb: Merge PR #44: take back the slot from a client that never asks for anything b3aef45: Merge PR #45: round a bad ring slot count instead of dying on it d139a34: rvd: stop sizing every ring for an all-intra stream 9b921cb: Merge PR #49: stop sizing every ring for an all-intra stream
- 27b3f88 kopt: add SLUB allocator debugging
- 59a729d package/openimp: update to 36c1e8e Update openimp from a00a04f to 36c1e8e Hash change: a00a04f1b0085be5a41bd7f7123a86a8c5607f9a -> 36c1e8e5b7b5d7a96ed8e231055b4e2a83aa60b3 Changelog: f7e3911: t30: add native source-only Helix H.264 path a6e81cd: t30: add native P-picture GOP encoding 832fadb: docs: record sustained T30 encoder gate 36c1e8e: docs: describe open T30 persistent stack
- 73516d1 package/open-tx-isp: update to 77b1794 Update open-tx-isp from 03ddaf3 to 77b1794 Hash change: 03ddaf34520e72186e2fa24697e3aff8d14ff2eb -> 77b179445ffc3231870f33c82b3ddeb9387b1981 Changelog: 2b2bda5: t31: derive ISP configuration from sensor attributes 7cb04ef: t30: restore tuning-driven color matrix path 1b2bf92: t30: apply tuning-driven AE target correction 7b9cdc0: t30: restore balanced exposure partitioning b002034: t31: preserve calibrated AE scene defaults 8560237: t30: restore userspace anti-flicker exposure control 4b97ad9: docs: define ISP control architecture across SoCs b7c16f0: t21: recover streaming and generic sensor control path af69b0a: t21: restore tuning-driven image pipeline 834d1c1: t21: restore tuning-driven AWB color temperature 764d609: t21: restore tuning-driven AWB detector e4ef590: t21: restore tuning-driven AE statistics 3eecde0: t21: keep AWB smoothing corrections signed 478ed84: t21: decode DMSC tuning tables as words 4967803: t21: restore tuning-driven AE and DPC controls a2222d0: t21: restore tuning-driven MDNS pipeline 62fcf93: t21: restore tuning-driven ADR processing ccb65f6: t21: restore histogram-driven ADR curves 9bee325: t21: restore spatial ADR map weighting 77b1794: t21: restore generic AE gain allocation
- fb506a1 package/lightnvr: update to 0.40.1 Update lightnvr from 0.39.1 to 0.40.1 Hash change: 0.39.1 -> 0.40.1 (No changelog available)
- 6cfb685 package/libsrt: update to v1.5.7 Update libsrt from v1.5.6 to v1.5.7 Hash change: v1.5.6 -> v1.5.7 (No changelog available)
- ca52173 package/thingino-dfu: update to v1.5.43 Update thingino-dfu from v1.5.41 to v1.5.43 Hash change: v1.5.41 -> v1.5.43 (No changelog available)
- 1f5895a package/open-tx-isp: update to 03ddaf3 Update open-tx-isp from 99b1141 to 03ddaf3 Hash change: 99b11416dcfac34a0a2f073836202ffa514d7c91 -> 03ddaf34520e72186e2fa24697e3aff8d14ff2eb Changelog: d777543: t30: repair recovered ISP topology and activation paths e512f24: t30: repair frame source and sensor ioctl paths 7a7018e: t21: integrate recovered ISP driver baseline 062f8a8: t21: repair ISP core initialization fdb63c2: t30: restore sensor sync and CSI device ABI 015aefd: t21: restore video link setup ioctl 187e2ab: t21: restore ISP core activation walk 7ae0c4b: t21: rebuild VIC start register programming c876daf: t21: repair probe graph and teardown paths 3fd96e2: t21: repair frame source channel setup 00a20e2: t30: restore ISP firmware initialization state f116615: t30: repair CMOS exposure and crop update paths 2bd9eba: t21: restore platform binding graph 1339f34: t21: share sensor registry implementation 7493e6f: t30: restore end-to-end ISP streaming pipeline 03ddaf3: t30: drive recovery 3A from sensor calibration
- a36183e docs: add netconsole.md Quick start (broadcast client, ncb), what the 0006 patch enables and why, the shipped defaults and what happens without them, how to read the resolved-link line, troubleshooting -- including the switch-side unicast FDB failure mode where input to the board's IP goes deaf while broadcast keeps working, with remedies in order: broadcast input, a static FDB entry on the switch, a freshly started arping -- and the flashing notes that keep the environment partition intact.
- 216f940 uboot: add opt-in NetConsole for the 2013.07 tree The driver and all its hooks are already in the 2013.07 tree; what is missing is configuration. This adds a NetConsole (U-Boot console over UDP) build option so a camera with no serial port can be driven over the network, off by default and opt-in per camera. New user-visible symbol BR2_PACKAGE_THINGINO_UBOOT_NETCONSOLE (default n, depends on wired Ethernet and the 2013.07 U-Boot). A camera enables it with one defconfig line; nothing turns on without asking. When set, thingino-uboot.mk passes CONFIG_NETCONSOLE=y to the U-Boot build -- y, not 1, because drivers/net/Makefile selects the object with COBJS-$(CONFIG_NETCONSOLE) and a command-line value overrides autoconf.mk. Patch 0006 makes isvp_common.h configure the feature, all guarded by CONFIG_NETCONSOLE (which is never defined in the header -- it arrives from the build, bridged to the preprocessor in config.mk like CONFIG_SPI_FLASH_BAR and CONFIG_BOOTARGS_EXTERNAL): CONFIG_CONSOLE_MUX device lists, so serial stays alongside nc rather than being replaced, and stdin=serial,nc cannot hang on a dead network CONFIG_PREBOOT empty by default; preboot runs before the autoboot abort window, the only point early enough to redirect the console and still interrupt boot When enabled, thingino-uboot.mk injects the environment that makes it usable into the generated uenv.txt, only where a variable is not already set by a camera or user uenv file: preboot=setenv stdout serial,nc;setenv stderr serial,nc;setenv stdin serial,nc bootdelay=5 bootdelay 5 is verified sufficient to interrupt autoboot from a cold power-up; the stock 1s window closes before the link is usable. ipaddr is not injected: isvp_common.h already defines CONFIG_IPADDR 192.168.1.10, which env_default.h emits into the default environment. Because both effects are gated by the 2013.07-only symbol, other U-Boot versions are untouched: a 2026.07 build never gets CONFIG_NETCONSOLE=y or the injected environment (2026.07 enables netconsole through Kconfig separately), and wifi-only boards keep the stock 1s bootdelay. SECURITY: with ncip unset the board accepts console input from any host on the subnet (netconsole's broadcast mode: nc_input_packet accepts when is_broadcast(nc_ip)), so during the boot window anyone on the segment can interrupt autoboot and reach an unauthenticated U-Boot prompt. This is inherent to netconsole; the symbol's help and docs/netconsole.md say so, and a single client can be pinned with fw_setenv ncip . Opt-in keeps the exposure to boards a user deliberately enabled. Verified end to end on a vanhua_fjz_t31x_gc4653_eth with no serial port: Ctrl-C over UDP into an interactive prompt, commands executing with output returning over UDP. Costs a few KB in the boot partition; the partition layout is unchanged.
- e9e0dc4 uboot: fix the jz4775 ethernet driver Four patches against the 2013.07 tree, found by bringing netconsole up on an isvp_t31x board but independent of it -- they repair the driver for any network use in U-Boot. 0007 fixes the transmit and receive paths: a dozen defects including a zero-valued mask that could never select 10Mb/s, unaligned DMA descriptors sharing cache lines with data written through the cached alias, an untrackable four-deep transmit ring collapsed to a single descriptor, a transmit FIFO nobody ever flushed so the first send after every init jammed, latched CSR5 status never cleared so suspended engines ignored poll demands in both directions, a receive descriptor leaked on short frames, halt enabling the transmitter it meant to disable, and console output emitted from inside the init of the very interface carrying it. 0008 resolves link speed from the autonegotiation result (ANAR & ANLPAR) instead of a vendor status register that reads a constant on the fitted PHY, tests the real link bit instead of Extended Capability, and restarts autonegotiation only when the link is not already up and settled. 0009 releases the interface when NetLoop fails, as the success path already does; leaving it ETH_STATE_ACTIVE silenced netconsole input for good. 0010 reports the resolved link with the advertisement words behind it (adv/partner/common) and demotes the misleading BMCR readback line. All verified on a vanhua_fjz_t31x_gc4653_eth at 10 and 100Mb/s.
- ea6732a send2pushover: address review feedback (PR #1529) - rebase onto current master (db8cd52); keep Paul f6311f4 motor-active guards in all three motion bridges alongside pushover service entry - clamp priority to supported range: emergency (2) requires mandatory retry/expire params we never send, so 2 maps to 1 and out-of-range values map to 0/1; help text no longer advertises emergency - guard Pushover 2.5 MB attachment limit before upload; skip with clear error instead of generic API failure - add header note documenting verbose-mode credential exposure (pre-existing toolkit-wide, both Pushover creds travel in the multipart body) Nits: explain send_video=false persistence in tool-send2-pushover.js; move pushover block after ntfy in send2.json
- 107fc47 soc: add missing SoC IDs T32: add 11 TYPE1 variants (t32n, t32xq, t32l, t32a, t32zl, t32zx, t32zn, t32nn, t32zm, t32al, t32zc) extracted from the T32 2.1.0.0 vendor libimp library T33: add variant byte 0x11 as t33lq. T30: add TYPE1 0x6666 as t30zx, present in T30's own libimp 1.0.5. T40: document TYPE2 0x4444 overlap with t41a as comment. QEMU: fix duplicate/unreachable sentinel IDs. T4x, A1, and T33 QEMU targets use sentinels in their own detection branches (TYPE2 for T4x/A1, variant byte for T33) since their cpuid values never reach the else branch. Add qemu-t41 with TYPE2 0xEE01. Remove qemu-c100 (C100 is T31A silicon, no distinct chip ID exists).
- e6f2704 motors: require a modifier for keyboard PTZ on the preview page Keyboard jog on the preview page intercepted arrow keys unconditionally, hijacking normal browser scrolling. Only jog when a modifier (Shift/Ctrl/Alt/Meta) is held; plain arrow presses are left to the browser. Signed-off-by: Paul Philippov paul@themactep.com motors: use Shift only as the keyboard PTZ modifier Ctrl/Alt/Meta have OS and browser meanings of their own (window and history navigation); intercepting them was wrong. Restrict keyboard jog to Shift+arrow. Signed-off-by: Paul Philippov paul@themactep.com motors: make Shift+arrow a single step, not hold-repeat Gating keyboard PTZ behind Shift accidentally routed it through the continuous-hold path, so one press fired an immediate move plus a 60ms repeat timer (a ~120ms tap produced three identical requests). Restore the original Shift semantics: one discrete step per press, with browser auto-repeat ignored. Signed-off-by: Paul Philippov paul@themactep.com
- db81af8 wyze_campan1: fix reversed tilt motor pin order Tilt moved up when commanded down. The GPIO sequence in motors.gpio_tilt was backwards for the stepper phase order, reversing rotation. Reverse the pin order so tilt follows the commanded direction. Signed-off-by: Paul Philippov paul@themactep.com wyze_campan1: fix reversed tilt motor pin order (jxf23 variant) Same motor board as the jxf22/rtl8189etv variant; tilt moved up when commanded down. Reverse motors.gpio_tilt so tilt follows the commanded direction. Signed-off-by: Paul Philippov paul@themactep.com
- d6222f3 thingino-ha: route discovery clears through the persistent publisher ha_clear_disc was the last discovery-path publish that still forked a direct mosquitto_pub (empty retained message, -n). Every disabled entity cost one extra broker connection per discovery run, which the persistent ha-mqtt-pubd daemon exists to avoid. Queue an empty payload file through _ha_queue_or_pub like ha_pub_disc, so the clear goes out over the daemon's single long-lived connection and is rate-limited by ha_pub_flush like every other discovery message. The daemon already handles zero-length payloads (mosquitto_publish with payloadlen 0), which removes the entity from Home Assistant. Signed-off-by: Paul Philippov paul@themactep.com
- daa1928 thingino-ha: publish state/discovery over a persistent MQTT connection ha-common's publish path forked a fresh mosquitto_pub per message. Each invocation paid fork + exec + TCP connect + CONNECT + PUBLISH + teardown, so a poll cycle that changed several entities opened several broker connections. On a single-core camera that is scheduler and airtime churn every state_interval seconds. Add ha-mqtt-pubd, a small libmosquitto daemon that holds one broker connection and publishes messages for the HA scripts. It reads lines from /run/ha/mqtt-pub.fifo, publishes the file contents, and unlinks the file afterwards so /tmp is never left accumulating stale payloads. Broker settings are taken from the HA_MQTT_* environment already exported by ha-common, so no shell quoting is involved. ha-daemon creates the FIFO and supervises the daemon with an escalating restart loop; cleanup and S93ha stop now kill it. _ha_pub_exec feeds the FIFO instead of forking mosquitto_pub. Rare one-off publishes (availability online/offline, discovery clearing) still use mosquitto_pub directly and are unchanged. The daemon links against libmosquitto, already provided by thingino-mosquitto-20x, which is now a build dependency. Signed-off-by: Paul Philippov paul@themactep.com
- f054148 overlay: keep local syslog ring buffer when remote logging is on S01syslogd added -R host:port without -L, and busybox syslogd defaults to network-only output when -R is given. That silently dropped the local -C64 ring buffer (logread) whenever remote logging was enabled, so a camera lost all on-device logs the moment it pointed at a remote collector. Append -L alongside -R so logs always stay in the local ring buffer as well as being shipped over the network. Logging stays opt-in via rsyslog.enabled; this only changes what happens once it is turned on. Signed-off-by: Paul Philippov paul@themactep.com
- 4f5acda thingino-ha: default state poll slower and live-view image off Two defaults were the most expensive periodic work in the HA daemon on small single-core SoCs: - state_interval 15s made ha-state fork a tree of helpers (prudyntctl, awk, grep, jct, mktemp) four times a minute to poll entities that mostly never change. Bump to 30s; values are still picked up within half a minute, at half the fork/VM churn. - enable_live_view true ran the snapshot publisher loop every camera_interval (60s): prudyntctl snapshot + shell base64 + a full JPEG over MQTT, purely so HA can show a preview image. Most deployments never use that entity. Default it off; users who want the preview re-enable it. Both remain user-configurable under the ha section of thingino.json. Signed-off-by: Paul Philippov paul@themactep.com
- a1d6c8d system: drop sync from the SD card automount automount mounted removable media with -o noatime,sync. The sync option forces every write to flush to the card before the write() returns, so any sustained writer (recording to the vfat data partition) stalls synchronously on every block. On a slow card that becomes a steady source of periodic D-state stalls and, on single-core cameras, visible response latency. Mount async instead. The two flows that genuinely need durability already sync explicitly: the .diag diagnostic flow calls sync before unmounting, and the recorder owns its own buffering. vfat writeback can be further bounded with commit= if desired, but plain async matches normal removable media expectations. Signed-off-by: Paul Philippov paul@themactep.com
- d899321 overlay: mount NFS shares soft instead of hard S43mounts mounted the configured NFS share with only nolock, which defaults to a hard mount. With hard, any access against a stalled or unreachable server parks the calling process in uninterruptible D state indefinitely; D-state tasks inflate the load average even though they burn no CPU. On single-core cameras this showed up as periodic load spikes and sluggish responses whenever the NFS server was slow. Switch to soft with bounded retry: soft makes failed RPCs return EIO instead of hanging, timeo=30 shortens the default 600 s retry window, and retrans=2 caps the per-request retries. A dev/optional mount should fail fast and let the caller decide, not wedge the whole system. Signed-off-by: Paul Philippov paul@themactep.com
- da78942 board: drop DYNAMIC_DEBUG from the 3.10 and 4.4 base configs KOPT_DEVELOP already turns it back on for developers, nothing in the tree reads dynamic_debug/control, and four of the configs had it off already. Worth 36,213 bytes on the A1. 6.11 and 7.1 left alone.
- b75e00d ingenic-sdk: stop T31 motor TCU counter when steppers idle The Pan/Tilt stepper driver free-runs its TCU channel after boot-time homing/positioning completes, raising the full-match interrupt at MOTOR_DEF_SPEED (900/sec) forever while the camera sits still. Disable the counter in the idle branch of the interrupt handler once both motors reach MOTOR_OPS_STOP. Cuts ~900 dead interrupts/sec on IRQ 202 (jz_timer_interrupt); confirmed on a Cinnado D1 T31L - idle drops to 0/sec while a live move still steps normally.
- 236126d thingino-kopt: take wireguard's udp_tunnel through VXLAN, not FOU buildroot enables NET_FOU to reach the promptless NET_UDP_TUNNEL, and FOU also selects XFRM, a bool, so the IPsec framework was landing built in on every 4.4 board. VXLAN carries the same dependency without it.
- 6f5bf5d wifi: make disable-roaming patches actually take effect The disable-roaming patches guard CONFIG_LAYER2_ROAMING behind BR2_PACKAGE_THINGINO_WPA_SUPPLICANT_ROAMING, but that Kconfig symbol never reached the driver build. The autoconf.h patches expect it as a C macro (-D...) and the Makefile patches expect it as a make variable, yet neither was passed, so driver L2 roaming was always compiled in. Forward the symbol from each package .mk, where Buildroot config variables are available: pass -DBR2_PACKAGE_THINGINO_WPA_SUPPLICANT_ROAMING via USER_EXTRA_CFLAGS for the autoconf.h drivers, and the make variable for the Makefile drivers. Signed-off-by: Paul Philippov paul@themactep.com
- 3d114c9 configs/cameras-testing: fix qemu_a1n for A1 SDK and MTD name Set DEV_NVR and STREAMER_NONE to skip the ISP/sensor SDK build (A1 ISP Kbuild is not available). Drop SFC0_NOR flash controller override -- the A1 kernel registers MTD as jz_sfc like T40, not sfc0_nor like T41.
- 2bb48e5 board: xburst1: drop IPsec from the 3.10 kernel configs XFRM_USER and NET_KEY are off and no IPsec userspace ships, so nothing could install an SA or policy. All three INET_XFRM_MODE_* are off as well, so ESP could not process a packet either. Saves 25,509 bytes on teacup T31.
- 59d4185 board: xburst2: trim the A1 kernel config to fit the NOR partition 2,022,107 bytes against a 1,638,400 partition. Builds USB, ext4 and FAT as modules, drops the display stack (no framebuffer driver exists, so VT drew nothing), the unused VPU, DYNAMIC_DEBUG and the developer options.
- 99de965 thingino-kopt: keep USB mass storage modular on the A1 Enabling SCSI here would force the base config's modular USB half back to built in. SCSI and sd themselves stay built in for SATA, which cannot be modular: libata-core calls sata_phy_reset(), which ahci_ingenic defines.
- a05f539 thingino-system: load the A1 storage modules at boot The A1 builds USB and its disk filesystems as modules. Nothing autoloads them: mdev has no MODALIAS rule, and automount mounts with "mount -t auto", which only tries filesystems already listed in /proc/filesystems.
- 9a4bde3 configs: drop the A1 per-board kernel fragment It turned off HOTPLUG_CPU and SUSPEND, which resize struct device and task_struct that the prebuilt vendor blobs are compiled against. The size problem it solved belongs in the base config.
- 9b8a227 package/wifi-hwsim: add mac80211_hwsim virtual WiFi for QEMU testing In-tree kernel module that creates wlan0/wlan1 virtual radios, enabling full WiFi provisioning testing under QEMU without hardware. Kernel config fixups: CFG80211, MAC80211, CRYPTO_CCM/CTR/GCM as modules; MAC80211_HWSIM=m. S36wireless auto-loads via HWSIM_MODULE_NAME. WPA2-PSK requires CRYPTO_CCM for the software CCMP cipher (real WiFi hardware handles this in firmware).
- ab1abc4 configs/cameras-testing: add QEMU test profiles for all Ingenic SoCs One profile per SoC with mac80211_hwsim virtual WiFi and 16 MB NOR flash for CI/QEMU boot testing. XBurst2 profiles (T41, A1) set SFC0_NOR flash controller to match the 4.4 kernel's MTD name.
- b1f9ac0 package/qemu-ingenic: add pre-built QEMU host tool for Ingenic SoCs
- 012d94a lightnvr: mount A1 storage before startup
- 9519fe1 system: mount SD cards async with bounded dirty-page writeback Mounting with -o sync serializes every write: each write(2) blocks until the card acks, so card-internal GC pauses (100ms-1s+) propagate straight into writers - rmr drops frames while recording, timelapse stalls. RAM was bounded by allowing only one write in flight. Drop sync from the mdev automount and bound dirty pages globally instead: the flusher starts at 512K dirty and writers are throttled at 4M. RAM is still capped (4M of dirty pages), but writes coalesce and SD stalls are absorbed by the dirty budget instead of stalling the recorder. Since the mount is now async, flush dirty data on umount so a gracefully removed card does not leave up to 4M unwritten. Durability tradeoff, stated explicitly: camera cards are FAT32/exFAT and non-journaled. sync was yank-resistance: with it, a card pulled without unmounting lost at most the current write. With async, an unclean removal (power cut or card yank) loses up to 4M of dirty data and may leave FAT or directory metadata inconsistent. The sync in do_umount does nothing for the yank case - by then the device is gone and writeback just errors out; the 4M bound is the only protection there. This trades bounded metadata damage for a non-stalling recorder, and the bound is what makes the damage bounded. The sysctl knobs are global, not SD-specific: they also govern USB mass storage and everything else on the generic writeback path. The 4M cap is at or below the stock 20%-of-dirtyable ceiling on every supported board (tightest: Aobocam A12, T23DL, 22MB Linux, ~4.4M nominal), so no board sees a loosened limit. Hardware validation status: not yet run. Frame-drop before/after during forced SD GC, corruption checks after yank/power-cut, 64MB T31 memory pressure, and sysctl -q -p across 3.10.14 / 4.4.94 / 7.1-rc1 are still pending on real devices. Signed-off-by: WLTB Gino gino@wltb.local
- f084207 package: add Pushover to the send2 toolkit Add send2pushover, a Pushover (pushover.net) notifier that follows the same pattern as send2ntfy/send2gotify: - /usr/sbin/send2pushover with token/user config in /etc/send2.json, optional title, message template (strftime), priority -2..1 and photo attachment via multipart upload (video unsupported) - WebUI: Pushover config page (tool-send2-pushover.html), entry in the Send-to services table, service capabilities and test button - json-send2.cgi: pushover domain read/write support - motion bridges: prudynt motion script, timps-motion and raptor-motion now honor motion.send2pushover - agent-adapter persists motion.send2pushover - timps.mk installs send2pushover alongside the other send2 tools
- 460ed81 thingino-gpio: support drive strength and bias in boot config Extend S05gpio to apply gpio-diag drive and bias settings next to the existing high/low/input actions, and let a camera append its own gpio.conf from configs/cameras//gpio.conf to /etc/gpio.conf at build time. The Wyze Cam v3 IR LED driver line is held up by an external load that the default 4 mA drive strength cannot pull low, leaving the IR LEDs on regardless of the ric light command. Bump ir850 (GPIO 47) to 12 mA for both Wi-Fi variants. Signed-off-by: Paul Philippov paul@themactep.com
- 2621d02 build: fix U-Boot defconfig and binary name overrides for MMC boot thingino.mk: propagate BR2_TARGET_UBOOT_BOARDNAME and BR2_TARGET_UBOOT_BOARD_DEFCONFIG from camera defconfigs into UBOOT_BOARDNAME and UBOOT_DEFCONFIG (the else branches were missing). Default BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME to SOC_UBOOT_BIN so T31 gets u-boot-with-tpl-lzma.bin, not the hardcoded u-boot-with-spl-lzma.bin. Makefile.utils: detect pre-laid-out MMC binaries (SPL at block-34 offset inside the file) and adjust the dd skip accordingly. Write U-Boot environment to the SD image at CONFIG_ENV_OFFSET (converted to decimal for dd). inject-uboot-mmc-dt.sh: enable msc0 in the device tree (status okay, bus-width 4) so the MMC controller is available in SPL. configs/uboot/boards/isvp_t31x_msc0.config: board fragment for MMC boot -- skip card-detect (CONFIG_MMC_BROKEN_CD), store env on MMC, and set CONFIG_ENV_OFFSET past the U-Boot image.
- 849fa55 configs: enable secureboop on eFuse-locked cameras T31 SPL signature patching: wyze_vdb2_t31x, wyze_campan3_t31x (Wyze keys) camsoy_okc01_t31lc, galayou_g2 x2, galayou_g7 (T31LC key) xiaomi_mjsxj03hl x3 (Xiaomi key 1) xiaomi_mjsxj05hl (Xiaomi key 2) T41/T32 init-table patching: wyze_cam4_t41nq, wyze_floodlightv2_t41nq, wyze_campan4_t32nq T31LC and Xiaomi T31 cameras were broken on master since moving to the 2026.07 U-Boot (the old 2013.07 vendor SPL splice is gone).