Changes in this release:
- 2c76a59 package/ingenic-sdk: update to 635afc9 Update ingenic-sdk from e097418 to 635afc9 Hash change: e0974182df7e001ff76e6cdf25d36d593fde7ed4 -> 635afc94a74afc1358c1164fd3bf46822ff32fca Changelog: 635afc9: sensor-iq: add default IQ file for sc231hai sensor
- 923a48e package/timps: update to v1.9.32 Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- 829eddf timps: hash v1.9.28 and v1.9.29 under their git tarball names TIMPS_SITE_METHOD is git, so buildroot stores the archive as timps--git4.tar.gz. The two entries named timps-v1.9.28.tar.gz and timps-v1.9.29.tar.gz never matched it and a build of those versions failed with "No hash found". The new hashes are those of the git archives, as for every other version in the file. Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- f0081c6 timps: link only libimp when OpenIMP provides it OpenIMP's libimp does not link libalog or libsysutils and timps imports no SU_*/alog symbol itself, so with BR2_PACKAGE_OPENIMP neither library is needed. Link -limp alone and stop selecting the Ingenic libsysutils; vendor-libimp builds are unchanged. Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- 56a1fa5 ingenic-sdk: jxf23 runs the reset/power-down pulse on every g_chip_ident() Review feedback: only the GPIO request/free is gated on the held flags; the reset and power-down sequence runs on every call while the line is held, so a retry after a failed detect (no remove() in between) gets the pulse too. Patch header uses the noreply address. Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
- 0173819 package/timps: update to v1.9.31 Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- 96eb106 package/timps: update to v1.9.30 Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- d0d54aa ingenic-sdk: patches for t21 jxf23 GPIO ownership and t31 sc4336p vflip result - 0002 jxf23 (T21): request the reset/pwdn GPIOs only once and free only the lines the module actually holds, so a re-registration or module reload no longer logs "gpio request failed", skips the reset sequence or frees GPIOs it does not own. - 0003 sc4336p (T31): sensor_set_vflip() returns the real I2C result instead of -1 on success, so the ISP driver no longer logs "sensor flip failed: -1" on every flip. Both apply on the pinned ingenic-sdk e0974182 after 0001. Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- 73bb039 timps webui: Effects card (colour effect, scene) on the image page Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- 96c778d timps webui: dead-pixel correction slider on the image page Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- 9ba8919 package/prudynt-t: update to 6e48034 Fixes the frozen fMP4 preview. serve_fmp4() advertised an AAC track whenever audio was configured, even when the audio encoder failed to initialise (the audio_stream object exists but imp_audio is null, so no audio frames are ever muxed). Browsers then drop the whole muxed stream (MediaSource buffered stays empty), freezing the preview on the first frame while only a page reload shows a new one. 6e48034 registers the audio tap only when the encoder is live and advertises the track only when the tap exists. A camera whose audio encoder failed now produces a video-only fMP4 that plays; cameras with working audio keep it. Signed-off-by: Paul Philippov paul@themactep.com
- a3c95e1 docs/dev: document the sensor registry ABI Record the /proc/jz/sensor/sensorN/ keys, the two registry sources (the open stack via SENSOR_PROC_OWNED_BY_ISP, the proprietary families via SENSOR_REGISTRY_IN_SDK), the flat-tree coexistence required by prudynt, and per-family status: t23 and t31 validated on hardware, t40 and t41 build-level. Signed-off-by: Paul Philippov paul@themactep.com
- e1c1b14 ingenic-sdk: publish the sensor registry for t23/t31/t40/t41 Bump INGENIC_SDK_VERSION to e0974182, which adds the SDK-side sensor registry (common/isp/common/tx-isp-sinfo.c), the per-family hooks and the t40 sc3338 IQ. For the proprietary ISP families, define SENSOR_REGISTRY_IN_SDK so the registry is compiled into tx-isp- and fed from the sensor modules. The open stack keeps SENSOR_PROC_OWNED_BY_ISP, and the vendor flat tree stays published for prudynt. Signed-off-by: Paul Philippov paul@themactep.com
- 8e1e06e package/prudynt-t: update to ef28bcc Update prudynt-t from 6a7a86d to ef28bcc Hash change: 6a7a86d2cb88837d1727b3c9b610cfcd4a16d2ba -> ef28bcc9324210e71307df5b6c130bad98f24d28 Changelog: ef28bcc: t40: use the 1.3.1 en SDK headers
- 25e1e4a cameras: add Sonoff CAM-B1P SC2337P profile
- 34f7172 timps: pass USE_OPENIMP when the openimp package is selected Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- 590f68b wireless: allow WLAN GPIO toggling on 4.4 kernels S36wireless applies the gpio.wlan sequence from thingino.json only when uname -r starts with 3.10; on 4.4 (T40/T41) it logs "Skipping WLAN GPIO toggling for kernel 4.4" and does nothing. The 3.10-only gate has no 4.4 counterpart in the tree: no kernel DT regulator/hog and no other init script consumes gpio.wlan, so on T40/T41 boards whose radio has a power-enable GPIO the pin is never driven and the module fails to probe (hit in the wild on a T41NQ board with an RTL8733BU radio, GPIO 61 active-low, where the stock firmware drove the pin from userspace at boot). Apply the same sequence on 4.4. The sequence consumer (apply_wlan_sequence via the gpio tool) is kernel-agnostic; the original 3.10 literal was a very conservative whitelist, not a functional dependency. The bcmdhd unexport cleanup applies unchanged. Backport of 9f245dd from master. Signed-off-by: Paul Philippov paul@themactep.com
- 277805e thingino-motors: fix S59motor stop path wedging motors-daemon stop_daemon() could never actually stop motors-daemon: the daemon self-daemonizes under -d (double-fork + setsid), so the PID start-stop-daemon records via -m is the intermediate child, which exits immediately -- the pidfile is stale from the moment it is written. stop() didn't check stop_daemon's result and proceeded to rmmod anyway, which succeeds against a live daemon because motor_fops lacks .owner = THIS_MODULE (module use count stays 0 with a live opener; filed separately as themactep/ingenic-sdk#45). That leaves motors-daemon in permanently uninterruptible D state, immune to SIGKILL, recoverable only by a power cycle. Fix: stop_daemon now matches the real process (anchored on the binary path, since an unanchored pattern also matches the calling shell) and escalates SIGTERM -> SIGKILL with a bounded wait, returning a real status. stop() now refuses to rmmod unless the daemon is confirmed gone, converting the failure mode from an unrecoverable wedge into an ordinary loud error. Tested live on an Eufy E220 (T8410C, T31X): the exact restart that previously wedged the daemon (reproduced on both legacy and profiled motion_driver, so unrelated to acceleration settings) now completes cleanly and leaves the motor responsive. Backport of 76b15a5 from master; fixes #1510 on ciao. Signed-off-by: Paul Philippov paul@themactep.com
- 95e64d6 prudynt-t: bump to 6a7a86d for the MJPEG IPC parser fix Picks up whole-token IPC key matching: a ch1 MJPEG request no longer parses the
hinsidech=1as a 1-pixel height, which re-inited the shared JPEG encoder at 16x16 on the first request after every restart. See #1724 Signed-off-by: Paul Philippov paul@themactep.com - d61abd1 prudynt-t: resync the fMP4 preview when the live edge drifts behind The preview only compares the playhead to the buffered live edge, so it cannot see a client whose backlog prudynt drains at exactly realtime. After a playback stall the camera queues fragments and then hands them out one per produced frame; buffered.end stays ~1s ahead of currentTime while the whole session plays stale content, so the MAX_AHEAD_S jump never fires. The tab shows smooth 1x video minutes behind the OSD clock until a manual refresh, and the reader/pump split keeps the socket drained so prudynt's send timeout never closes the stale client either. Anchor the media timeline to the wall clock once per session (the live edge at the first appended fragment plus its arrival time) and reconnect when the live edge falls more than MAX_DRIFT_S behind realtime. Only a fresh fetch resets the per-client queue, so tear the session down and start over instead of seeking inside the stale buffer. The anchor resets on teardown, so a reconnect cannot thrash. Signed-off-by: Paul Philippov paul@themactep.com
- ff43184 daynightd: accept ev_log2 == 0 as a valid brightness reading The ISP ev_log2 field reports 0 at the minimum exposure (brightest scene), but every guard tested
ev_log2 > 0, so a legitimate 0 was discarded as though the field were absent. primary_signal then stayed at its -1 sentinel, and since the only exit from NIGHT issig > 0 && sig < day_thr, the daemon latched in night mode whenever the AE exposed down to the floor. Restarting daynightd did not recover it: the -1 signal never satisfies the DAY condition, so initial detection timed out and re-applied NIGHT. Restarting prudynt did not help either, because /run/thingino/daynight_mode stays "night" and S31prudynt re-applies running_mode=1 on start. Only a reboot reset the ISP and the field read positive again, until the next night transition. Treat -1 as the sole "absent" sentinel and 0 as a valid reading across the proc parsers, the brightness mapping, and the initial/hysteresis decisions. scripts/test_daynight_init.py mirrors the daemon algorithm and is updated to match. Signed-off-by: Paul Philippov paul@themactep.com - 89140c7 ingenic-sdk: bump to 7a160931 for the SC2336P/SC2337P die check Picks up the t23 sensor_detect revision check: the two dies share chip id 0x9b/0x3a, and the low nibble of register 0x801e now selects the right driver, so a wrong profile fails AddSensor instead of binding with the wrong init timings and IQ. Signed-off-by: Paul Philippov paul@themactep.com
- 87b7c51 configs: add Sonoff CAM-PT2 SC2337P profile SC2337P is a distinct SmartSens die, not an alias of SC2336P. They share chip ID 0x9b/0x3a, but sinfo/sensor_info.c tells them apart by the low nibble of register 0x801e (SC2336P requires 0, SC2337P requires non-zero); each also has its own IQ bin and its own driver init timings. The SDK builds one sensor driver per profile, so units with the SC2337P die need their own profile. Mirror the sc2336p profile and change only the sensor name. The sensor comes up through the standard sensor-info path (sc2337p.c calls sensor_common_init in the pinned ingenic-sdk), so no prudynt.json sensor override is needed. Supersedes #1668. Signed-off-by: Paul Philippov paul@themactep.com
- 429badb thingino-ha: gate the new day/night entities on their own flags
brightnessanddaynight_statewere published and cleared inside thegainanddaynightblocks, so they could not be enabled or disabled on their own andenable_brightness/enable_daynight_statehad no effect. Add both to HA_ENTITIES and gate them withha_entity_enabled. Brightness comes from daynightd, so only discover it where daynightd exists; before, it was announced on prudynt-only images and stayed "unknown" forever. Follow-up to #1728. Signed-off-by: Paul Philippov paul@themactep.com - 3b9c55d thingino-diag: redact the full MQTT credential in the ps listing The previous pattern matched one quoted run, so a broker host, username or password containing both a single quote and a space was only partly redacted:
_sqemits'\''for an embedded quote, and the regex stopped at the following space.-P 'a'\''b c'became-P REDACTED c', leaving part of the credential in the diagnostics. Move the filter into aredact_pshelper and match the whole shell word, escapes included. Verified on BusyBox sed. Follow-up to #1729. Signed-off-by: Paul Philippov paul@themactep.com - 2b9361f prudynt-t: recover a wedged prudynt and quiet the IVS timeout log
S31prudynt stopforce-killed withstart-stop-daemon -K -s KILL /usr/bin/prudynt, butstop_daemonhad already removed the pidfile and start-stop-daemon cannot match a process stuck in a driver wait. It printed "no /usr/bin/prudynt found; none killed" and left the process running, so the stream watchdog'sservice restart prudyntcould not clear a wedge. Capture the PID before it is removed and SIGKILL it directly, falling back tokillall -9 prudynt. Also bump prudynt to c9cc19f so anIMP_IVS_PollingResulttimeout logs at debug instead of warn; a shortivs_polling_timeoutwas flooding syslog and evicting useful history. Fixes #1611 Signed-off-by: Paul Philippov paul@themactep.com - 9f2222d prudynt-t, webui: unblock motion alerts from clip capture
motionran every send2 service only after the snapshot and the video capture-wait, soplayonspeakerwas delayed by the whole clip (up tovideo_length+ 10 seconds). Split the services by their own media need:playonspeakerand text-only send2 services fire immediately, media-bound ones after the capture. Move the per-service invocation into arun_servicehelper. Exposevideo_length,post_timeandmin_timeon the Motion page;post_timeis the anti-fragmentation knob (an episode ends only onceduration >= max(min_time, post_time)). Also document that events during an active clip are dropped by the singleton guard. Fixes #1647 Signed-off-by: Paul Philippov paul@themactep.com - ea78f63 webui, thingino-ha: use the supported full upgrade path
sysupgrade -phas been a hard error since partial upgrades were disabled (5888605): it prints "Partial upgrades are not supported anymore." and exits 1. The HA firmware update entity ran exactly that, backgrounded with output discarded, so clicking Install in Home Assistant logged "starting partial firmware upgrade" and then did nothing. The same flag was still offered by the WebUI OTA form. Run the HA update assysupgrade -f -B: a full upgrade that keeps the backup partition, soS37cfg-autorestorerestores the config on the next boot. Drop the WebUI "Partial update" option and default the OTA form to full, and fix the comments and help text that still promised-p. Fixes #1664 Signed-off-by: Paul Philippov paul@themactep.com - 06590c9 prudynt-t: bump to 44bdd2f for the motion frame-geometry fix Resolve motion
frame_width/frame_height/roi_1_x/roi_1_yfrom the monitored encoder channel instead of the sensor, so a substream monitor gets an ROI that matches the frames it actually sees. Also fail with a logged error when the channel attributes cannot be read. See #1645 Signed-off-by: Paul Philippov paul@themactep.com - 4373a59 fix: redact mosquitto credentials in thingino-diag process list The PS section now masks the -h, -u and -P arguments of mosquitto_pub and mosquitto_sub command lines. The long-running mosquitto_sub started by thingino-ha showed the MQTT broker host and username in clear in the diagnostic output.
- 996af90 timps webui: Highlights slider is 0..10, not 0..255 Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- 46462b8 timps webui: hide the Custom white-balance mode on T10/T20/T30 Their SDK's isp_core_wb_mode ends at Warm fluorescent, so timps clamps a 9 to 8 and the page would show a correction notice for a choice it offered itself. Hidden by the device SoC from thinginino UI config; an unknown SoC keeps all options. Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
- b041135 thingino-ha: report camera brightness in percent The Home Assistant Gain sensor declared dB, but it publishes the raw ISP total gain, so Home Assistant showed a wrong unit and recorded long-term statistics under it. Gain now has no unit and moves to the diagnostic category, and a new Brightness sensor publishes the 0-100 % level that daynightd writes to /run/thingino/daynight_brightness. Both stay under the existing gain option.
- e0aabbf thingino-ha: drive the day/night select through daynightd On images with daynightd the Home Assistant day/night select sent force_mode to prudynt, which ignores it, and read /run/prudynt/daynight_mode, which does not exist, so choosing night left the image in color and the select always showed day. The select now follows the thingino-agent and web UI path (daynight.enabled and daynight.force_mode in thingino.json, the daynight script, SIGHUP to daynightd), gains an auto option that resumes automatic switching, and a new Day/Night State sensor reports the mode actually applied from /run/thingino/daynight_mode. Images without daynightd keep the prudynt path.
- 6917ba5 prudynt-t: bump to 80dbd14 for the IVS idle-pause fix
prudynt80dbd14 keeps a channel that hardware IVS monitors active, so the idle pause no longer disables that channel's framesource and wedges motion detection. Without it, motion events, motion-triggered recording, and the substream frames all die at startup wheneverstream3(JPEG on the substream) ships disabled, which is the default. Fixes #1718 Signed-off-by: Paul Philippov paul@themactep.com - 3cc5ab1 webui, prudynt-t: play a bundled sound for the speaker test
speaker.fileships empty, soplayonspeakeraborted with "No speaker file configured" whilesend.cgibackgrounded it and always returned success. The WebUI showed "Speaker test played." for a no-op, and motion alerts through the same script were silent too. Fall back to a bundled sound when no file is configured:chime_1for the manual test,motiondetectionactivatedfor motion, resolving.opusor.ulawby what the image ships. Run the test synchronously and report the real result, and route the WebUI Test button through the shared test modal so its output is visible. Fixes #1723 Signed-off-by: Paul Philippov paul@themactep.com - 9759429 package/timps: update to v1.9.29 Update timps from v1.9.28 to v1.9.29 Hash change: v1.9.28 -> v1.9.29 (No changelog available)
- 0d0b343 package/lightnvr: update to 0.42.9 Update lightnvr from 0.42.8 to 0.42.9 Hash change: 0.42.8 -> 0.42.9 (No changelog available)
- 9f34b39 package/ingenic-sdk: update to 9e87773 Update ingenic-sdk from 1bda5c4 to 9e87773 Hash change: 1bda5c486b688d86a10e2f3c10223647106e09ff -> 9e87773d918234097dc054a8730b776552a69e16 Changelog: 5e6419d: formatting 9e87773: sensor: t10/t20 jxh42: add shvflip module parameter
- 774d1c3 secuplug_sp1: flip in the sensor instead of the ISP (#1693) Co-authored-by: Claude Sonnet 5 noreply@anthropic.com
- 885adb8 thingino-imp-test: port imp-test-faac to the faac SONAME 1/2 API
- d38c973 prudynt-t: bump to 2fe05c7 for faac 2.2 SONAME 2 compatibility
- de5c652 faac: update to 2.2 from the FreewareAdvancedAudio repository
- a10e9b1 cameras: add experimental config for teacup with imx219 sensor
- 026d774 webui: add endpoint entries
- b83214d webui: fix bottom margin
- dcb52d2 package/timps: update to v1.9.28 Update timps from v1.9.27 to v1.9.28 Hash change: v1.9.27 -> v1.9.28 (No changelog available)
- 8cd4747 package/thingino-wolfssl: update to v5.9.4-stable Update thingino-wolfssl from v5.9.2-stable to v5.9.4-stable Hash change: v5.9.2-stable -> v5.9.4-stable (No changelog available)
- 56e60d2 package/thingino-ubus: update to 414c60a Update thingino-ubus from 9ba1ab7 to 414c60a Hash change: 9ba1ab795b2f427ba0d9b00e27a3e0b343a8410b -> 414c60a2e29e72c2c4f573bc50ad54aef076d169 Changelog: ce54d7a: ubusd_main: free partially received message on client disconnect 6b5c6f1: ubusd_main: free queued lookup commands on client disconnect b012bc0: ubusd_acl: use SO_PEERGROUPS instead of parsing /proc for peer gids 955ff3f: ubusd: fix use-after-free when resuming a queued object lookup fb1dd8e: ubusd: document the bound on the pending-message body read 3a39a80: libubus-req: fix double close of the fd in ubus_complete_deferred_request 4d60031: libubus: fix msgbuf leak on ubus_channel_connect error path 91b0dad: libubus-req: fix error check on the __ubus_notify_async result 8241694: libubus-io: do not resend the fd on partial writes in writev_retry 618f3cf: libubus-obj: fix fd leaks on object message error paths 2f52ae3: ubusd_main: flush the tx queue after freeing the client's objects cdb648c: ubusd_obj: propagate subscription allocation failure to the client 7c5c068: ubusd_proto: fix double close of forwarded invoke fd d8fec00: ubusd: keep the fd alive while a message waits in the tx queue bde609c: ubusd_acl: copy the filename used as the ACL file vlist key 0086559: ubusd_acl: do not treat unresolvable ACL user/group names as id 0 5331c00: ubusd_event: document reserved event namespace forgery check ef37ed2: ubusd_event: use an unsigned type for the event dedup sequence e12ad4b: ubusd: flag event messages as not expecting a reply 9d709c5: ubusd_event: report allocation failure as out of memory 5170a58: ubusd: use canonical SCM_RIGHTS extraction on the receive path 8dfee69: ubusd_main: do not abort startup when the default socket dir fails 17f7861: ubusd: disconnect the client when a partially sent message is dropped f5e5836: cli: parse monitored payloads with the untrusted blob parser 11e411e: libubus: close the passed fd when the request exceeds the size limit cbc27b6: ubusd: stop writing to a client already flagged for disconnect 2ec13d4: libubus: do not restart the ACL query while one is in flight 297baef: libubus: free queued pending messages on shutdown 1752555: ubus/lua: fix Lua stack imbalance on policy allocation failure fdd9ff1: ubus/lua: copy the Lua strings stored in registered objects eb5a828: ubusd: close the forwarded fd when the invoke reply cannot be built 3930745: tests/fuzz: fix out-of-bounds read in header validation harness b27014c: tests/fuzz: use size of blob_attr, not of a pointer, in length guard 414c60a: ubus/lua: store event handler ref without polluting the callback table
- f0fee2f package/lightnvr: update to 0.42.8 Update lightnvr from 0.42.4 to 0.42.8 Hash change: 0.42.4 -> 0.42.8 (No changelog available)
- 0810a79 package/libjuice: update to v1.7.4 Update libjuice from v1.7.3 to v1.7.4 Hash change: v1.7.3 -> v1.7.4 (No changelog available)
- 1d9eb8b package/libdatachannel: update to v0.24.6 Update libdatachannel from v0.24.5 to v0.24.6 Hash change: v0.24.5 -> v0.24.6 (No changelog available)
- 94fc190 Add support for the Zbit ZB25Q256, a 32MB flash seen in Personal Cam Pan cameras (#1714) Adds a U-Boot jz_spi flash-table entry for the Zbit ZB25Q256 (JEDEC ID 0x5e4019) 32MB chip found in some Personal Cam Pan units, alongside the PY25Q256HB. 4-byte addressing, quad read 0x6B, 8 dummy bytes, QE bit in Status Register 2. Signed-off-by: Ignaciensen argentum150694@gmail.com
- 48b6810 timps: S96onvif_discovery waits for a late gateway instead of giving up Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 33aeea8 cameras: corrections ot Infiya K1 config
- da35cd9 timps: bump pinned version to v1.9.27, add hash Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 7837abc fixup: shfmt -i 0 -ci Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- b188b4a timps webui: apply day/night controls immediately, not at next edge Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 9b6b902 cameras: mark sonoff s3w as 6162 variant of atbm6132 driver (with bt)
- 14d5ec5 wifi-atbm6132cu: support the 0x6162 (BT-comb) variant The 6132cu ships under two USB DIDs. Parts reporting 0x6162 need the comb firmware driven with wifi_bt_comb=1; the validated config also drops MODULE_FS, MONITOR and the p2p0 netdev. The wifi-only 0x6055 path keeps the existing Ingenic config and atbm_printk_mask option. Select the variant with the new BR2_PACKAGE_WIFI_ATBM6132CU_6162 option; the Bluetooth path is unchanged. Bump the driver to 7f1ba35, which carries the validated atbm6132cu_6162.config, and ship the S3W 5G rate/power table as set_rate_power_5g.txt for the path the 606x driver reads from /usr/share/wifi. Signed-off-by: Paul Philippov paul@themactep.com
- 02ec83e ingenic-sdk: resolve bare IQ names from sensor-iq// BR2_SENSOR_x_IQ_FILE previously had to be a path relative to BR2_EXTERNAL, so selecting a different stock IQ file meant vendoring a copy into the tree. A bare file name is now resolved against the SDK's sensor-iq/<SOC_FAMILY>/ directory, letting a board point at e.g. sc200ai-sonoff_s3w.bin directly; a value containing '/' keeps the existing BR2_EXTERNAL-relative meaning. Also make a missing IQ file a hard error. The install ran as a single shell chain without error propagation, so a wrong override path, or a sensor with no sensor-iq//.bin, shipped an image with no IQ and no build failure. Signed-off-by: Paul Philippov paul@themactep.com
- 8f1d444 clean up: remove default directive
- 8810495 cameras: add Sonoff S3W (T23N, SC200AI, ATBM6132CU)
- 923f5b9 timps: leave sensor.i2c_addr to auto-detection Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0122hnTZ9TEaZBgmTGtb4xPs
- 8b9c1f5 timps: update to v1.9.26, WebUI client list, latency and night scale Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0122hnTZ9TEaZBgmTGtb4xPs
- 3d39aea thingino-motors: gate the build-command changes on WS, as on master Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0122hnTZ9TEaZBgmTGtb4xPs
- 77141c4 timps webui: main/sub selector switches the WebRTC stream too Gated on caps.webrtc.chn_select, so an older timps keeps the old toast. Co-Authored-By: Claude Opus 5.5 (1M context) noreply@anthropic.com
- bb8f5e2 timps webui: fix review findings in the upload/day-night CGIs Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 8c2a6ee timps: apply the plugins' preview html + scripts at build time Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0122hnTZ9TEaZBgmTGtb4xPs
- 79afd9c timps webui: keep WebRTC the preview default after a fallback Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0122hnTZ9TEaZBgmTGtb4xPs
- 7b490b0 timps webui: load plugin preview scripts ourselves, PTZ was gone Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0122hnTZ9TEaZBgmTGtb4xPs
- e8af629 timps: drop the flash-operations page from timps images Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0122hnTZ9TEaZBgmTGtb4xPs
- d5afc0b timps webui: drop redirect stubs nothing links to Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_0122hnTZ9TEaZBgmTGtb4xPs
- 2caf632 timps webui: silence shellcheck SC3043/SC2015 in the new CGIs Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 9e9b051 timps webui: shfmt timps-upload.cgi Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- e04a7c1 thingino-motors: bump pinned version to b73170f (v0.1.3+ws), -flto on the fork Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 0b72a33 timps webui: bring package/timps/files/www up to date with ciao Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 502220e timps: bump pinned version to v1.9.22, add hash Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 59d8faf wifi-atbm6132cu: select BT-comb firmware when Bluetooth is enabled Borrow the conditional-BLE pattern from wifi-atbm6031x/6012bx: with BR2_PACKAGE_THINGINO_BLUETOOTH set, append CONFIG_ATBM_BLE_WIFI6 and CONFIG_ATBM_BLE_WIFI_PLATFORM_WIFI6 to the driver config, add wifi_bt_comb=1 to the module options, and install the ocea BT-comb firmware instead of the wifi-only one. The WiFi6 Makefile derives the -DCONFIG_WIFI_BT_COMB / -DCONFIG_ATBM_BLE macros from CONFIG_ATBM_BLE_WIFI_PLATFORM_WIFI6, so no EXTRA_CFLAGS is needed. Kernel CONFIG_BT is intentionally not enabled: this is the "wifi driver supports the ble stack app" path, not the HCI path the older drivers used. WARNING: not tested on hardware. Needs a 6132cu board with a BLE module and BR2_PACKAGE_THINGINO_BLUETOOTH=y to confirm the comb firmware loads and BLE provisioning works. Signed-off-by: Paul Philippov paul@themactep.com
- ceb3f4d wifi-atbm6062cu: enable CONFIG_XFRM for the prebuilt blob (issue #1667) The prebuilt atbm6062cu blob is compiled against a kernel with CONFIG_XFRM=y. On 3.10 that adds sk_policy[2] to struct sock, so with the IPsec framework trimmed out of the xburst1 kernel configs (2bb48e5) the blob reads shifted socket fields and oopses in the DMA mapping path shortly after load. This is a pure ABI mismatch, separate from the DYNAMIC_DEBUG oops fixed in 8173995. Enable XFRM (and the ESP/crypto pieces it rides with) from the module's own LINUX_CONFIG_FIXUPS, matching how DYNAMIC_DEBUG is handled, so only the boards using this blob carry the few KB. Signed-off-by: Paul Philippov paul@themactep.com
- cd3f6e7 wifi: log portal bring-up and make the preset fallback one-boot S38wpa_supplicant routes portal/AP/client bring-up messages through the shared log helper so they reach syslogd, and starts the portal wpa_supplicant with -s so its own AP bring-up error is visible remotely instead of only on the serial console. When the portal AP is not up it dumps the portal config, wpa_cli status and the wpa_supplicant process count, and counts processes with pgrep -x (pgrep -f also matched this script). Add a preset client fallback for when the portal AP cannot start, and make it a one-boot rescue: fallback_to_preset() copies the preset over /etc/wpa_supplicant .conf and marks it, and the next boot drops that copy so the portal is retried - in stop() on a clean shutdown and at the top of start() after an unclean power cycle, but not on
restart. wlan configure/reset clear the marker, so a network configured deliberately survives reboots. Update the fallback docs accordingly. Signed-off-by: Paul Philippov paul@themactep.com - 0f5bb66 wifi-atbm6062u/s: enable P2P so AP mode registers mgmt_tx The atbm606x mac80211 wires cfg80211_ops.mgmt_tx (and the whole mgmt_tx/ROC block) only under CONFIG_ATBM_SUPPORT_P2P, while the bundled cfg80211 rejects NL80211_CMD_REGISTER_FRAME with -EOPNOTSUPP when mgmt_tx is NULL. The atbm6062 wiphy does not set WIPHY_FLAG_HAVE_AP_SME (device_ap_sme=0), so wpa_supplicant must register the AUTH frame for the captive portal; that registration failed and start_ap aborted with "Failed to start AP functionality". The other Thingino atbm packages already turn P2P on in their COPY_CONFIG hook; the 6062 ones did not. Do the same here, using the 606x _WIFI6 symbol, so ieee80211_mgmt_tx is compiled and registered and the portal AP can come up. Signed-off-by: Paul Philippov paul@themactep.com
- 7f88f43 init: mirror init script status output to syslog Init scripts print status with the BusyBox
echo -cextension, which only reaches the serial console. A remote collector therefore saw kernel messages (S02kmsgd/S50kmsgdboot) but nothing from userspace bring-up: streamer start, network, mounts and failures stayed on the wire nobody watches. Add overlay/etc/init.d/lib-log, a sourced helper defininglog -c .... It prints exactly like echo -c and additionally hands the plain text to syslogd, deriving the priority from the color (160 err, 142 warning, 118/196/208 notice, otherwise info) and tagging with the script basename. Messages emitted before syslogd opens /dev/log are silently dropped, so early init cannot fail on the missing socket. Convert every init script that used echo -c to log -c, both in overlay/etc/init.d and in the package-provided S* scripts. Console output is unchanged. F02failsafe: the "Failsafe mode..." echo sat afterexec setsid gettyand never ran; move it before the exec now that it also logs. Signed-off-by: Paul Philippov paul@themactep.com - bc8f2ab secuplug_sp1: measured motor speed and travel Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 3a1b172 secuplug_sp1: sort defconfig Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 686c0f8 Add SecuPlug SP1 (T10L, JXH42, MT7601) camera profile Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- ccc1035 timps: apply per-camera timps.conf overrides from the profile Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 43d6659 configs: fix Wi-Fi bring-up on Eufy T31ZX units (PA25/PA26 pull-ups, BT_REG_ON) Some Eufy T8400X/T8410X units ship a T31ZX instead of a T31X. On those the SYN4343 never answers on SDIO with the current profiles: no wlan0, no setup AP (#1677, #662, #566). Two settings in gpio_default cause it, both verified on an E220 T8410X reporting t31zx: 1. 25ID 26ID leaves the pull-up enabled on PA25 and PA26 (D only disables the pull-down). On the T31ZX package PA25 shares its pad with PB16 (WL_REG_ON) and PA26 with PB15 (T31ZX datasheet p.20), so the pull-up sits on WL_REG_ON. Use 25IDU 26IDU like the U-Boot default and the other T31 profiles. No effect on T31X, whose pads are not shared. 2. 38O drives BT_REG_ON high at boot on the T8410X profiles. With BT_REG_ON high the Wi-Fi core does not enumerate on this unit. The stock firmware only raises it when starting Bluetooth. Use 38o. Test matrix on the T31ZX unit (U-Boot env only, empty gpio.conf): 25ID 26ID 38O -> no SDIO device (shipped profile) 25IDU 26IDU 38O -> no SDIO device 25ID 26ID 38o -> no SDIO device 25IDU 26IDU 38o -> mmc1:0001:1 mmc1:0001:2, wlan0 up, portal, joins network Existing cameras can apply it without a rebuild: fw_setenv gpio_default with the new value, or a uenv.txt with that line on the SD card. Independently found on a T8400X T31ZX by @rba-dba-doo (#1677). Fixes #1677, #662, #566
- 9418156 Change clone branch to 'ciao' in README Updated the clone branch from 'stable' to 'ciao' for building instructions.
- b65aefd package/timps: update to v1.9.19 Update timps from v1.9.18 to v1.9.19 Hash change: v1.9.18 -> v1.9.19 (No changelog available)
- e51a4a7 prudynt-t: make the PTZ live view the default preview Rename preview-ptz.html to preview.html and the old fMP4 preview to preview-fmp4.html, so the combined live view with pan/tilt is what the Preview nav item opens. The plain fMP4 page stays reachable at /preview-fmp4.html alongside preview-mjpeg.html. Cameras without pan/tilt hardware keep the same layout; the controls are rendered disabled behind a note instead of being hidden. assemble_plugins.py skips the plugin preview injection for preview.html, since that page ships its own OSD/PTZ scripts, preset UI and controls; injecting would load them twice, duplicate the buttons and add the joystick overlay. The fMP4 and MJPEG variants still get it. Also drop the rounded class from the video element. Signed-off-by: Paul Philippov paul@themactep.com
- 21df140 prudynt-t: bump to b4d3d96 Picks up the substream consumer-count fix and the OSD SEI NAL start-code fix that was making the fMP4 preview render black in browsers. Signed-off-by: Paul Philippov paul@themactep.com
- c9afb3a prudynt-t: finish the preview-ptz page Section headers (Audio, Pan/Tilt, Presets) with their hints beneath, ten preset slots where long-press names and stores or overwrites and right-click deletes through the shared promise-based confirm, OSD and PTZ buttons in the Live View header, zoom on the picture itself, and a non-fluid container so the fixed-width preview is stable. preview-fmp4.js seeks back to the live edge once playback is more than 5s behind, so a stall (a config write) does not leave the player permanently behind. Signed-off-by: Paul Philippov paul@themactep.com
- 43bee6e webui: draw the SEI OSD over the fMP4 video The overlay only looked for
(the MJPEG page), so the fMP4 previews rendered no SEI OSD. Resolve #preview then #fmp4-video, use videoWidth/Height, and host the overlay in the video's parent instead of an inline-block wrapper so the video width is not disturbed. Also anchor negative offsets to the right/bottom edge. They were applied as the element's left/top, so right- and bottom-aligned text was placed with its left edge at the offset and ran off the frame. Signed-off-by: Paul Philippov paul@themactep.com
- 24776a5 webui: keep the plugin preview injection off preview-ptz.html is_preview_page() matched any preview*.html, so the build injected the plugin preview scripts into preview-ptz.html on top of its own tags: the OSD and PTZ buttons appeared twice and the joystick overlay and the 10-slot preset bar were appended below the preview. Exclude that page; it ships its own controls. Signed-off-by: Paul Philippov paul@themactep.com
- 7412333 osd: fix save restart and SEI visual persistence - The save payload requested restart_thread 32 (PNT_FLAG_RESTART_RTSP), which tore down the RTSP server and dropped every client just to apply an OSD change. Use 64 (PNT_FLAG_RESTART_VIDEO) so the encoder and OSD thread restart and re-read the config while RTSP sessions stay up. - wireColor assigned input.value directly for the swatch and the alpha slider; a programmatic assignment does not fire input, so applyVisualsLive never ran and the SEI visuals were neither saved nor repainted. Dispatch a bubbling input event after each set. - Preset the SEI fields, swatches and native color pickers from the stored visuals on every show.bs.modal, not only on the one open path. Signed-off-by: Paul Philippov paul@themactep.com
- b44fddb prudynt-t: add the preview-ptz page A preview page with the live view capped at the ch1 substream width and a freehand pan/tilt card beside it: jog pad, step sizes, home/stop, presets, and stream audio and fullscreen controls. Registered in the Streamer nav and installed by the package. Signed-off-by: Paul Philippov paul@themactep.com
- 97215f6 webui: default the preview to the ch1 substream The fMP4 preview and the MJPEG and streamer pages defaulted to Main (ch0), so opening the Web UI registered a 1080p encoder consumer. Default them to the ch1 substream instead; the Main/Sub buttons and the endpoint list still offer ch0. Signed-off-by: Paul Philippov paul@themactep.com
- 31303b0 prudynt-t: bump to 4cc9e8a Picks up the auto-bitrate derivation: per-stream scale, an fps term and the configurable general.bitrate_auto_bppf constant, plus its docs. Signed-off-by: Paul Philippov paul@themactep.com
- 5990ca1 package/thingino-onvif: update to 3d1fa84 Update thingino-onvif from 8713b69 to 3d1fa84 Hash change: 8713b69d97f449cb5786690a54ffc98d46ed93df -> 3d1fa8480c88e156ff3cd12938d5e9b5b1d7668d Changelog: 3d1fa84: ptz: reserve numbered preset slots and support the home preset
- 94d4b43 package/subzeroclaw: update to 6b6b5ad Update subzeroclaw from e39b51b to 6b6b5ad Hash change: e39b51b8eccc1cfc35a209d728df8a32b312ddf1 -> 6b6b5adcb4662e0202838b5549d254feca1fc2a3 Changelog: 6b6b5ad: Add decision control with reusable shell procedures and unified model selection (#30)
- 0a04341 package/scriba: update to 7651081 Update scriba from ddc6004 to 7651081 Hash change: ddc60040047a349d9428efdeea8141b714cadb51 -> 76510818484dde6a0a1740771595b290261c6241 Changelog: 7651081: ezp2019: clear stalled endpoint on LIBUSB_ERROR_PIPE
- c8663ae package/prudynt-t: update to ee9ca27 Update prudynt-t from f1e8db3 to ee9ca27 Hash change: f1e8db3642f34b68462625f58ef39b076f1a7926 -> ee9ca2776ba649fb45dcec74a08e52ab396050b8 Changelog: 535b9a8: rtsp: drop the vestigial main-channel delivery path 3c68946: stream: remove the unused main-channel queues e14af13: stream: add an optional byte budget to MsgChannel 0a5ea8b: rtsp: byte-bound the per-client video and audio taps 5628c3c: rtsp: add an optional cap on concurrent stream clients bc855bf: docs: rtsp: reflect per-client taps and the bounded queues d6ed32a: rtsp: reclaim sessions that stop draining ee9ca27: stream: share NAL buffers across taps
- 8754794 package/lightnvr: update to 0.42.4 Update lightnvr from 0.42.3 to 0.42.4 Hash change: 0.42.3 -> 0.42.4 (No changelog available)
- 8173995 wifi-atbm6062: enable CONFIG_DYNAMIC_DEBUG via kernel fixups T23 cameras with the atbm6062cu/atbm6062 modules oops during firmware download when CONFIG_DYNAMIC_DEBUG is off (issue #1667). The base-config trim dropped it and only KOPT_DEVELOP turns it back on. Restore it from the modules' own LINUX_CONFIG_FIXUPS instead of reverting the global trim. The source-built atbm6062u is fine either way, since its print_hex_dump_bytes() calls become dynamic_hex_dump() macros, but the prebuilt atbm6062cu blob links the plain symbol. With dynamic debug on, lib/hexdump.c compiles that function out, so keep it built and exported via a follow-up kernel patch (0094). Signed-off-by: Paul Philippov paul@themactep.com
- 4b873bd thingino-snmpd: piggyback Buildroot's mini-snmpd package Buildroot bumped
mini-snmpdto 2.0 with the same tarball thingino-snmpd was fetching, so the package rebuilt a second copy of the daemon and kept a duplicate hash. Drop the local build and use the shadow-package pattern already used bythingino-mosquitto-212,thingino-libcurlandthingino-live555.BR2_PACKAGE_THINGINO_SNMPDnow selectsBR2_PACKAGE_MINI_SNMPD, andmini-snmpd-override.mkkeeps the Thingino layer:--without-config(no libConfuse, ethtool stats off), theS60snmpdinit script and the/etc/default/mini-snmpdreplacement, the shipped defaults staged for thingino-core, and the WebUI plugin.thingino-snmpd.mkis reduced to a virtual package that depends onmini-snmpd.mini-snmpd.mkexpandsBR2_PACKAGE_MINI_SNMPD_INTERFACESdirectly intoMAX_NR_INTERFACES. Force-building the package while its symbol is absent from.configleft that empty and killed the build with "flexible array member not at end of struct", so the override defaults it to 8, the Kconfig default. Signed-off-by: Paul Philippov paul@themactep.com - 13faff6 make: reorganize core.fragment entries, add isp_inspector
- 15b272d docs: add mqtt specs
- 1873dba mqtt: pass broker credentials as arguments, not shell text mqtt-sub-dispatcher built a "mosquitto_sub ... -P $password" string and ran it through sh -c, and send2mqtt built the same for mosquitto_pub. A password with spaces, quotes or a command substitution was re-split and re-expanded by the shell: the dispatcher died on an unterminated quote, and a value such as $(touch /tmp/x) executed as root on every service start. Build argv with set -- and execute "$@", so config values stay data. send2mqtt's use_ssl is read once instead of per publish. Signed-off-by: Paul Philippov paul@themactep.com
- 9548e16 cameras: promote dekco_t23n_sc3332p_ws73v100 to cameras The profile is complete enough to ship: it carries motors (SPI-less with per-axis steps/speeds and homing), SD card, audio, buttons and LEDs, and the second uenv/dts handling is in place. CI only builds configs/cameras, so leaving it in cameras-exp meant it was never built or published. Signed-off-by: Paul Philippov paul@themactep.com
- a5ce47b build: keep vendored web UI assets out of the Prettier hook The hook selects staged web UI JavaScript with a shell case pattern, and a pattern's * crosses directory separators, so package/thingino-webui/files/www/a/vendor/*.js matched. Prettier then reformatted (un-minified) the vendored bundles -- chart.umd.min.js grew from 202 KB to 339 KB. Skip the vendor directory explicitly and restore the minified Chart.js that the previous commit had already reformatted. Signed-off-by: Paul Philippov paul@themactep.com
- a499d64 thingino-webui: vendor Chart.js for paranoid mode Paranoid mode rewrites CDN asset tags to /a/vendor/ but had no Chart.js mapping and no vendored copy, so the inspector and sensor-data charts still pointed at jsdelivr; tool-sensor-data.html even skipped the load outright. Add chart.umd.min.js 4.4.8 to the vendor assets, map the CDN tag to it in apply_paranoid_mode.py, and load the local copy from the paranoid branch of tool-sensor-data.html (it injects the tag with document.write, so the regex cannot reach it). Normal builds keep using the CDN. Signed-off-by: Paul Philippov paul@themactep.com
- f6cee61 thingino-isp-inspector: keep the dashboard working when Chart.js is unavailable initCharts() runs before startSse() in init(), and Chart.js comes from a CDN. When that request fails the constructor throws Chart is not defined, init() aborts, and the page is left dark and empty -- cards, charts and live updates all dead -- which reads as a black screen. Treat the charts as optional: skip chart setup when window.Chart is missing and never let it block init(), so the live cards, issue log and raw data keep working without the CDN. Signed-off-by: Paul Philippov paul@themactep.com
- 810c490 build: reject ISP reservations that leave no RAM for Linux An rmem/ISPMEM/NMEM reservation that reaches SOC_RAM_MB makes thingino-uboot emit osmem=0M and builds an unbootable image without complaining. Fail at parse time instead, before the build starts. Signed-off-by: Paul Philippov paul@themactep.com
- 2667698 cameras: fix vanhua_djz_t31n_gc4653_eth memory and flash size The profile set rmem=64 on a t31n (64MB) board, so thingino-uboot computed osmem=0M and the resulting image could not boot, and it set 16MB flash on a P25Q64H (8MB) board. Both values were copied from the t31x siblings; the PR that added the profile describes the tested configuration as a 32M/32M split with 8MB flash. Signed-off-by: Paul Philippov paul@themactep.com
- 4b04ac9 netwatch: make the connectivity watchdog opt-in and traceable It rebooted every unit by default after 3 failed pings (~60-120s), which turned a marginal Wi-Fi link into a reboot loop, and it logged only to the console so those reboots left no trace in logread. Ship it disabled, arm only on an explicit truthy netwatch.enabled, and log through logger -t netwatch. The Network form already exposed the knobs; document them. Signed-off-by: Paul Philippov paul@themactep.com
- f749d6c thingino-isp-inspector: allow selecting it without the dev-package menu The package's Kconfig was sourced inside if BR2_THINGINO_DEV_PACKAGES and depended on it, so BR2_PACKAGE_THINGINO_ISP_INSPECTOR=y in a fragment was silently dropped on any build with the dev menu off and the package never reached the image. It needs nothing from the dev bundle: its install is already guarded on BR2_PACKAGE_THINGINO_WEBUI and it only uses webui assets plus CDN JavaScript. Source its Kconfig with the other system packages and depend on BR2_PACKAGE_THINGINO_WEBUI instead. Signed-off-by: Paul Philippov paul@themactep.com
- 0ac9233 thingino-isp-inspector: judge frame-source counters by rate, not totals drop and intc_ahead only grow since boot, so the absolute thresholds became a permanent critical badge on any camera that had been up for a few minutes -- 66 near-misses after 71 minutes read as crit. Measure their slope over the history window (up to 5 min, at least 20 s of samples, with counter-reset detection) and classify on that, so a boot-time burst ages out and only a sustained problem stays lit. Cards show the rate; the running total moves into the tooltip. The queue-depth check no longer flags a count of 1 on a pre-dequeue camera: tx-isp runs the non-scaled channel single-buffer by design there. The CGIs now expose isp_ch0_pre_dequeue_time and valid_lines for that. Issues carry a stable key plus severity, so the log stops re-firing as numbers change, NORM prints the resolved message, and a resolved issue can be logged again when it recurs. Signed-off-by: Paul Philippov paul@themactep.com
- bb861d0 webui: return the full motion block from json-send2.cgi GET The GET handler preferred the agent and asked only for motion/enabled, so the response carried no motion.send2* keys and the Send to Services page rendered every On Motion toggle as off on each load, even though the flags were persisted. Read the full motion object from prudynt.json (the store the POST path and the agent persist write) and keep the agent motion/enabled as a fallback for streamers without that file. This also restores sensitivity and cooldown_time, which the agent branch dropped. Signed-off-by: Paul Philippov paul@themactep.com
- dbd2d81 thingino-ha: use an HA-safe discovery node id HA rejects a discovery topic whose node_id contains anything outside [a-zA-Z0-9_-], so an FQDN hostname such as cam-hall.rdw.one produced topics HA dropped. Derive HA_DISCOVERY_ID from HA_CAMERA_ID and use it for discovery topics only. Periods remain legal in the cameras/... state topics, so the MQTT namespace and device name are unchanged. Signed-off-by: Paul Philippov paul@themactep.com
- 502f84b motors: propagate ptz_presets save failures import_presets discarded jct's exit status, so -a, -r and -o reported success even when the write to thingino.json failed. Return non-zero on a rejected import, skip the success message, and keep the legacy conf in place unless the one-time migration actually imported it. Rename the wrapper temp file so it no longer shadows the caller's array temp file, which was also leaking the caller's file. Signed-off-by: Paul Philippov paul@themactep.com
- 0832f28 buildroot: move Thingino overrides into the pinned fork branch The buildroot override patches (XBurst2 arch, apply-patches list reset, kconfig const fix, host bison gnu17) now live as commits on the themactep/buildroot fork, so there is no patch step any more. Point the buildroot submodule at themactep/buildroot branch thingino-2026.08, drop package/all-patches/buildroot/ and the patch-buildroot/unpatch-buildroot targets, and remove the override-apply step from CI and scripts/worktree.sh. Signed-off-by: Paul Philippov paul@themactep.com
- 930bda9 wireguard: restore as default vpn choice
- 229c879 package/prudynt-t: keep the fMP4 preview bounded and reconnectable The preview appended every parsed fragment from inside the fetch read loop, so the response socket went unread while MSE worked. prudynt closes the chunked response once a write blocks for its 2s send timeout, which ended long sessions with ERR_INCOMPLETE_CHUNKED_ENCODING after the tab had already buffered minutes of video. Read and parse on one task, append and trim on another, with the backlog capped in bytes so the reader always drains the socket and a slow append cannot pin the connection. The SourceBuffer trim was bounded by the playhead alone, so a stalled playhead (suspended tab, blocked autoplay, decoder hiccup) let the buffer grow for the whole session. Cap the buffered window against the live edge as well, and pin the playhead before trimming. Reopen the stream after it drops instead of leaving the preview black. Signed-off-by: Paul Philippov paul@themactep.com
- fe2f0bd gitignore: ignore the .kilo directory Signed-off-by: Paul Philippov paul@themactep.com
- 05422ef send2webhook: don't mix -d and -F when attachments are present curl exits 2 when both a raw body (-d) and multipart fields (-F) are given, so any webhook send with photo/video/file attached failed. Use a multipart message field when an attachment is present and keep the raw body only when there is none. Fixes #1681 Signed-off-by: Paul Philippov paul@themactep.com
- c099f25 motors: persist preset edits from the PTZ settings modal The modal's Save settings button only wrote the movement settings. Preset name and coordinate edits live in the list and were saved only by the small per-row check button, so renaming a preset and pressing Save settings dropped the change silently and reopening showed the old name. Collect the rows that differ from the loaded presets and write them through the same d=pu path before saving the movement settings. Signed-off-by: Paul Philippov paul@themactep.com
- 4c2ec65 contrib: ignore local artifacts
- 3e98a31 contrib: use correct protocol in Frigate docs
- 78ff0d1 contrib: add a Frigate test rig for Thingino cameras Self-contained Frigate container for exercising Thingino cameras over RTSP and ONVIF, in the same shape as the ZoneMinder rig: compose file, env example, and a helper that renders the config for one or more cameras. The generated config maps ch1 (sub) to detect and ch0 (main) to record, adds an ONVIF block for PTZ presets and optional autotracking, and references the RTSP credentials through FRIGATE_RTSP_USER and FRIGATE_RTSP_PASSWORD so they stay in .env. Frigate keys its PTZ menu by the ONVIF preset Name, so the README calls out how to verify that the camera's preset descriptions show up instead of preset_N. Config validated with
--validate-configagainst Frigate 0.18.0. Signed-off-by: Paul Philippov paul@themactep.com - be19d61 motors: expose preset descriptions to ONVIF clients ptz_presets -g printed "id=Preset_id,x,y", so the user-facing preset description never left the device and ONVIF clients such as Frigate listed preset_N instead of the label the user set. Print "id,x,y,description" instead. The description is last so it may contain spaces and commas; the ONVIF parser and GetPresets were updated in lockstep to report it as tt:Name while the token stays derived from the id. Signed-off-by: Paul Philippov paul@themactep.com
- 31c941f package/prudynt-t: update to f1e8db3 Update prudynt-t from 5be430c to f1e8db3 Hash change: 5be430c7c97dabdddc5aa42801626ab8728ba334 -> f1e8db3642f34b68462625f58ef39b076f1a7926 Changelog: f1e8db3: video: fix false msgChannel clog warnings
- ec9708e make: fix racing in parallel builds
- 1e0509e package/ingenic-sdk: update to 1bda5c4 Update ingenic-sdk from b39cf8f to 1bda5c4 Hash change: b39cf8fbbadf4ea03a67d7739f8fcc02960253e3 -> 1bda5c486b688d86a10e2f3c10223647106e09ff Changelog: 1bda5c4: sensor: t20 use ISP_PRINT for the error logs
- 12fd7ff package/prudynt-t: update to 5be430c Update prudynt-t from d709269 to 5be430c Hash change: d7092692de8d25bd3f34136101b2cbc379c64e52 -> 5be430c7c97dabdddc5aa42801626ab8728ba334 Changelog: 0eec4bc: IMPSystem: read the sensor geometry from procfs before the ISP attach c1008ac: IMPSystem: do not DisableSensor before the sensor was enabled 5be430c: workers: don't report drops when no main-channel consumer exists
- 02abdca S95timps: quote the wait_stop loop bounds Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 346c1b1 timps: offer DROP_LIBSTDCPP only when timps is selected The symbol sat outside the BR2_PACKAGE_TIMPS guard and showed up in menuconfig for prudynt and raptor images, where it does nothing. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 8f1d6f0 S95timps: keep the pidfile until timpsd is really gone stop removed the pidfile even after wait_stop timed out, so restart's second wait_stop returned at once and start hit the still-exiting instance. The singleton lock then refused it and no streamer was left running. Escalate to SIGKILL after the wait and remove the pidfile only once the process is gone. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 642b723 timps: drop libstdc++ on every image, not only with the WebUI The BR2_PACKAGE_TIMPS_DROP_LIBSTDCPP hook sat inside the WebUI+CONTROL block of timps.mk, so headless or CONTROL=n images kept the ~2130 KB library without any message. Move it out of that block. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 438ced5 cameras: disable ircut/irled controls on infiya k1
- beb4879 cameras: add speaker gpio to infiya k1
- 5e245a9 ingenic-sdk: sensor t31/gc2053, fix AE frame model and set_fps bounds
- f8ee816 ingenic-sdk: disable obsolete T41 gc5603 patches, rebase ustream-ssl getrandom fix Two carried patches broke today's package bumps. ingenic-sdk: 0004 and 0005 targeted 4.4.94/sensor-src/t41/gc5603.c, a path that no longer exists after the SDK moved sensor sources to common/sensor/. Both changes are upstream in the pinned b39cf8fb: common/sensor/t41/gc5603.c already resolves MCLK via SEN_MCLK/SEN_BCLK/SEN_TCLK and already publishes video.min_fps/max_fps. Disable the patches in place rather than delete them, following the same cleanup as b53de03. thingino-ustream-ssl: the bump to cea28c5 pulled in upstream e115ee4, which added the !f NULL check to the /dev/urandom fallback. Rebase hunk 2 onto the new pre-image. The patch itself is still required: this toolchain defines UCLIBC and links no getrandom symbol, so a bare call fails at link time. Signed-off-by: Paul Philippov paul@themactep.com
- 5c5d12b scripts/update_packages: drop resolved packages from skip list process_package_no_branch() added every branchless package to SKIPPED_NO_BRANCH before attempting --infer-branch resolution, and never removed it on success. Packages resolved in the run were reported both as updated and as still skipped. Remove the entry once the branch is recorded, and stop suggesting a re-run with --infer-branch when it was already supplied. Signed-off-by: Paul Philippov paul@themactep.com
- b19b91f package/thingino-ustream-ssl: update to cea28c5 Update thingino-ustream-ssl from 99f1c0d to cea28c5 Hash change: 99f1c0db5a729f615bc5114b3b52fd8ac8083f34 -> cea28c5bc43ae80c3531c98f4e4dc67b7dcf0ebb Add _SITE_BRANCH = master (No changelog available)
- a9a1a95 package/thingino-uhttpd: track branch master Add _SITE_BRANCH = master so updates are visible to the package update script.
- 48be096 package/thingino-ubus: update to 9ba1ab7 Update thingino-ubus from 795b32b to 9ba1ab7 Hash change: 795b32bb96b611493f423666236e9c1e49e0736c -> 9ba1ab795b2f427ba0d9b00e27a3e0b343a8410b Add _SITE_BRANCH = master (No changelog available)
- 3f2a827 package/thingino-odhcp6c: track branch master Add _SITE_BRANCH = master so updates are visible to the package update script.
- 2966cb5 package/thingino-libubox: track branch master Add _SITE_BRANCH = master so updates are visible to the package update script.
- eb5301c package/subzeroclaw: update to e39b51b Update subzeroclaw from ab18b78 to e39b51b Hash change: ab18b786da2486a39a680fdcc87d3a08a6c9f5b9 -> e39b51b8eccc1cfc35a209d728df8a32b312ddf1 Add _SITE_BRANCH = main (No changelog available)
- f169b0b package/ingenic-uclibc: track branch main Add _SITE_BRANCH = main so updates are visible to the package update script.
- 9944c64 package/compy: track branch main Add _SITE_BRANCH = main so updates are visible to the package update script.
- dc3e81b scripts: make update_packages to mandate branch for proper tracking of changes
- 8c7df48 package/ingenic-sdk: update to b39cf8f Update ingenic-sdk from 49de610 to b39cf8f Hash change: 49de610995f7dcd03a3f2391dacf87e86d84c3ab -> b39cf8fbbadf4ea03a67d7739f8fcc02960253e3 Changelog: c350345: sensor: fix undeclared prefixed register macros, rename cv2001 t41 ae21a88: sensor: rename prefixed defines and bannerize t23 drivers 96d3d78: sensor: refine section placement for MCLK and TVERSION drivers 63e5128: docs: sensor standardization complete across all trees 486dfc7: sensor: use SENSOR_CHIP_ID instead of hardcoded sensor_attr chip_id 2999696: sensor: remove boilerplate 'the part of driver was fixed' comments 1f7adad: sensor: remove boilerplate 'part of driver maybe modify' comments 5907a1a: sensor: drop stale 'win_sizes' ordering comments c74e7a1: sensor: formatting and cleanup pass (t31 3.10.14 + 4.4.94) 1f3c6fb: sensor: add explicit <soc/gpio.h> and <txx-funcs.h> includes (t31/t40/t41/t41zrt 3.10.14) a1f026f: sensor: fix SENSOR_MAX_WIDTH/HEIGHT to match the output window 07cfb97: docs: record sensor cleanup (garbage comments, includes, SENSOR_MAX) tasks 9225e5a: sensor: gc0328 4.4.94 - fix sensor_attr.chip_id (0x9b -> SENSOR_CHIP_ID/0x9d) ae8be97: sensor: fix hardcoded sensor_attr.chip_id to match the detected id 9228a96: docs: record chip_id hardcode fixes and unverifiable-id notes (task 25) 598a4ed: sensor: remove dead actual_fps plumbing 4d2c5ee: docs: record actual_fps removal (task 26) cd5f7d1: sensor: cv3001 (3.10.14) - drop blank lines left by actual_fps removal e8d11f8: sensor: tidy blank lines left by actual_fps removal; gc032a define order a5334f3: sensor: tidy t31 drivers (blank lines, braces, comments, define placement) 29852bc: sensor: fix pre-existing t31 build breaks (ov9732, sc1346, sc202cs, sc2210, sc2315e) 7735e1e: docs: record pre-existing t31 build-break fixes (task 27) 5379c33: sensor: unify struct regval_list placement and layout 0f35c77: docs: record regval_list normalization (task 28) 6d835fd: audio: restore common/audio/{t10,t20,t21,t30,c100} -> t31 symlinks 6f54988: sensor: align t31/t40/t41 driver include blocks and drop dead again_lut cfea27b: docs: record include alignment, again_lut cleanup and t20 audio fix (tasks 29, 30) c34d7f5: sensor: t40/t41 driver tidy (banners, naming, braces, comments) bbac55f: sensor: t31/t41 driver tidy (banner placement, mipi names, chip_id, comments) ae923e4: sensor: fix stray ')' in jxf32/jxf355p stream-on printk 1ad7b2a: docs: jxf32/jxf355p stray-paren fix, more duplicate-name fixes e30381b: sensor: merge identical t31/t40 drivers into common/sensor-src 8078004: docs: record t31/t40 sensor merge into common/sensor-src (task 31) 08c8acc: sensor: move single-kernel drivers into common/sensor-src too 823fed7: docs: record single-kernel sensor move to common (task 32) 7bd18ce: sensor: add sensor_info registration to 3.10.14 t40/t41/t41zrt drivers 0e9e30a: docs: record sensor_info registration propagation to 3.10 (task 33) a329d75: sensor: restore per-profile sensor_info.max_fps updates in t31 4.4.94 drivers 0fe30aa: docs: record per-profile sensor_info.max_fps restoration (task 34) b0f879a: sensor: fix indentation of restored sensor_info.max_fps lines (ov5695, ps5260) 5c9f824: gitignore: ignore kernel module build artifacts; untrack committed ones 956275b: sensor: fix indentation of restored sensor_info.max_fps lines (sc200ai, sc2232h) a991ea4: sensor: fix indentation of restored sensor_info.max_fps lines (sc2310) e64c96a: sensor: align indentation of all restored sensor_info.max_fps lines 3579afd: sensor: merge 31 identical t31 drivers into common/sensor-src 1aea927: docs: record 31 t31 driver merges into common (task 35) 18e8080: sensor: complete max_fps port and merge 8 more t31 drivers to common f70772e: sensor: drop stale '2304' comment on sc4236 SENSOR_MAX_WIDTH e318877: docs: classify the remaining differing sensor pairs (second run) 548b0d8: sensor: unify logging on the ISP* macros bd0bc5f: docs: record logging unification (task 36) 969b566: sensor: merge t31/os03b10 into common (identical after logging unification) b486fc5: sensor: accumulate sensor_() error codes instead of overwriting c3c157e: sensor: merge t31/sc2239 into common (identical after error-code accumulation fix) a82d3fd: docs: record error-code accumulation (task 37) 6366877: sensor: adopt accumulated ret in sc2335/sc2336 sensor_detect; merge sc2335 to common b51abbb: docs: record sc2335/sc2239 merges (task 38) 34d3c35: sensor: use the private_ shim in gc2053/sc2336 on both kernels 845e036: docs: correct the private_* finding - it exists in both kernels, only 2 files differ (task 39) 40a5d17: sensor: adopt extended gc1084 again_lut (128x) on 4.4.94; merge to common 1f6a4f1: docs: record gc1084 extended-LUT merge (task 40) 157190b: sensor: align sc2239p redundant parens and merge to common f295973: sensor: merge imx327 into common with a kernel-guarded MCLK name 1576fa3: sensor: unify os02g10 Bayer order/shvflip default and merge to common e53fc17: docs: record imx327 and os02g10 merges (task 42) 68ed47b: build: fix common sensor-src resolution so it actually compiles 09e5372: sensor: t40 imx307 capabilities defines; t31 sc2336 kernel-guarded MCLK 7c4a493: docs: record the sensor Kbuild resolution fix (task 43) b87ab1b: sensor/audio: t40 define placement, audio formatting and Kbuild paths 69c06b8: sensor: adopt explicit includes in tp2850 and merge to common 946bcf0: docs: record tp2850 include fix and merge (task 44) 989218e: audio: t40/t41 oss3 style cleanup cee909a: sensor: adopt c23a98 per-profile wsize/max_fps selection; merge to common 2c13aed: docs: record c23a98 merge (task 45) 400c5b3: sensor: align sc401ai shvflip/sensor_resolution defaults and merge to common dc89ad8: docs: record sc401ai merge (task 46) 28947a2: sensor: merge gc2053 with kernel-guarded MCLK name and clk enable 40d4e3f: sensor: merge sc2336 with kernel-guarded MCLK name and clk enable ebd3fb7: docs: record gc2053/sc2336 merges (task 47) 4981592: sensor: merge the four t40 drivers into common 971b796: docs: record t40 completion (task 48) c9b1eee: sensor: add sensor_common_update() and merge 67 t41 drivers to common 6b38a15: sensor: merge six more t41 drivers into common 3e22fb6: docs: record t41 progress (tasks 49-50; only gc5603 left) a8bd783: sensor: merge all 20 t41zrt drivers into common e564649: docs: record t41zrt completion (task 51) 657eabf: sensor: adopt the enhanced sc4236 (3.10.14) and merge to common 1a4e16c: docs: record sc4236 merge (task 52); t31 fully merged 63b47cc: sensor: keep both gc5603 drivers; 4.4 variant as gc5603s0 13c7cdf: docs: record gc5603 dual-driver resolution (task 53); all sensor trees merged 8785fe2: sensor: remove per-kernel sensor-src trees; build everything from common e791093: sensor: fix three drivers that only surfaced once compilation resumed 883dc1b: docs: record full recompile results and the t23 issues a7120bf: sensor: fix t23 drivers that never compiled (sensor_info, max_fps, misc) 0a74930: docs: record t23 fixes dc32851: sensor/isp: fix t20 sensor logging (ISP_INFO/ISP_ERROR) and stragglers 305235f: docs: record t20 logging fix 5ca33c7: sensor: add sensor_info capability to the t30 drivers 8c5fce4: sensor: standardize the 70 legacy t23 drivers 61a8abd: docs: record t30/t23 capability + standardization 1a98a67: sensor: add sensor_info registration to t40 and the t41 legacy drivers 7454794: docs: record t40/t41 sensor_info registration ce0cd37: sensor: drop the redundant '/* END MARKER /' comment on SENSOR_REG_END 04a918a: sensor: drop the remaining '/ END MARKER /' comments 297f450: sensor: add explicit <soc/gpio.h> include to the t23 drivers ed40996: sensor: add explicit <txx-funcs.h> include to all private_ users 518ca95: sensor: fix jxk04 (t40) includes e0399a0: docs: record sensor include normalization 1bda58c: sensor: add SPDX tag, drop redundant GPL paragraph (t23 jxf38p, jxf51) 444ac35: sensor: remove '#define DEBUG' from all drivers ac924d4: sensor: add <soc/gpio.h> to the remaining GPIO users (t20/t21/t30/t31) 49f51c7: sensor: add SPDX license tag, drop the full GPL boilerplate 5ed5916: sensor/t41: tidy license header blocks 3f54a56: sensor: normalize license header blocks dc5cbd7: sensor: add blank line after the header comment block edb39ae: sensor: add header comment block to the SPDX-only drivers 07ea2c8: sensor/t41: join the include groups 0bc9631: sensor/t20: port gc1084 to the t20 legacy ISP API 57a6613: sensor: collapse the per-kernel Kbuild shims into common/sensor-src/Kbuild 816cecf: sensor: rename common/sensor-src to common/sensor b3ae044: licenses: add SPDX tags to the non-sensor drivers, drop GPL boilerplate 60879cf: tools: remove obsolete convert_sensors.sh 1b9c091: t41: fix the pwm/avpu build blockers and 5 sensor compile errors 5149175: sensor/t41: drop the t23-style fsync code from 6 drivers 0d6d983: sensor/t40: fix 14 compile errors f2e8881: build.sh: derive CONFIG_KERNEL_* from the kernel version 88c1709: isp/t20,t30: export isp_printf for sensor modules 2c6adff: sensor-info: registration-only when the ISP owns /proc/jz/sensor 4c2d842: sensor-common: pass the sensor I2C address to the sinfo registry f416b30: sensor-common: publish every family to the tx-isp-sinfo registry d27ecd5: sensor-common(t20): hook i2c_add_driver for the sinfo registry 985e5bf: sensor-common(t23): bind the sensor to the sinfo registry at subdev init f034d3f: sensor-common: fix "gpio request failed" log message 94a8b0d: cv2001: fix set_vflip register address and return-value handling 8da6688: cv4001: fix set_vflip register address and value handling 82affa1: sensor: stop clobbering the flip register value with sensor_read status 18c4b33: sensor: fold the middle ID byte into SENSOR_CHIP_ID 246ab41: sensor: derive sensor_attr.chip_id from SENSOR_CHIP_ID 19189f7: sensor: drop boilerplate comment above sensor_win_sizes 097cfea: sensor: derive MODULE_DESCRIPTION from SENSOR_NAME 502676c: sensor: drop redundant imx219 name line from file header 97ab2d3: sensor: use the unified init_sensor/exit_sensor entry points 70b9b77: sensor: use SENSOR_NAME in the probe-ok log 7526c6a: sensor: use SENSOR_NAME in the stream on/off logs 8a1ec79: sensor: use SENSOR_NAME in the chip-found logs d755916: sensor: use SENSOR_NAME in the remaining part-name log messages 65a7eb6: sensor: drop part-name prefixes from driver-local functions a7d70fb: sensor: use SENSOR_I2C_ADDRESS for cbus_device 8acd2cf: sensor: use SENSOR_I2C_ADDRESS for gc4023 chip_i2c_addr 986f621: sensor: use SENSOR_MAX_WIDTH/HEIGHT in sensor_info e5fa519: sensor: merge the header SENSOR_* define groups into one sorted block d12be02: sensor: finish the header SENSOR_* regroup 67026d5: sensor: drop the "It's the sensor device" comment 6c48dbc: sensor: cleanup pass over the older drivers e22ac70: sensor: normalise LINE argument spacing 615b2bf: sensor: collapse the double space in "sensor_write error %d" 606234c: sensor: remove the space before the argument comma 5bc14b8: sensor: fix the insmod hints' module names ed9b612: sensor: zero-pad single-digit hex in sensor_again_lut d737968: sensor: zero-pad the remaining single-digit hex literals 72d7c3d: sensor: lowercase hex literals d21f1f4: sensor: normalise the gap after // to one space 36458e3: sensor: derive SENSOR_CHIP_ID from the H/M/L macros a0f6a30: sensor: use SENSOR_CHIP_ID for the remaining .chip_id literals 63d09ce: sensor: drop the "convert sensor-gain into isp-gain" comment ea091b6: sensor: fix the again_lut typo in t31/gc2093.c 8f8fa1f: sensor: declare ret before sensor_common_init() in init_sensor 5d12b02: sensor: drop the redundant RAW/Bayer trailing comments 7095483: sensor: use SENSOR_NAME in the chip->name memcpy 7615791: sensor: call sensor_common_exit() last in exit_sensor 3e46524: sensor: remove the no-op sensor_common_exit() 98fa8ac: sensor: reword the sensor read-failure log 1d28934: sensor: fix the "no in range" log message ea1f54b: sensor: driver formatting cleanup 9855195: sensor: return the ioctl status from t23/gc1034.c 500c478: sensor: return the ioctl status from sensor_sensor_ops_ioctl 8df19a1: sensor: tidy the gc2053 locals 165b98d: sensor: initialise val in the remaining sensor_set_fps 85bddf4: sensor: parenthesise value & 0xffff in the "it" locals 2fccfb3: sensor: accumulate the write status across the expo/gain updates 3860992: sensor: log the jxf37 errors with ISP_ERROR 4813a22: sensor: log gpio request failures with ISP_ERROR ecca06c: sensor: initialise tmp in sensor_set_fps 3e18e8d: sensor: use unsigned int hts/vts in sc2235 9e2d23d: sensor: tidy the sc2235 write-error checks 50d96cb: sensor: return 0 from jxh62 sensor_alloc_dgain 101258e: sensor: return 0 from the remaining sensor_alloc_dgain stubs 5cc0d57: sensor: log "sensor_write error" with ISP_ERROR 0cb7e03: sensor: use wpclk/tmp in the gc2053 sensor_set_fps 8c20913: sensor: driver formatting cleanup 1a9bff5: sensor: log "warn: fps(...) not in range" with ISP_ERROR 7f60ee4: sensor: log chip-mismatch and invalid-pointer with ISP_ERROR ece7451: sensor: log more failed-init/probe messages with ISP_ERROR e2c6526: sensor: use ISP_ERROR for the jxf23 chip-mismatch message 8573af5: sensor: call sensor_common_init before private_driver_get_interface 9954e99: sensor: add the missing SENSOR_VERSION to t21/mis2003.c 1d09fce: sensor: unify the unsupported-data-interface message bad7261: sensor: driver formatting cleanup fd9b285: sensor-info: allow the flat vendor tree alongside the ISP registry b39cf8f: sensor: set gc5603 fps limits in sensor_attr_check as well
- 67a0e86 package/ingenic-sdk: update to b39cf8fb Picks up the gc5603 fix that sets video.max_fps/video.min_fps at the end of sensor_attr_check() as well, matching the t41zrt/gc5603.c driver. Signed-off-by: Paul Philippov paul@themactep.com
- 4ee9f47 package/ingenic-sdk: drop gc5603 patches now carried by the SDK The T41/gc5603 clock-name fix (0004) and the min_fps/max_fps fix (0005) were written against the old 4.4.94/sensor-src/t41/gc5603.c layout. fd9b285 moved the drivers to common/sensor/ and already contains both: SEN_MCLK/SEN_BCLK/SEN_TCLK are used for the CIM clocks, and sensor_set_attr() publishes video.max_fps/video.min_fps, with sensor_attr_check() calling it before the first attr sync. The patches no longer have a target and cannot apply, so remove them. Signed-off-by: Paul Philippov paul@themactep.com
- d0e9df7 package/ingenic-sdk: update to fd9b285 Update ingenic-sdk from 49de610 to fd9b285 Hash change: 49de610995f7dcd03a3f2391dacf87e86d84c3ab -> fd9b285ede0f20c9ac53be1f34ed84ab7ad8e351 Changelog: 37ecb8e: docs: 4.4.94 sensor tree fully canonical; t23 remaining c350345: sensor: fix undeclared prefixed register macros, rename cv2001 t41 ae21a88: sensor: rename prefixed defines and bannerize t23 drivers 96d3d78: sensor: refine section placement for MCLK and TVERSION drivers 63e5128: docs: sensor standardization complete across all trees 486dfc7: sensor: use SENSOR_CHIP_ID instead of hardcoded sensor_attr chip_id 2999696: sensor: remove boilerplate 'the part of driver was fixed' comments 1f7adad: sensor: remove boilerplate 'part of driver maybe modify' comments 5907a1a: sensor: drop stale 'win_sizes' ordering comments c74e7a1: sensor: formatting and cleanup pass (t31 3.10.14 + 4.4.94) 1f3c6fb: sensor: add explicit <soc/gpio.h> and <txx-funcs.h> includes (t31/t40/t41/t41zrt 3.10.14) a1f026f: sensor: fix SENSOR_MAX_WIDTH/HEIGHT to match the output window 07cfb97: docs: record sensor cleanup (garbage comments, includes, SENSOR_MAX) tasks 9225e5a: sensor: gc0328 4.4.94 - fix sensor_attr.chip_id (0x9b -> SENSOR_CHIP_ID/0x9d) ae8be97: sensor: fix hardcoded sensor_attr.chip_id to match the detected id 9228a96: docs: record chip_id hardcode fixes and unverifiable-id notes (task 25) 598a4ed: sensor: remove dead actual_fps plumbing 4d2c5ee: docs: record actual_fps removal (task 26) cd5f7d1: sensor: cv3001 (3.10.14) - drop blank lines left by actual_fps removal e8d11f8: sensor: tidy blank lines left by actual_fps removal; gc032a define order a5334f3: sensor: tidy t31 drivers (blank lines, braces, comments, define placement) 29852bc: sensor: fix pre-existing t31 build breaks (ov9732, sc1346, sc202cs, sc2210, sc2315e) 7735e1e: docs: record pre-existing t31 build-break fixes (task 27) 5379c33: sensor: unify struct regval_list placement and layout 0f35c77: docs: record regval_list normalization (task 28) 6d835fd: audio: restore common/audio/{t10,t20,t21,t30,c100} -> t31 symlinks 6f54988: sensor: align t31/t40/t41 driver include blocks and drop dead again_lut cfea27b: docs: record include alignment, again_lut cleanup and t20 audio fix (tasks 29, 30) c34d7f5: sensor: t40/t41 driver tidy (banners, naming, braces, comments) bbac55f: sensor: t31/t41 driver tidy (banner placement, mipi names, chip_id, comments) ae923e4: sensor: fix stray ')' in jxf32/jxf355p stream-on printk 1ad7b2a: docs: jxf32/jxf355p stray-paren fix, more duplicate-name fixes e30381b: sensor: merge identical t31/t40 drivers into common/sensor-src 8078004: docs: record t31/t40 sensor merge into common/sensor-src (task 31) 08c8acc: sensor: move single-kernel drivers into common/sensor-src too 823fed7: docs: record single-kernel sensor move to common (task 32) 7bd18ce: sensor: add sensor_info registration to 3.10.14 t40/t41/t41zrt drivers 0e9e30a: docs: record sensor_info registration propagation to 3.10 (task 33) a329d75: sensor: restore per-profile sensor_info.max_fps updates in t31 4.4.94 drivers 0fe30aa: docs: record per-profile sensor_info.max_fps restoration (task 34) b0f879a: sensor: fix indentation of restored sensor_info.max_fps lines (ov5695, ps5260) 5c9f824: gitignore: ignore kernel module build artifacts; untrack committed ones 956275b: sensor: fix indentation of restored sensor_info.max_fps lines (sc200ai, sc2232h) a991ea4: sensor: fix indentation of restored sensor_info.max_fps lines (sc2310) e64c96a: sensor: align indentation of all restored sensor_info.max_fps lines 3579afd: sensor: merge 31 identical t31 drivers into common/sensor-src 1aea927: docs: record 31 t31 driver merges into common (task 35) 18e8080: sensor: complete max_fps port and merge 8 more t31 drivers to common f70772e: sensor: drop stale '2304' comment on sc4236 SENSOR_MAX_WIDTH e318877: docs: classify the remaining differing sensor pairs (second run) 548b0d8: sensor: unify logging on the ISP* macros bd0bc5f: docs: record logging unification (task 36) 969b566: sensor: merge t31/os03b10 into common (identical after logging unification) b486fc5: sensor: accumulate sensor_() error codes instead of overwriting c3c157e: sensor: merge t31/sc2239 into common (identical after error-code accumulation fix) a82d3fd: docs: record error-code accumulation (task 37) 6366877: sensor: adopt accumulated ret in sc2335/sc2336 sensor_detect; merge sc2335 to common b51abbb: docs: record sc2335/sc2239 merges (task 38) 34d3c35: sensor: use the private_ shim in gc2053/sc2336 on both kernels 845e036: docs: correct the private_* finding - it exists in both kernels, only 2 files differ (task 39) 40a5d17: sensor: adopt extended gc1084 again_lut (128x) on 4.4.94; merge to common 1f6a4f1: docs: record gc1084 extended-LUT merge (task 40) 157190b: sensor: align sc2239p redundant parens and merge to common f295973: sensor: merge imx327 into common with a kernel-guarded MCLK name 1576fa3: sensor: unify os02g10 Bayer order/shvflip default and merge to common e53fc17: docs: record imx327 and os02g10 merges (task 42) 68ed47b: build: fix common sensor-src resolution so it actually compiles 09e5372: sensor: t40 imx307 capabilities defines; t31 sc2336 kernel-guarded MCLK 7c4a493: docs: record the sensor Kbuild resolution fix (task 43) b87ab1b: sensor/audio: t40 define placement, audio formatting and Kbuild paths 69c06b8: sensor: adopt explicit includes in tp2850 and merge to common 946bcf0: docs: record tp2850 include fix and merge (task 44) 989218e: audio: t40/t41 oss3 style cleanup cee909a: sensor: adopt c23a98 per-profile wsize/max_fps selection; merge to common 2c13aed: docs: record c23a98 merge (task 45) 400c5b3: sensor: align sc401ai shvflip/sensor_resolution defaults and merge to common dc89ad8: docs: record sc401ai merge (task 46) 28947a2: sensor: merge gc2053 with kernel-guarded MCLK name and clk enable 40d4e3f: sensor: merge sc2336 with kernel-guarded MCLK name and clk enable ebd3fb7: docs: record gc2053/sc2336 merges (task 47) 4981592: sensor: merge the four t40 drivers into common 971b796: docs: record t40 completion (task 48) c9b1eee: sensor: add sensor_common_update() and merge 67 t41 drivers to common 6b38a15: sensor: merge six more t41 drivers into common 3e22fb6: docs: record t41 progress (tasks 49-50; only gc5603 left) a8bd783: sensor: merge all 20 t41zrt drivers into common e564649: docs: record t41zrt completion (task 51) 657eabf: sensor: adopt the enhanced sc4236 (3.10.14) and merge to common 1a4e16c: docs: record sc4236 merge (task 52); t31 fully merged 63b47cc: sensor: keep both gc5603 drivers; 4.4 variant as gc5603s0 13c7cdf: docs: record gc5603 dual-driver resolution (task 53); all sensor trees merged 8785fe2: sensor: remove per-kernel sensor-src trees; build everything from common e791093: sensor: fix three drivers that only surfaced once compilation resumed 883dc1b: docs: record full recompile results and the t23 issues a7120bf: sensor: fix t23 drivers that never compiled (sensor_info, max_fps, misc) 0a74930: docs: record t23 fixes dc32851: sensor/isp: fix t20 sensor logging (ISP_INFO/ISP_ERROR) and stragglers 305235f: docs: record t20 logging fix 5ca33c7: sensor: add sensor_info capability to the t30 drivers 8c5fce4: sensor: standardize the 70 legacy t23 drivers 61a8abd: docs: record t30/t23 capability + standardization 1a98a67: sensor: add sensor_info registration to t40 and the t41 legacy drivers 7454794: docs: record t40/t41 sensor_info registration ce0cd37: sensor: drop the redundant '/* END MARKER /' comment on SENSOR_REG_END 04a918a: sensor: drop the remaining '/ END MARKER /' comments 297f450: sensor: add explicit <soc/gpio.h> include to the t23 drivers ed40996: sensor: add explicit <txx-funcs.h> include to all private_ users 518ca95: sensor: fix jxk04 (t40) includes e0399a0: docs: record sensor include normalization 1bda58c: sensor: add SPDX tag, drop redundant GPL paragraph (t23 jxf38p, jxf51) 444ac35: sensor: remove '#define DEBUG' from all drivers ac924d4: sensor: add <soc/gpio.h> to the remaining GPIO users (t20/t21/t30/t31) 49f51c7: sensor: add SPDX license tag, drop the full GPL boilerplate 5ed5916: sensor/t41: tidy license header blocks 3f54a56: sensor: normalize license header blocks dc5cbd7: sensor: add blank line after the header comment block edb39ae: sensor: add header comment block to the SPDX-only drivers 07ea2c8: sensor/t41: join the include groups 0bc9631: sensor/t20: port gc1084 to the t20 legacy ISP API 57a6613: sensor: collapse the per-kernel Kbuild shims into common/sensor-src/Kbuild 816cecf: sensor: rename common/sensor-src to common/sensor b3ae044: licenses: add SPDX tags to the non-sensor drivers, drop GPL boilerplate 60879cf: tools: remove obsolete convert_sensors.sh 1b9c091: t41: fix the pwm/avpu build blockers and 5 sensor compile errors 5149175: sensor/t41: drop the t23-style fsync code from 6 drivers 0d6d983: sensor/t40: fix 14 compile errors f2e8881: build.sh: derive CONFIG_KERNEL_* from the kernel version 88c1709: isp/t20,t30: export isp_printf for sensor modules 2c6adff: sensor-info: registration-only when the ISP owns /proc/jz/sensor 4c2d842: sensor-common: pass the sensor I2C address to the sinfo registry f416b30: sensor-common: publish every family to the tx-isp-sinfo registry d27ecd5: sensor-common(t20): hook i2c_add_driver for the sinfo registry 985e5bf: sensor-common(t23): bind the sensor to the sinfo registry at subdev init f034d3f: sensor-common: fix "gpio request failed" log message 94a8b0d: cv2001: fix set_vflip register address and return-value handling 8da6688: cv4001: fix set_vflip register address and value handling 82affa1: sensor: stop clobbering the flip register value with sensor_read status 18c4b33: sensor: fold the middle ID byte into SENSOR_CHIP_ID 246ab41: sensor: derive sensor_attr.chip_id from SENSOR_CHIP_ID 19189f7: sensor: drop boilerplate comment above sensor_win_sizes 097cfea: sensor: derive MODULE_DESCRIPTION from SENSOR_NAME 502676c: sensor: drop redundant imx219 name line from file header 97ab2d3: sensor: use the unified init_sensor/exit_sensor entry points 70b9b77: sensor: use SENSOR_NAME in the probe-ok log 7526c6a: sensor: use SENSOR_NAME in the stream on/off logs 8a1ec79: sensor: use SENSOR_NAME in the chip-found logs d755916: sensor: use SENSOR_NAME in the remaining part-name log messages 65a7eb6: sensor: drop part-name prefixes from driver-local functions a7d70fb: sensor: use SENSOR_I2C_ADDRESS for cbus_device 8acd2cf: sensor: use SENSOR_I2C_ADDRESS for gc4023 chip_i2c_addr 986f621: sensor: use SENSOR_MAX_WIDTH/HEIGHT in sensor_info e5fa519: sensor: merge the header SENSOR_* define groups into one sorted block d12be02: sensor: finish the header SENSOR_* regroup 67026d5: sensor: drop the "It's the sensor device" comment 6c48dbc: sensor: cleanup pass over the older drivers e22ac70: sensor: normalise LINE argument spacing 615b2bf: sensor: collapse the double space in "sensor_write error %d" 606234c: sensor: remove the space before the argument comma 5bc14b8: sensor: fix the insmod hints' module names ed9b612: sensor: zero-pad single-digit hex in sensor_again_lut d737968: sensor: zero-pad the remaining single-digit hex literals 72d7c3d: sensor: lowercase hex literals d21f1f4: sensor: normalise the gap after // to one space 36458e3: sensor: derive SENSOR_CHIP_ID from the H/M/L macros a0f6a30: sensor: use SENSOR_CHIP_ID for the remaining .chip_id literals 63d09ce: sensor: drop the "convert sensor-gain into isp-gain" comment ea091b6: sensor: fix the again_lut typo in t31/gc2093.c 8f8fa1f: sensor: declare ret before sensor_common_init() in init_sensor 5d12b02: sensor: drop the redundant RAW/Bayer trailing comments 7095483: sensor: use SENSOR_NAME in the chip->name memcpy 7615791: sensor: call sensor_common_exit() last in exit_sensor 3e46524: sensor: remove the no-op sensor_common_exit() 98fa8ac: sensor: reword the sensor read-failure log 1d28934: sensor: fix the "no in range" log message ea1f54b: sensor: driver formatting cleanup 9855195: sensor: return the ioctl status from t23/gc1034.c 500c478: sensor: return the ioctl status from sensor_sensor_ops_ioctl 8df19a1: sensor: tidy the gc2053 locals 165b98d: sensor: initialise val in the remaining sensor_set_fps 85bddf4: sensor: parenthesise value & 0xffff in the "it" locals 2fccfb3: sensor: accumulate the write status across the expo/gain updates 3860992: sensor: log the jxf37 errors with ISP_ERROR 4813a22: sensor: log gpio request failures with ISP_ERROR ecca06c: sensor: initialise tmp in sensor_set_fps 3e18e8d: sensor: use unsigned int hts/vts in sc2235 9e2d23d: sensor: tidy the sc2235 write-error checks 50d96cb: sensor: return 0 from jxh62 sensor_alloc_dgain 101258e: sensor: return 0 from the remaining sensor_alloc_dgain stubs 5cc0d57: sensor: log "sensor_write error" with ISP_ERROR 0cb7e03: sensor: use wpclk/tmp in the gc2053 sensor_set_fps 8c20913: sensor: driver formatting cleanup 1a9bff5: sensor: log "warn: fps(...) not in range" with ISP_ERROR 7f60ee4: sensor: log chip-mismatch and invalid-pointer with ISP_ERROR ece7451: sensor: log more failed-init/probe messages with ISP_ERROR e2c6526: sensor: use ISP_ERROR for the jxf23 chip-mismatch message 8573af5: sensor: call sensor_common_init before private_driver_get_interface 9954e99: sensor: add the missing SENSOR_VERSION to t21/mis2003.c 1d09fce: sensor: unify the unsupported-data-interface message bad7261: sensor: driver formatting cleanup fd9b285: sensor-info: allow the flat vendor tree alongside the ISP registry
- 3680c30 linux: fix jz_sfc use-after-free in probe error path jz_sfc_probe() calls kfree(flash) and then dev_set_drvdata(flash->dev, NULL), reading the device pointer back out of freed memory. With SLUB debugging enabled the slot is poisoned, so a failed partition parse turns into an unaligned-access oops at 0x6b6b6b6f instead of a clean -ENODEV. Triggered on the 8MB O-KAM QC3: the generated mtdparts ends in 0k(data), which cmdlinepart rejects ("partition size too small (0)"). Signed-off-by: Paul Philippov paul@themactep.com
- 6d6040f docs: add info on eufy cameras
- e566b93 cameras: drop dead gpio.net, wire ethernet reset via gpio.eth gpio.net was never read by anything: S40network only acts on gpio.eth.{toggle,pin,active_low}. On 15 cameras the entry was a literal copy of gpio.mmc_power and on 2 more it was an empty string, so remove all 17. eufy_t8441 and litokam_m1 (b, bx) only carried the pin under net; rename them to eth with toggle:true so the PHY reset actually runs. Also convert the scalar eth entries on 360_ap6pcm03 and 360_k7ts to the object form with toggle:true, which S40network requires. Signed-off-by: Paul Philippov paul@themactep.com
- bcd54b3 ota: refuse to flash a build whose partitions do not fit pack only warns about partition overflows and still assembles the image. For okam_qc3_t23n_gc2083_aic8800u the rootfs grew to fill the chip, leaving a 0-byte data partition; the assembled image (8395580 B) then exceeded the 8 MiB flash (8388608 B), and make ota flashed it anyway. Add a fatal check-image-fits preflight, wired to every make ota* target. It reuses the pack checks (kernel, data, total image) and adds the bootloader slot, so an oversized kernel or U-Boot is caught too. The full-image flash is also refused on the device before erasing anything when the image is larger than the sum of the real MTD partitions, which covers direct fw_ota.sh invocations. Signed-off-by: Paul Philippov paul@themactep.com
- 0c1dcd1 open-tx-isp: block in the T23 frame-channel wait REGTRACE_FRAMECHAN_WAIT was an empty break, so the legacy TX_ISP_FRAME_IOCTL_LEGACY_WAIT returned immediately. Both userspaces loop on it - libimp's frame_pooling_thread ("FS(N)-tick") and OpenIMP's fs_poll_worker - so they spun flat out. With the stock libimp that is ~90% CPU; with OpenIMP it starves userspace and the watchdog resets T23 in a loop, which is what the Raptor hang looked like. Wait on the driver's own frame-done queue, exactly as regtrace_framechan_repair_dqbuf() does, without consuming the frame (the following DQBUF does) and bounded by a timeout. The queue is set up in tx_isp_core_probe(), before any ioctl. Verified on T23 under the stock libimp: load 3.9 -> 2.4, CPU ~90% -> ~17%, H.264 1920x1080 + AAC unchanged. Signed-off-by: Paul Philippov paul@themactep.com
- d60c4c8 docs: T23 now streams on the open ISP with the stock libimp Record the DisableSensor underflow behind the AddSensor failure, the two fixes, and that T23 attaches the sensor and serves H.264 + AAC. The OpenIMP/Raptor hang on T23 is now the only open T23 item. Signed-off-by: Paul Philippov paul@themactep.com
- a4dffc8 open-tx-isp: report no T23 sensor until libimp registers one The T23 adapter's VIDIOC_G_INPUT handler returned 0 unconditionally, so the vendor libimp saw a sensor before IMP_ISP_AddSensor() had run. The vendor driver reports -1 until a sensor is registered, and libimp uses that to gate its enable/disable bookkeeping. Track registration via VIDIOC_REGISTER_SENSOR/VIDIOC_DEL_SENSOR (both 0x50/0x80 size variants) and report -1 until then. Signed-off-by: Paul Philippov paul@themactep.com
- 529c660 docs: record the open-kernel + vendor-libimp path and the T23 AddSensor gap The open driver under the stock libimp.so isolates the T23 hang to the OpenIMP userspace: the kernel driver stays up there. Document the new provider option, the registry-vs-flat-tree split, and that T23 stops at IMP_ISP_AddSensor = -1 so prudynt never attaches the sensor. Signed-off-by: Paul Philippov paul@themactep.com
- 3c4fdc6 ingenic-sdk: split open-ISP registry ownership from the vendor flat tree The sensor modules serve two consumers on the open kernel driver: the driver's own tx_isp_sinfo registry (both libimp providers resolve a sensor through IMP_ISP_AddSensor -> driver_add/bind, so the sensor-common hook must always feed it) and the vendor flat /proc/jz/sensor/{width,height,max_fps, ...} tree that the stock userspace reads. SENSOR_PROC_OWNED_BY_ISP gated both, so keying it on the libimp provider also switched off the registry hook and IMP_ISP_AddSensor stopped finding a driver. Keep SENSOR_PROC_OWNED_BY_ISP for every ISP_OPEN build and add SENSOR_PROC_PUBLISH_FLAT_TREE for the vendor libimp.so case. Signed-off-by: Paul Philippov paul@themactep.com
- a730031 ingenic-sdk: keep the vendor sensor procfs under libimp on the open driver SENSOR_PROC_OWNED_BY_ISP was keyed on ISP_OPEN, so the open kernel driver always suppressed the sensor module's /proc/jz/sensor tree. That tree is what the vendor userspace reads - prudynt's IMPSystem takes the sensor width/height/max_fps from the flat files - so under the stock libimp.so prudynt read width=0 and libimp died in IMP_FrameSource with an integer divide by zero. Registry ownership is about which userspace layout is needed: OpenIMP and Raptor read open-tx-isp's indexed sensorN/ registry, while the stock libimp keeps the flat tree (as it does under the proprietary ISP). Gate the flag on OpenIMP rather than ISP_OPEN. Signed-off-by: Paul Philippov paul@themactep.com
- 8e227bb thingino-isp: let the open kernel driver keep the Ingenic libimp.so ISP_OPEN always selected OpenIMP on the SoCs it supports, so there was no way to run the open-tx-isp kernel driver under the stock userspace. The driver is built for both (device-tested on T20 and T31), and the pairing matters: OpenIMP exports no IMP_AENC/IMP_ADEC, so prudynt cannot run under it, while the stock libimp keeps the audio codecs - and on T23 it sidesteps the OpenIMP Helix encoder hybrid entirely. Add BR2_PACKAGE_THINGINO_ISP_OPEN_VENDOR_LIBIMP to choose the provider. Default stays OpenIMP wherever it is supported. Signed-off-by: Paul Philippov paul@themactep.com
- ff2a681 docs: record per-family sinfo bind wiring and the T23+Raptor hang The registry bind is wired three different ways (T31 in-ISP, T23 SDK subdev hook, T20 registration patch); spell them out instead of implying one shared shape. Also record that T23 + Raptor hangs at boot while T31/T20 stream, with the classic proprietary+prudynt build as fallback. Signed-off-by: Paul Philippov paul@themactep.com
- 6799ad9 thingino-motors: bump pinned version to e0b7c8c Vector dead-zone hysteresis fix (motor-daemon), companion to the timps/motors-ui WS-only PTZ change. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 4bb4d2d timps/motors-ui: PTZ control over WS only The CGI fallback re-fired every 90ms while a round trip took 82-275ms, so holds backed up in uhttpd's queue and the camera overran the release by ~2s. Every PTZ build in the fleet ships the socket (WS and WS_TLS both default on under timps), so drop the fallback rather than keep a flood-prone path alive. No socket now means no control path, so the widget says so instead of degrading silently. Also gates the joystick's minor axis with hysteresis, so a near-axis hold sends a clean single-axis vector. Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
- be67d3d contrib: add a containerized ZoneMinder test rig Self-built ZoneMinder 1.36.33 image on Ubuntu 24.04, a compose file for podman or docker, and an API helper that registers a camera plus a full-frame zone. Covers live view, motion analysis and passthrough MP4 recording, with ONVIF PTZ for pan/tilt models. Closes three packaging gaps in the image: root-only zm.conf, a placeholder ZM_PATH_FFMPEG, and the CakePHP API's missing rewrite rules. Also installs libdatetime-perl and adds the XML declaration the ONVIF control module omits. Tested with Thingino cameras at 192.168.88.31, .34 and .35: 15 fps capture and analysis on ch0 and ch1, MP4 passthrough recording, and PTZ on .34/.35. Restart ZoneMinder after reflashing a camera so the zmcontrol daemon reconnects.
- c312c7f thingino-onvif: accept SOAP bodies that begin with whitespace mxmlLoadString() is called with a NULL top from init_xml(), and mxml_load_data() then requires the first byte to be '<'. A SOAP body that begins with whitespace and no XML declaration is legal XML but fails that check, so the request is rejected with a ter:InvalidArgVal malformed-request fault. ZoneMinder's ONVIF control module sends exactly that shape, so every PTZ command against the camera returned HTTP 500. Skip leading whitespace before parsing. get_method() already skips non-element siblings, so the Envelope and Body are still found. Verified against the linked mxml 4.0.4 on the host and on a reflashed camera.
- 3b324df open-tx-isp: publish T20 sensors to the tx-isp-sinfo registry The T20 apical registration path (subdev_core_ops_register_sensor) never called tx_isp_sinfo_sensor_bind(), so /proc/jz/sensor/sensorN/ had the pre-bind metadata from the sensor module's driver_add but no subdev: width, height, fps and chip_id read empty and status stayed "loaded". Call sensor_bind()/unbind() at register/release with the sensor's own driver owner, which merges into the driver_add slot (single entry). Verified on T20: sensor0/{width,height,fps,chip_id,status} now populate. Signed-off-by: Paul Philippov paul@themactep.com
- e7e8370 open-tx-isp: provide the pre-refactor SDK layout for the T20 driver The T20 driver includes external/ingenic-sdk/{include,3.10.14/isp/t20, 3.10.14/sensor-src/include} - the pre-refactor ingenic-sdk tree layout. Thingino's SDK override merged those trees under common/, so the T20 build died on missing includes (tx-isp-csi.c, apical-*.c, ...). Recreate the old paths as symlinks for SOC_FAMILY=t20 in a pre-build hook; the other families are self-contained and do not reference external/. Signed-off-by: Paul Philippov paul@themactep.com
- 8f25c4e docs: the sensor registry hook is now family-wide The private_i2c_add_driver() wrapper that publishes SENSOR_I2C_ADDRESS to tx_isp_sinfo_driver_add() lives in every family's sensor-common.h, not just T31, so the pre-bind registry (and Raptor autodetect) works across the open ISP stack. Signed-off-by: Paul Philippov paul@themactep.com
- 131e3f9 thingino-raptor: disable zero-copy refmode for OpenIMP rings rvd publishes H.264 into rss_ring_main in zero-copy refmode by default, which assumes the encoder's output buffers sit inside the ISP rmem reservation. OpenIMP's AVPU encoder allocates them elsewhere, so every frame falls back to an inline copy that the refmode-sized ring cannot hold: the H.264 ring stays empty (rvd reports avg_bitrate 0) and RTSP and the WebRTC preview stay black, while the JPEG path is unaffected. Default [ring] refmode to false when BR2_PACKAGE_OPENIMP is selected; the proprietary libimp allocates from rmem and keeps zero-copy. Signed-off-by: Paul Philippov paul@themactep.com
- e279aac docs: the T31 sensor registry gap is closed The bind path was fine; the missing piece was the pre-bind I2C address. sensor-common.h now passes SENSOR_I2C_ADDRESS via private_i2c_add_driver_addr(), so /proc/jz/sensor/sensorN/i2c_addr is correct before rvd binds the sensor and Raptor autodetects without the per-camera pin. Verified on T31. Signed-off-by: Paul Philippov paul@themactep.com
- c062649 docs: document the /proc/jz/sensor ownership model /proc/jz/sensor is the ISP's indexed sensor registry (sensorN/ + status), which Raptor's multi-sensor model reads. The sensor modules must not create the node too - procfs resolves a duplicated name to the last registrant, so their flat tree shadowed sensorN/ and rvd could not autodetect the sensor. Record the ownership split, the -DSENSOR_PROC_OWNED_BY_ISP gate, and the remaining T31 gap: the open driver never calls sensor_bind, so the slot's attributes (i2c_addr, width/height, max_fps) stay unpopulated and the sensor still has to be pinned in raptor.conf. Signed-off-by: Paul Philippov paul@themactep.com
- cef0a96 ingenic-sdk: let the ISP own /proc/jz/sensor on the open stack The sensor modules create /proc/jz/sensor themselves (common/sensor/common/sensor-info.c). open-tx-isp's tx_isp_sinfo publishes the indexed sensorN/ registry (name, i2c_addr, status) at the same path, which is what Raptor reads - but procfs resolves a duplicated name to the last registrant, so the sensor module's flat tree shadowed sensorN/ and rvd could not autodetect the sensor. All raptor daemons then stayed down and the WebUI preview was black. Pass -DSENSOR_PROC_OWNED_BY_ISP to the module build when BR2_PACKAGE_THINGINO_ISP_OPEN is selected; the sensor module then only registers its attributes and leaves the node to the ISP. Proprietary builds keep the sensor module's tree because their ISP has no registry. Signed-off-by: Paul Philippov paul@themactep.com
- 1a6743a thingino-raptor: fix the BusyBox mktemp templates in the WebUI CGIs The snapshot and MJPEG CGIs allocate their temp files with mktemp /tmp/raptor-*.XXXXXX.jpg. BusyBox mktemp rejects a template with a suffix after XXXXXX ("mktemp: : Invalid argument"), so every /x/ch0.jpg, /x/ch0.mjpg, ... request exits 1 and uhttpd answers 502 - the preview stays black even when frames are flowing. Drop the .jpg suffix; the file contents are what raptorctl writes regardless of the name. Same fix in agent-adapter's snapshot helper. Signed-off-by: Paul Philippov paul@themactep.com
- efbc930 thingino-raptor-common: install the headers the daemons include rsd, rwd and rvd include rss_media_clock.h and rss_vui.h, but the staging install whitelist in thingino-raptor-common.mk never listed them, so the raptor build died on "rss_media_clock.h: No such file or directory". Add both to the header loop. Signed-off-by: Paul Philippov paul@themactep.com
- f0e0ac2 open isp: expose the cross-SoC stack and wire the T23 hybrid OpenIMP builds T20/T21/T23/T30/T31/T40/T41. T23 is a hybrid: OpenIMP's libimp.so serves RAD from /usr/lib while the OEM libimp.so (selected through BR2_PACKAGE_INGENIC_LIB_LIBIMP) and the openimp-t23-helixd worker live under /opt/openimp-t23/ for the proprietary Helix encoder. Wire the missing T20/T21/T30 output dirs and the T23 install, add T10/T20/T21/T30 to the open-tx-isp gate, and correct the help text: T23 was described as having no OpenIMP build, which is false. Signed-off-by: Paul Philippov paul@themactep.com
- 1876a7c build: keep rebuild- fast by skipping target-finalize target-finalize is the slow part of a package rebuild and dominates the loop when iterating on a single package for testing. Stop rebuild- after -reinstall and leave finalization to
make pack, which pulls it in through rootfs-squashfs (fs/common.mk: rootfs-common -> target-finalize) once the per-package install trees are newer than the rootfs. Point the help line at that flow. Signed-off-by: Paul Philippov paul@themactep.com - fddd0d1 cameras: add Sonoff S3W profile
- b6157c9 build: key the env image size to the U-Boot version mkenvimage pads the env to a fixed size that has to match U-Boot's CONFIG_ENV_SIZE; a mismatch makes U-Boot reject the saved env with a bad CRC on every fresh flash. The 2013.07 tree hardcodes 0x8000 in include/configs/isvp_common.h, while the Kconfig-era trees set 0x10000 in configs/uboot/layout/{sfcnor,sfcnand}.config. Pick the value from the selected U-Boot version instead of pinning 0x8000 for all of them. The env partition itself stays 64K on both; only the image size differs. Signed-off-by: Paul Philippov paul@themactep.com
- 0440e73 Makefile: document the .DEFAULT prerequisite pitfall GNU make consults .DEFAULT for prerequisites it cannot remake, not just command-line goals, so a $(wildcard)-listed user uenv file that disappears mid-build gets forwarded verbatim to Buildroot and fails with a confusing "No rule to make target". Spell out where to look first. Signed-off-by: Paul Philippov paul@themactep.com
- f5aba01 uboot env: order loaduenv after autoupdate and gate the recovery env A full SD autoupdate erases the whole chip, env partition included, and resets, so an env imported before flashing would be lost. Prepend autoupdate/loaduenv to the MMC and SFC bootcmds through AUTOUPDATE_PREFIX (empty for 2013.07), and strip them, plus the reset-button hook, on boards without BR2_THINGINO_SDCARD / BR2_THINGINO_BUTTON so the bootcmd does not reference undefined variables. Signed-off-by: Paul Philippov paul@themactep.com
- d79efea build: take the camera's U-Boot board name for the Kconfig defconfig BR2_TARGET_UBOOT_BOARDNAME only selects _config on the legacy build system; the Kconfig tree reads _defconfig from BR2_TARGET_UBOOT_BOARD_DEFCONFIG. Carry the camera's board name into that symbol, and warn when the tree has no matching defconfig instead of silently falling back to the plain SoC one. Signed-off-by: Paul Philippov paul@themactep.com
- c9cd6e7 uboot: touch the env file before RMEM_SET_VALUE THINGINO_UBOOT_RMEM_SET_VALUE greps $(THINGINO_UENV_TXT) before the recipe that creates it has run on some paths (the rootfs-squashfs uboot build), so it printed a misleading "No such file or directory". Touch the file first. Signed-off-by: Paul Philippov paul@themactep.com
- 167b381 cameras: add a profile for Shelly S1 with USB ethernet instead of the wireless module
- 00d5f8b linux: drop unused prebuilt hard-LZMA host tools scripts/ingenic_hardlzma/{lzma,ingenic_mkimage} are x86-64 prebuilts that the vendor diff dumped alongside the real assets. The kernel builds uImage through the stock path: board configs use CONFIG_KERNEL_LZMA, so cmd_lzma pipes vmlinux.bin through the host lzma (Buildroot host-lzma) and scripts/mkuboot.sh wraps the result with mkimage. The Ingenic branch needs CONFIG_KERNEL_JZ_LZMA, which no board sets, and its cmd_jzuimage/cmd_jzhead rules are not even defined; the two shell scripts that would call the tools are referenced by no Makefile. Verified against a built 3.10.14 tree: .config has CONFIG_KERNEL_LZMA=y, .vmlinux.bin.lzma.cmd runs "lzma -9", and .uImage.lzma.cmd runs scripts/mkuboot.sh. Signed-off-by: Paul Philippov paul@themactep.com
- 4c31dee linux: keep binary assets extracted, per kernel version Replace the thingino-binary-assets-.tar.gz bundle with a package/linux/files// tree, mirroring both package/all-patches/linux// and the u-boot package/thingino-uboot/files// layout, and restore it with cp -a instead of untarring. Keyed by KERNEL_VERSION, not LINUX_VERSION: custom-git kernels set the latter to a commit hash that moves on every rebase. The directory test runs in the recipe, where BR2_EXTERNAL_THINGINO_PATH is unquoted; a parse-time $(wildcard) would see the quoted .config value. The core-dump rule in .gitignore also swallowed arch/mips/xburst/core/, so un-ignore that one asset path. Signed-off-by: Paul Philippov paul@themactep.com
- 06fa937 uboot: split add-on binary files for patches by version
- b94dd5d docs: add documentation on ingenic media and open isp stack
- 6958759 docs: update bootloader partition size info
- 2920818 sysupgrade: seed mtdparts from /proc/cmdline when the U-Boot env lacks it flash-ota read the current layout only from
fw_printenv mtdpartsand aborted with "cannot read current mtdparts" when the variable was absent. A device can boot that way -- an env reset, a full-chip flash, or an installer that never seeded the variable -- while the running kernel still built its partitions from mtdparts= on the command line, so the layout was available at /proc/cmdline all along. Fall back to the command line before giving up. Fixes #1540. Signed-off-by: Paul Philippov paul@themactep.com - 9b06bf0 webui: gate agent routing on the agent actually being installed The privacy page chose between the thingino-agent proxy and the legacy per-streamer CGI with
typeof window.agentJsonRequest === "function". That is always true: main.js defines agentJsonRequest unconditionally, so on an image built without thingino-agent the page routed every request through /x/agent.cgi to a listener that does not exist. The privacy toggle silently failed and the "remember runtime settings" checkbox vanished once the doomed request resolved. The raptor streamer helper carried the same check, so its pages had the same failure mode. S48webui-config now publishes window.thinginoUIConfig.device.agent from the presence of the agent init script, and both preferAgent() implementations consult it. A build without the agent falls back to the legacy CGI. Fixes #1552. Signed-off-by: Paul Philippov paul@themactep.com - cde5da6 package/prudynt-t: update to d709269 Picks up the RTSP DESCRIBE 404 for an unregistered stream (#1551). Signed-off-by: Paul Philippov paul@themactep.com
- 57090e9 package/prudynt-t: update to 4313f2a Picks up the session-level c= line in the RTSP SDP (RFC 4566). Signed-off-by: Paul Philippov paul@themactep.com
- bd582ff package/thingino-onvif: update to d6a4b94 Update thingino-onvif from 03e8595 to d6a4b94 Hash change: 03e8595c1ffcb8c2c0c0cbf1af3855fabd42088d -> d6a4b9450d468a8c7ba12474c9701ed92d888872 Changelog: 69e74ea: ptz: use real motor geometry and fix relative-move inversion (#8) d6a4b94: fix(ptz): advertise configured FOV translation space (#9)
- 4deac83 package/prudynt-t: stop the fMP4 preview from leaking memory The player registered error/abort listeners on the SourceBuffer with { once: true } on every appended segment. Those events almost never fire, so the listeners were never removed and accumulated for the life of the page. Because the handler shares its closure with the append closure that captures the segment buffer, V8 kept every appended segment alive: at one segment per second the tab's heap grows past 100 MB and the browser freezes. Tear the listeners down unconditionally (and clear the update timeout) once the SourceBuffer goes idle, and stop retaining the read buffer via subarray. The SourceBuffer was also never trimmed, so MSE held the whole buffered range for the session. Remove media that is more than KEEP_BEHIND_S behind the playhead after each append, and snap back to the live edge if playback drifts more than MAX_AHEAD_S behind it. Signed-off-by: Paul Philippov paul@themactep.com
- c09d96a timelapse-player: bounded-concurrency prefetch ring buffer LOOKAHEAD=3 was shallow enough that a single slow frame let the playhead catch up to the fetch, and evicting in-flight images as the window slid threw away work the camera had already done for them. Deepen the window to 8, never abort a load that's still in flight (only settled ones get evicted), and cap concurrent camera requests at MAX_INFLIGHT=4 so a deep window doesn't burst out all at once. Verified live on the Garage camera: steady playback through a 59-shot sequence including a loop wraparound, no console errors, prefetch capped at exactly 4 concurrent requests at cold start. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 66dabae timelapse: drop Connection: close on frame serving, fix player stutter The player fetches frames back to back; forcing a fresh TCP handshake per JPEG was the dominant cause of playback stutter. uhttpd already keeps the connection alive on its own since Content-Length is set. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- 2e66fee disable busybox short options enforcing
- d71bd01 busybox: enable kernel logger
- e3c12fb busybox: enable long options support
- 61d2947 package/thingino-raptor-hal: update to 8897102 Update thingino-raptor-hal from fd01e76 to 8897102 Hash change: fd01e76e92df2a91d663cde927832ca78dfc8f70 -> 8897102d5f893a5d09b3fa8c96528a8b1dab928d Changelog: 0a214d8: hal: set the camera input mode before adding multiple sensors a6945e2: hal: add every sensor before enabling any 8897102: hal: make the T40 dual-sensor ISP mode configurable
- f254cc9 package/thingino-raptor: update to 3349193 Update thingino-raptor from a6faf5c to 3349193 Hash change: a6faf5cc93a90034ae65dfb6e5348bbb19913f2e -> 334919328b6efaae21150e46b923248c9732919f Changelog: 3349193: rvd: read the T40 dual-sensor ISP mode from [sensor0]
- 5e42b23 package/nino: update to v0.2.1 Update nino from v0.2.0 to v0.2.1 Hash change: v0.2.0 -> v0.2.1 (No changelog available)
- 0af102c package/lightnvr: update to 0.42.3 Update lightnvr from 0.42.0 to 0.42.3 Hash change: 0.42.0 -> 0.42.3 (No changelog available)
- 4c0b118 package/ingenic-sdk: update to 49de610 Update ingenic-sdk from b1d8645 to 49de610 Hash change: b1d8645d7e172434f20490a611c7b7141ce5e7bc -> 49de610995f7dcd03a3f2391dacf87e86d84c3ab Changelog: 49de610: add IQ files for sc200ai, sc231hai, sc2336 harvested from stock images
- 0f34417 fix config path: /dev/thingino.json -> /etc/thingino.json The watchdog json migration and the sysupgrade watchdog-takeover change read the thingino config from /dev/thingino.json, which does not exist. thingino-core installs it as /etc/thingino.json and every other consumer uses that path, so the jct lookups silently returned nothing and the code fell back to fw_printenv defaults. Fix the path in K99watchdog (device/enabled/timeout), F02failsafe (usb.console) and sysupgrade (watchdog.device, both entry paths). Signed-off-by: Paul Philippov paul@themactep.com
- 8daa708 overlay: forward kernel logs to syslogd and set the clock before services start Kernel messages never reached syslogd: the kernel console is the serial port and BusyBox has no klogd, so printk output stayed on ttyS1 and the ring buffer. A crash that resets the CPU therefore left no trace on a remote collector -- the reset-error PC and the reason for the reset were only visible on a serial console nobody was watching. Two scripts fix that: S02kmsgd follows /proc/kmsg and hands each record to syslogd, so kernel messages go wherever syslogd sends everything else. Runs early; it needs no network. S50kmsgdboot dumps the buffered boot log once the network is up. It runs late because syslogd forwards over UDP: anything sent before the interface has an address is dropped without error, which costs exactly the boot messages this is meant to capture. The ring buffer still holds them at S50. S40settime runs after the network but before the services that log, doing a blocking one-shot NTP sync. Without an RTC the kernel comes up on the firmware build time, so every service starting before S49ntpd was timestamped with the build date -- daynightd logs read two days behind on a freshly built image. It reads the same config as S49ntpd, bounds the query with timeout(1) since BusyBox ntpd has no timeout of its own, and returns success on every failure path so an unreachable server delays boot by 3s at most instead of wedging it. Signed-off-by: Paul Philippov paul@themactep.com
- ac723a1 prudynt-t: make the stream watchdog's start/stop idempotent start() spawned a new watch loop unconditionally. If the pidfile was stale -- a restart that raced the previous instance's signal handling, or a loop killed while it was between sleeps -- a second watchdog would run alongside the first and restart prudynt independently. Adopt a live pidfile instead of stacking, and always clear the pidfile in stop() including when the recorded pid was already dead; previously a stale entry was left behind for the next start to read. stop() also waits briefly for the loop to leave its sleep and escalates to SIGKILL. Verified on hardware: repeated start leaves one instance, restart replaces the loop cleanly, a killed loop is re-adopted rather than duplicated, and stop leaves no process and no pidfile. Signed-off-by: Paul Philippov paul@themactep.com
- b7612f7 prudynt-t: give the stream watchdog a real restart limit The limit branch only printed "Restart limit reached, nothing to log..." with an # ALERT! placeholder and then reset the counter, so a streamer that could not be restarted was retried forever at a fixed interval -- roughly every 100s, and every 60s of that was an idle sleep, for as long as the camera ran. Track two counters instead. "consecutive" counts restarts since the stream was last healthy and drives the limit and the backoff; "failures" counts restarts for the current outage and drives the reboot. Recovery resets both and logs how many restarts it took; the backoff resets only "consecutive", so the reboot still fires on a prolonged outage that keeps surviving cooldowns. Escalate the way S52netwatch does: sync, stop feeding /dev/watchdog so its timer expires even if the normal reboot path is wedged, then reboot. With the defaults a streamer that never comes back is rebooted after ~34 minutes, which is slow enough to let a transient fault clear and fast enough that the camera recovers on its own. REBOOT_AFTER=0 leaves the watchdog logging and backing off without rebooting. Signed-off-by: Paul Philippov paul@themactep.com
- 669a0e6 prudynt-t: enable the stream watchdog and fix its health check prudynt has no supervisor: the S32prudyntwd install was commented out, so once the streamer died -- OOM kill, crash, anything -- nothing brought it back and the camera sat with a dead stream until someone noticed. Verified by killing prudynt and watching for 70s: nothing restarts it. The watchdog script itself could not be enabled as-is because its health check reported "down" for a healthy streamer, which would have restarted prudynt every 60 seconds forever: - check_with_curl() used curl's RTSP support, which this build does not have ("Protocol rtsp is disabled"), so it always failed. - check_with_nc() matched only "RTSP/1.0 200", but RTSP now requires authentication by default, so a healthy server answers OPTIONS with 401 and the check failed too. Probe the HTTP API on loopback instead: it is always enabled, needs no RTSP client support and does not depend on the auth mode, and any HTTP status means the server accepted the connection and replied. Keep the RTSP probe as a fallback but accept 401 as "answering". Verified on hardware: prudynt killed with SIGKILL is restarted within ~80s, and a healthy prudynt is left alone across 150s of polling. Signed-off-by: Paul Philippov paul@themactep.com