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

latest releases: firmware-2026-09-14, firmware-2026-09-10, master-2026-08-25...
pre-releaseone month ago

Changes in this release:

  • 08dc225 thingino-uboot: park IR-cut filter coils at boot Add gpio.ircut (and gpio.ircut_sub) to the boot-window GPIO presets: the filter solenoid sits behind an H-bridge whose inputs float from power-on until the runtime takes over, which can leave a coil partially energised and heating. Park every ircut pin at the /usr/sbin/ircut idle level - dual-pin boards rest both pins at idle between the 10ms pulses and single-pin boards de-energise at the open level, so both reduce to active_low ? HIGH : LOW per pin. The parser mirrors /usr/sbin/ircut exactly: scalar pins, token sequences, {pin, active_low} objects, lists, per-token o/O suffixes (which mean pin POLARITY here - "57o" = active-low = idle HIGH - unlike the drive-level suffixes of gpio.wlan/mmc_power), the 999 tmi8152 kernel-shim sentinel (no gpio), and -1 disabling the whole domain. Swept all 222 build units: strictly additive - every previously emitted node is preserved and only ircut hogs are added (378 pins: 370 low, 8 high on the tapo c500/tc70 suffixed and tapo c100/c110 object boards). No ircut pin collides with an MMC/button DT binding or sits in any U-Boot pinctrl group. Build-verified on personal_campan: ircut_52/ircut_53 output-low in u-boot.dtb next to the 8 motor-park hogs, none in SPL.
  • 96d1311 package/ingenic-lib: install libsysutils only when selected No libimp variant in any SoC/SDK/libc combination links or dlopens libsysutils.so, and nothing in the tree links -lsysutils. The default y kept it shipping in every non-a1 image (5.6 KiB flash) since the per-lib split. Default it off and gate the staging install on the same option.
  • f7755ef thingino-uboot: never hog a pin owned by an MMC/button DT binding A gpio-hog claims its pin at DM init, so a pin that inject-uboot-mmc-dt.sh also turns into a DT binding (gpio.mmc_cd -> cd-gpios, single-object gpio.mmc_power -> vmmc regulator, gpio.button_reset -> gpio-keys) would make the binding's own gpio request fail and break that subsystem. cinnado_b6 hits this today: its config lists pin 61 as both mmc_cd and a motor phase (config bug, reported to the author), and since the motor coil-park commit the hog has been stealing card-detect from the mmc core in U-Boot. Skip such pins with a build-log note instead - the binding wins, and once the config is fixed the guard is a no-op. Also collapse the same pin appearing in several hog domains to its first occurrence. Re-proven over all 222 build units: cinnado_b6 dropping motor_park_61 is the only output change.
  • 738f749 configs: normalize legacy mmc_power notation in cameras-exp Same conversion as the main cameras tree: 8 bare-int mmc_power entries become {pin, active_low: false} objects (bare token = drive high in S09mmc). Proven by replaying get_mmc_power_sequence with host jct over old and new configs: 8/8 identical drive sequences. These boards build through the same U-Boot inject hooks, and the bare-int shape never reached the vmmc-supply injection.
  • e32d932 thingino-uboot: unify boot-window GPIO presets in one inject script Replace inject-uboot-motor-dt.sh and inject-uboot-wlan-dt.sh with inject-uboot-gpio-dt.sh, one gpio-hog injector for everything whose job is "drive pin X to level Y and hold it through boot": - motors.gpio_pan/gpio_tilt parked at the kernel driver's de-energised level (gpio_invert aware), as before - gpio.wlan at the final resting level of the S36wireless sequence, as before - NEW: gpio.mmc_power list form - boards whose SD slot needs more than one supply/enable pin get each pin hogged at its power-on level (active_low aware). The single-pin object form intentionally stays in inject-uboot-mmc-dt.sh as a vmmc-supply regulator: the mmc core sequences slot power itself there, which a static hog cannot, but a fixed regulator can only own one gpio, so multi-pin boards get hogs. The two per-domain mk hooks and their config gates collapse into one ungated hook (still skipping the 2013.07 vendor U-Boot, which has its own env-driven gpio_default path). Safe: an audit of all 169 camera configs found zero cameras where a domain emits hogs without its old gate symbol set (BR2_THINGINO_MOTORS / BR2_PACKAGE_WIFI), so gating purely from json content changes no board's output. The script also dedups repeated pins; 9 cameras list identical gpio_pan and gpio_tilt, which previously emitted duplicate same-named nodes that dtc merged - the compiled dtb is identical either way. Proven by regenerating every camera's injection with the old scripts and the new one: 169/169 node-identical after dedup, the only additions being the mmc_power hogs on the 5 multi-pin boards (hl_jdpan01, tapo c100 t23n, wyze_campan2, wyze_vdb2, xiaomi mjsxj05hl). Build-verified on personal_campan (dict mmc_power: vmmc regulator + 8 motor hogs, unchanged) and wyze_campan2 (8 motor + wlan_58 + mmc_power_47/54 hogs in u-boot.dtb, none in SPL).
  • 876c3bb configs: normalize legacy gpio token notation to active_low objects The o/O drive-level suffix tokens ("mmc_power": "47o 54o", bare-int "mmc_power": 17) are vendor gpio_default notation; the proper thingino convention is the {pin, active_low} object like the other 31 mmc_power entries already use. Convert: - 17 bare-int entries -> {pin, active_low: false} (bare token = drive high in S09mmc parse_legacy_token) - 5 token strings -> arrays of {pin, active_low} objects (o = drive low = active_low true, O = drive high = active_low false), a shape S09mmc's indexed gpio.mmc_power.N walk already parses natively - ajcloud_cp8040 "wlan": "47O 47o" (high-then-low pulse) -> {pin: 47, active_low: true, toggle: true}, matching its cp2011/cp8010 siblings (S36wireless emits the identical pre-pulse sequence for both forms) Proven equivalent by replaying the real consumers over old and new configs: get_mmc_power_sequence (S09mmc) and get_wlan_sequence (S36wireless) run with host jct produce byte-identical drive sequences for all 23 touched cameras.
  • 926072e Generate release artifacts on the MMC boot path The MMC0_BOOT branch of pack: only printed dd instructions and never ran generate_release_artifacts.sh, so no .bin.sha256sum was written. The NAND and NOR branches both call it. firmware-master sets FULL_FW_SHA=${FULL_FW}.sha256sum unconditionally and passes it to gh release upload, which failed the wanjiaan_hdc51 mmc job with "no matches found for ...bin.sha256sum". Previously masked by the earlier parted failure, which killed the job before the release step.
  • 869277b thingino-uboot: preset Wi-Fi module GPIO at boot via gpio-hog Some Wi-Fi modules need their power/enable line at a defined level before Linux is up: SDIO parts must be powered so the kernel MMC scan can enumerate them, and S36wireless drives gpio.wlan only on 3.10 kernels, late in boot. Until then the pin sits at the SoC reset default. Add inject-uboot-wlan-dt.sh (sibling of inject-uboot-motor-dt.sh): it reads gpio.wlan from the board's thingino.json in every shape S36wireless.in accepts - bare pin, suffixed token (47o/47O/47t), token sequence, {pin, active_low, toggle, action, state} object, or a list of those - and appends a gpio-hog per pin to this board's U-Boot leaf .dts at the final resting level of the runtime sequence (active_low aware, explicit state wins). A pin whose last action is a toggle depends on prior state and cannot be a static hog, so it is skipped; an object's toggle flag only prepends a pulse and does not change the resting level. The hook is gated on BR2_PACKAGE_WIFI, skips the 2013.07 vendor U-Boot (env gpio_default covers it there), and enables CONFIG_GPIO_HOG so U-Boot acts on the hogs. Hogs land in U-Boot proper only, not SPL. Swept over all camera configs: 121 of 122 gpio.wlan entries emit a hog (90 high / 31 low), the -1 entry emits nothing, and no wlan pin overlaps mmc_cd/mmc_power on any board. Build-verified on personal_campan (no gpio.wlan: clean no-op, motor hogs intact) and wyze_campan2 (wlan 58 -> output-high in u-boot.dtb alongside the 8 motor-park hogs, none in SPL).
  • 55d4d2d Record thingino.json in the build report Nothing in .config carries what is in it. On a pan camera not one of the twelve GPIO values in thingino.json appears anywhere in the expanded config, and the Kconfig options that look like they should hold them are empty strings, so the build report suggested no pins were assigned when the device had them. buildscope v0.1.9 adds --capture for this. Attempted rather than assumed: the copy on PATH may predate the flag, and an unknown argument would cost the whole report rather than just the capture, so a failure falls back to the plain scan.
  • 684421d raptor: do not default RWC on for DWC2_OTG cameras DWC2_OTG only describes the USB controller mode, it does not make the device a webcam.
  • fa0f81a Pin buildscope v0.1.8 Reads the device tree inside a compressed bootloader, so a board tree with its GPIO configuration is reported instead of only the loader tree.
  • 6d28521 package/thingino-sensor-info: bump to 625667a Size-optimized build: packed table, 32-bit kHz clock math, LTO, non-PIE, -mno-abicalls. All features intact.
  • 77a2ff5 package/thingino-sensor-info: -mno-abicalls -mplt
  • e0e665f package/thingino-sensor-info: enable lto
  • a3e7d7c package/thingino-sensor-info: build non-PIE 5% smaller compressed; ASLR protects nothing in a root-run offline diagnostic.
  • 97391fa package/thingino-sensor-info: pass the size flags buildroot omits The package overrides CFLAGS/LDFLAGS on the make command line, so the repo Makefile's section-GC flags never reached firmware builds. TARGET_LDFLAGS already carries max-page-size; this adds -ffunction-sections/-fdata-sections, --gc-sections, and the unwind/ident/constant-merge trims.
  • bbd8a54 thingino-raptor: bump pins for backchannel and refmode ring fixes rsd 707376dc8ae6d25e8067b205c01a2cfa01b3bf7b: backchannel created a consumer handle for the speaker ring whenever one already existed -- rac playing a file, or a second client -- and every publish then failed -EINVAL in silence, so two-way audio stopped working with no error. It creates the ring now, as the producer of that audio. raptor-ipc 30d32b99a7fac17d0c7b4e7cd7bc881a4f99eb80 extends the publish bounds fix to the refmode path, which is the one devices run: the slot array lives in the producer's own mapping, so a ring re-created with more slots would index past its end. Both trees pass ASan and TSan; the z55 battery is clean across all nine passes with these binaries.

Don't miss a new thingino-firmware release

NewReleases is sending notifications on new releases.