Recovery¶
What to do when an update does not go the way it should.
This page is deliberately thin in places. FLASHING.md covers the happy path, and the honest
position is that several of the failure modes below are not documented anywhere this project
has evidence for — including by the vendor. Where that is the case it says so rather than
implying a procedure exists. Claims are tagged as in
Hardware verification:
- observed — seen on hardware
- read — decoded from the firmware or the package manifests
- unknown — stated neither here nor, as far as this project has found, by anyone
The one rule
Do not remove the stick and do not cut power until the unit reboots. The update takes over 20 minutes and reboots several times on the way. Interrupting it is the way to reach the states this page cannot fully answer for.
Before you start, so you do not need this page¶
Two things, both cheap, both covered in Flashing:
python3 tools/verify_package.py --package out/SMEG_PLUS_UPG
python3 tools/prepare_usb.py --package out/SMEG_PLUS_UPG --target /Volumes/USB
The first audits every checksum the package carries against the file it describes. The second copies to the stick and re-reads every file back off it to prove the copy is not truncated. A truncated copy is the failure most likely to be mistaken for a firmware fault.
And keep a rollback: an untouched copy of the original package, audited too. A rollback you
have not checked is not a rollback. Copy it with prepare_usb.py so the same verification
applies. (observed — a re-sealed patched package was accepted by a real unit)
The unit refused the update and showed an error¶
Nothing was written. This is the good failure: the unit validates before it writes, so a
refusal leaves the unit exactly as it was. (read — the rejection path in CheckTrustedSource
only raises a popup; the refusal itself was not reproduced on the test unit)
Validated before writing — but not before running stick code
The contract check runs after the unit has already loaded UpgPlugin.out from the
stick and called four of its functions (read, LoadUpgradePlugin; see
The update flow). That does not
change the point above: nothing is written to the unit before the contract passes.
This project's tools never modify UpgPlugin.out, so a package built here runs only the
vendor's plugin, byte for byte.
| what you see | what it means |
|---|---|
| 2099, "The update file is protected and cannot be copied." | the package does not match its signed contract. It was modified without being re-sealed. Rebuild with seal: true, or run tools/patch_contract.py. (read) |
(UpgradeTask) The version on media.inf not allows an upgrade |
the version field in media.inf blocks this upgrade. A wrong value there blocks the package rather than warning about it. (read) |
Upgrade not possible!! value is too high |
as above — the version gate. (read) |
(GetUBootVersionMedia): field 'VER:' not found! |
the package's version field is missing entirely. (read) |
Error loading symbol WriteNANDBigQuick, it's an old BSP!!! / BSP Not compatible. Please use the loader button... |
see below. (read) |
VerifyNANDBigQuick : CRC of data BigQuick is NOK |
the image failed its CRC check on the way to NAND. (read) |
The unit re-offers the update when a valid stick is present — the confirmation dialog was
seen a second time after the unit had already updated and come back up. (observed) The
cause is read: at every start-up C_BCM_UPGRADE::StartUp probes /bd0–/bd5, and if
SMEG_PLUS_UPG/UpgPlugin.out is on a mounted device the whole flow starts again. Take the
stick out once the update has finished.
What is not known: whether a refused package triggers any retry loop, and what state the
unit settles into after repeated refusals. The updater does keep a persisted step counter,
which implies a re-run resumes rather than restarts. That is a reading of upgrade.out, not an
observed behaviour. (read; behaviour unknown)
"BSP Not compatible. Please use the loader button"¶
The unit's own message, and the most useful one it gives you. It appears when the running BSP
is too old to export the NAND write routine the updater needs — the updater literally reports
Error loading symbol WriteNANDBigQuick before it. (read)
The fix is to get a newer BSP onto the unit, which is what the message is asking for. The loader is the level below the application, so it can still be reached when the application cannot.
What this page will not do is invent a button sequence. The message names a loader button; where it is on the fascia, what it does electrically, and the exact procedure to enter the loader are not documented in this project and were not decoded from the firmware. If you are in this state, that is the question to ask before acting, and anyone answering it confidently without a source is guessing. (unknown)
Related, and slightly better understood: upgrade_256.out is the 256-unit relauncher (its
own string is "Relaunch For 256"), sitting beside upgrade.out as an entry module. (read)
A unit that will not boot¶
There is no documented procedure here. Nothing in this project describes recovering a unit
that no longer reaches its application, and the vendor strings do not cover it either. The
general risk statement in the repository's SECURITY.md is the accurate summary: a bad build
can leave a unit needing recovery or dealer service. (unknown)
Two things are worth knowing anyway, because they are the mechanisms a recovery would use, even though the procedure is not written down:
- the update is incremental — an already-current unit reports the boot ROM as done and skips the Renesas MCU, and rewrites the application only when its content differs (read);
- the updater carries a persisted step counter, so a re-run does not necessarily start from the beginning. (read)
Power loss mid-write¶
Unknown, and the most consequential unknown on this page. The repository states the
requirement clearly — engine running, Keep the engine running. on screen, no power loss, no
stick removal — and it states that the unit reboots at several points during the update.
(observed/read)
What it does not state is what a partial write leaves behind, or whether re-flashing recovers it. There is no claim here that it does. Treat power loss during a write as the case with the least known recovery path, and act accordingly.
Wrong-variant stick (256 vs 512)¶
256 and 512 are the NAND/board size, not a firmware feature level. The updater picks a BSP
tree from the hardware type (SMEG_PLUS_256/ vs SMEG_PLUS_512/). A package shipping both has
the variants side by side. (read)
Two cross-checks exist and are worth knowing, because they are what would stop a wrong-variant stick:
dbsystem.binembeds the matchingvxWorks.binCRC32 and a leading byte equal to the top byte of the load address (0x72for 512,0x42for 256). It is a size/CRC/block-count descriptor used to cross-checkvxWorks.binbefore flashing — the firmware logsVxWorks.bin parameters in dbsystem are (size: … crc: … Nb blocks = …). (read)flasher.inflists path, load address and CRC per line, withflasher.crcthe CRC32 offlasher.infitself. (read)
What is not known: whether those checks actively refuse a mismatched stick, and how the
unit reads its own hardware type — the selection is GetHWType, and it has not been traced.
dbsystem.bin's exact field offsets are also unpinned. So: do not rely on the unit to catch a
wrong-variant stick. Check the variant yourself before you start. (unknown)
See also¶
- Flashing — the procedure, and the two checks worth running first
- Boot & update chain — every gate the updater passes, and its strings
- Media protection — why 2099 exists and what re-sealing does
- Hardware verification — what has actually been observed