github liquidraver/ZephCore v20260608.105434
Firmware v20260608.105434

latest release: v20260613.205222
7 days ago

New

Hardware RTC auto-discovery

Out-of-the-box nodes with a battery/cap-backed I2C RTC (DS3231, PCF8563,
RV3028, RX8130CE
) now restore the clock at boot — shown tagged L until
the next GPS / app / CLI sync — and write the time back on every sync so it
survives power-off. Boards opt in via boards/common/rtc-i2c.dtsi; on boards
without it, this compiles to nothing.

First wired up on LilyGo T-Echo and ThinkNode M1.

Buttonless BLE DFU (legacy Nordic/Adafruit OTA jump)

A paired phone can now trigger the jump into the bootloader's BLE OTA mode
directly from the DFU Firmware Upgrade app — no button press needed (nRF52 only). The
service exposes the full legacy DFU characteristic set (Control Point, Packet,
Revision) so iOS's DFU library can discover and identify the device correctly.

Companion needs disconnecting from MeshCore app first!

This was only tested with a handful of nodes and an iOS! This change can introduce errors in other phones I'm not aware of. A BLE bond delete + re-pair should solve it.

BLE TX power bumped to +8 dBm

Raised from +4 dBm → +8 dBm, the max output the nRF52840 / nRF54L
high-power radio front-end supports — better range and link margin for the
companion connection.
This is still under test, but should not cause excessive/noticeable battery drain.

MIT license formalized

Added zephcore/LICENSE (MIT, same as upstream MeshCore) and flipped the
SPDX-License-Identifier header across the source tree from Apache-2.0 to
MIT. Vendored dependencies that carry their own compatible licenses
(Monocypher, Zephyr patches) are noted at the bottom of the license file.

Fixed

  • Companion startup races — initial-advert handling and contact-table
    iteration were running on sysworkq while the main thread mutated the same
    mesh/contact state, a race that could corrupt state or wedge the contact
    dump. Both now run on the main thread, driven through the event loop
    (MESH_EVENT_CONTACT_ITER), same as the rest of the mesh state machine.

  • Hardware-RTC writes no longer race the main loopzephcore_rtc_save()
    is now routed through the same deferred-to-main-thread mechanism as prefs
    flushes (MESH_EVENT_RTC_SAVE). GPS fixes land on the GNSS modem-chat thread
    and just stash the latest epoch; the actual blocking I2C write happens on the
    main thread, coalescing multiple pending fixes into one save.

  • MAX_ANON_CONTACTS cap fixed — transient/anon contact slots (e.g.
    created for BLE direct-message lookups to non-contact pubkeys) were being
    capped by MAX_CONTACTS instead of their own larger allotment, causing
    premature slot exhaustion/eviction.

  • XIAO nRF54L15 build fixed.

Internals

  • ZephyrCompanionUSB — assembled V3 frames now wake the main thread via
    k_event instead of k_work_submit on sysworkq, matching the BLE RX path
    and removing a parse-vs-loop() race.

  • Buttonless DFU now hard-depends on SOC_SERIES_NRF52 (was a soft
    default y). Other nRF52-only paths (bootloader-version scan, VBUS detect,
    formatter/updater tools) were cleaned up to drop the redundant
    SOC_SERIES_NRF52X checks.

  • West Update — Zephyr updated to 4.4.1-rc1

Don't miss a new ZephCore release

NewReleases is sending notifications on new releases.