View this page on MeshCore Docs.
RAK3401 all firmware CPU sleep checks, 21 October 2026
Follow-up: the targeted RAK release checks
record a new Full Room Server PASS at adb11e7b4: three physical LoRa round
trips, 79.31% sampled CPU sleep and zero post-check errors. The original failed
capture below remains unchanged; its RF cause was not established.
All 15 applicable images were installed and measured sequentially on the same RAK3401. All 13 profiles that support power saving passed the CPU sleep capture with PS on. Twelve also passed every runtime check. Full Room Server slept correctly but raised a channel-busy timeout flag, so its overall result remains failed. Terminal Chat and KISS expose no PS setting and showed no sleep. The campaign therefore is not an all-modes qualification pass.
The board is left running Full unified Repeater at efad0076, PS on.
Its final core snapshot had zero error flags and an empty queue. The original
mctomqtt.service and exact USB ownership were restored without changing its
configuration. Updates used application-only packages; the reported bootloader
version is unchanged.
Results
Each row has a complete 90-second CPU capture and an independently matched whole-application readback. Percentages are weighted estimates from sampled processor states, not exact sleep residency or current measurements.
| Firmware/profile | Source | PS | Sleeping/total samples | Sleep estimate | Result |
|---|---|---|---|---|---|
| Full Companion | e16db810 |
on | 5,510/8,000 | 68.78% | Pass |
| USB Companion | e16db810 |
on | 6,115/7,999 | 76.41% | Pass |
| BLE Companion | e16db810 |
on | 5,931/8,014 | 74.03% | Pass |
| Full Room Server | e16db810 |
on | 5,929/8,009 | 74.01% | CPU pass; health flag |
| Reduced Room Server | e16db810 |
on | 5,487/7,980 | 68.67% | Pass |
| Full Sensor | e16db810 |
on | 5,890/7,992 | 73.82% | Pass |
| Reduced Sensor | e16db810 |
on | 6,099/8,028 | 76.00% | Pass |
| Terminal Chat | e16db810 |
unsupported | 0/8,012 | 0.00% | PS unsupported; no sleep |
| KISS modem | e16db810 |
unsupported | 0/8,054 | 0.00% | PS unsupported; no sleep |
| Full Serial1 RS232 repeater | efad0076 |
on | 6,257/8,134 | 76.94% | Pass |
| Reduced Serial1 RS232 repeater | efad0076 |
on | 6,428/8,094 | 79.53% | Pass |
| Full internal-flash OTA repeater | efad0076 |
on | 6,275/8,106 | 77.38% | Pass |
| Reduced internal-flash OTA repeater | efad0076 |
on | 6,138/8,073 | 75.94% | Pass |
| Reduced unified OTA repeater | efad0076 |
on | 6,393/8,019 | 79.69% | Pass |
| Full unified OTA repeater | efad0076 |
on | 5,875/8,013 | 73.19% | Pass |
The safe receipt records application/package hashes, source commits, capability and memory checks, capture flags, timings and final handback health. All 15 capture-integrity checks passed; no halt, step, interrupt masking, lockup or reset was sampled inside any capture window. Debug-control state remained unchanged.
Full Room Server's core.errors changed from 0 to 2 at uptimes 51 and 148
seconds. The value is a bitmask: 0x02 is the latched CAD/channel-busy timeout
flag. The dispatcher bounds its channel-busy wait, records this flag, then
permits a transmit attempt. The observation does not establish the cause of
that busy condition or prove subsequent RF delivery. The CPU capture passed
at 74.01%, but the strict zero-error post-check failed and remains visible.
The failed result was retained, and this unchanged capture was not repeated.
Terminal Chat and KISS have no power-saving command or application idle-sleep integration. Both completed valid captures with zero sleeping observations; they are unsupported PS coverage, not PS-on passes.
Hardware and procedure
The tested assembly is one RAK3401 core with an external RAK13302 radio and no external NOR flash. Coverage includes Full/USB/BLE Companion; Full/Reduced Room Server and Sensor; Terminal Chat and KISS; and Full/Reduced Serial1 RS232, internal-flash LoRa OTA and unified OTA repeaters. The dedicated RAK13302 plus W25Q16 image is excluded because its required external flash is absent. The unified image exercised its no-NOR/internal-storage path.
The nine non-repeater images are bound to e16db810; the six repeaters are
bound to efad0076, after the build corrections below. No claim is made that
all images came from one revision. One application was active at a time, with
an exact application readback before each measurement. No bootloader or
SoftDevice package was installed.
Supported roles acknowledged set powersaving on, confirmed the saved value,
and provided a fresh RAM-only diagnostic window. USB command ports were closed
for capture. Companion intentionally prevents idle sleep with a configured USB
host, so only this target's USB data authorization was temporarily disabled
while retaining power, then restored. BLE sessions were disconnected for idle
capture and authenticated again afterward.
The nonhalting SWD sampler used MEM-AP reads of DHCSR at jittered 7–13 ms intervals for 90 seconds. Sleep acceptance requires at least 5,000 samples, 100 sleeping observations, complete timing and chip-identity checks, unchanged debug controls, and no sampled reset/halt/step/masking/lockup. Read timing must remain within the 10 ms read and 25 ms gap limits. This measures observed CPU sleep states, not just a firmware eligibility counter.
Five early preparations stopped before PS setting or CPU sampling: Full/USB Companion on an arrow-prefixed reply, Full/Reduced Room Server on the first version reply, and Terminal on LF/CRLF handling. The private reader was corrected; a bounded retry of only the read-only version getter retained the first unsupported reply. Their first actual CPU captures appear above, with the earlier failed preparations retained in the JSON. Completed captures were not repeated. An interrupted read-only Sensor application readback was also preserved separately; it did not alter the installed image or repeat a CPU capture.
Build corrections
Commit efad0076
fixes two defects exposed while preparing the matrix. All 15 selected packages
then passed their build, capability and memory gates.
The Full internal-flash and unified repeaters originally missed the required runtime heap reserve by 412 and 564 bytes. Qualified nRF52 repeaters now use the existing grouped Merkle-proof workspace instead of retaining every source leaf: a 1,536-byte allowance replaces 4,096 bytes, saving 2,560 bytes of worst-case active heap. The 1,024-block source capacity, wire proofs, sensors, tables, stack and remaining reserves are retained. No admission gate was lowered.
The Serial1 RS232 recipe already disables GPS because the bridge owns that UART, but its release capability contract incorrectly required GPS. Both RAK3401 bridge profiles now follow the existing UART ownership contract while retaining the INA monitor drivers. Compatible recipes retain their GPS checks. Validation passed 49 RAM tests, four source-proof suites and two GPS-contract tests. The proof suites include sanitized nRF52 Full/Reduced runs through the unchanged 1,024-block maximum, byte-identical proofs, allocation ownership, backpressure and simultaneous fetching/serving.
This finite sleep campaign does not qualify RF delivery, LoRa OTA installation, UART peer traffic, external storage, regulator savings or battery life. Application readback covers the package bytes, not protected storage or user data; an unchanged runtime bootloader version is separate from a full bootloader-byte preservation check.