diff --git a/docs/ota_station_g2_to_ikoka_stick.md b/docs/ota_station_g2_to_ikoka_stick.md index d4e49e818..04df9d3be 100644 --- a/docs/ota_station_g2_to_ikoka_stick.md +++ b/docs/ota_station_g2_to_ikoka_stick.md @@ -160,6 +160,90 @@ application update needs no copy of the old firmware. This locally packaged application is unsigned and uses explicit manual installation; the separate bootloader package remains signed. +
+Optional: differential firmware upgrade (smaller download) + +A differential update sends a patch from the Ikoka Stick's exact running +application to the new application. It can reduce LoRa transfer time. The +bootloader update in step 7 still uses the signed full bootloader package. + +Prepare the new binary and full package above first. Use this option only +when you also have the **original application DFU ZIP for the firmware +currently running on the Ikoka Stick**. A matching version label or a rebuild +of the same commit is not enough. If that original file is unavailable, use +the full update above. + +On **Ikoka Stick — Repeater Admin**, get its current identity: + +```text +ver +ota self +``` + +Copy the original application DFU ZIP onto **Raspberry Pi** as +`downloads/ikoka-stick-33dbm-repeater-running.zip`. In the Pi terminal, paste +the 16-character `base_hash` from that fresh `ota self` reply when prompted: + +```bash +read -r -p 'Current Ikoka Stick base_hash (16 hex characters): ' IKOKA_BASE_HASH +export IKOKA_BASE_HASH +python3 - <<'PY' +import hashlib, json, os, re, struct, zipfile +from pathlib import Path +expected = os.environ['IKOKA_BASE_HASH'].strip().upper() +assert re.fullmatch(r'[0-9A-F]{16}', expected), 'Invalid base_hash' +with zipfile.ZipFile('downloads/ikoka-stick-33dbm-repeater-running.zip') as archive: + app = json.loads(archive.read('manifest.json'))['manifest']['application'] + image = archive.read(app['bin_file']) +trailer = image[-56:] +assert len(trailer) == 56 and trailer[:4] == b'EndF', 'Missing EndF' +assert struct.unpack_from(' flash`, +then `ota install` when ready. The target's `base_hash` must still match +immediately before that pull. Updating only the bootloader in step 7 leaves +the running application unchanged, so it does not invalidate the delta base. +After installation, check the same new firmware version and expected +post-install body hash printed earlier in step 3. + +
+ ## 4. Identify the Station G2's USB port On **Raspberry Pi — terminal**: diff --git a/mkdocs.yml b/mkdocs.yml index f107884f0..bd9545c08 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -112,6 +112,9 @@ nav: - Older releases: old-releases/index.md - Test Results: test-results/index.md +markdown_extensions: + - md_in_html + theme: name: material logo: _assets/meshcore.svg