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 onsysworkqwhile 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 loop —
zephcore_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_CONTACTScap fixed — transient/anon contact slots (e.g.
created for BLE direct-message lookups to non-contact pubkeys) were being
capped byMAX_CONTACTSinstead 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_eventinstead ofk_work_submitonsysworkq, 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_NRF52Xchecks. -
West Update — Zephyr updated to 4.4.1-rc1