mirror of
https://github.com/mikecarper/MeshCore.git
synced 2026-09-16 06:32:35 +00:00
406 lines
21 KiB
Markdown
406 lines
21 KiB
Markdown
# Firmware picker
|
|
|
|
Each result now includes **Restore your settings after flashing**. Its commands
|
|
follow the selected logging mode and the exact image's verified role/hardware
|
|
controls. Select On, Off, or Check to view and copy the commands; Companion
|
|
MQTT and GPS show their app/WebConfig steps instead. See
|
|
[feature switches by role](role_feature_switches.md) for the full reference.
|
|
The [USB web console](https://flasher.meshcore.io/console) works with the
|
|
default ASCII terminal on Full Companion and infrastructure roles.
|
|
|
|
Pick the choices in any order. Every selection narrows all the other controls
|
|
to firmware combinations that were actually built in the current release set.
|
|
The optional chip-family filter (ESP32, nRF52, RP2040, or STM32) can narrow the
|
|
hardware list first. You can skip it: picking hardware fills it in automatically.
|
|
|
|
The picker reads public release metadata from GitHub. It does not upload device
|
|
information. Hardware names, target names, and download links come directly
|
|
from the published firmware assets.
|
|
|
|
<div class="firmware-picker" data-firmware-picker data-release-repo="mikecarper/MeshCore" data-controls-url="../_data/firmware_controls.json" data-share-url="https://mikecarper.github.io/MeshCore/firmware_picker/">
|
|
<div class="firmware-picker-intro" role="note">
|
|
<strong>Current release set</strong>
|
|
<p data-role="release-set">Loading release information...</p>
|
|
<p>
|
|
For a new installation, choose the exact board and role, prefer a
|
|
<strong>FULL / complete profile</strong> when it is available, and select
|
|
<strong>Full install / layout migration (merged .bin)</strong>. Narrower profiles
|
|
remain available when their reduced transport or feature set is intentional.
|
|
</p>
|
|
</div>
|
|
|
|
<p class="firmware-picker-order-note">
|
|
Pick in any order. Use <strong>Any</strong> to clear one choice, or clear
|
|
everything with the button below. The address bar updates with your choices;
|
|
copy its URL to reopen or share the same selection.
|
|
</p>
|
|
|
|
<form class="firmware-picker-form" data-role="form">
|
|
<details class="firmware-picker-chip-family firmware-picker-wide">
|
|
<summary data-role="chip-family-summary">Optional: chip family</summary>
|
|
<p id="firmware-picker-chip-help">Skip this if you know your board. Picking hardware selects its chip family automatically. Choose Any to clear this filter.</p>
|
|
<div class="firmware-picker-control firmware-picker-select-control">
|
|
<label for="firmware-picker-chip-family">Chip family</label>
|
|
<select id="firmware-picker-chip-family" data-field="chipFamily" aria-describedby="firmware-picker-chip-help" disabled>
|
|
<option value="">Any chip family - skip this filter</option>
|
|
</select>
|
|
</div>
|
|
</details>
|
|
|
|
<div class="firmware-picker-control firmware-picker-select-control">
|
|
<label for="firmware-picker-hardware-family">Hardware</label>
|
|
<select id="firmware-picker-hardware-family" data-field="hardwareFamily" disabled>
|
|
<option value="">Loading hardware...</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="firmware-picker-control firmware-picker-select-control" data-role="hardware-variant-control" hidden>
|
|
<label for="firmware-picker-hardware">Hardware variant</label>
|
|
<select id="firmware-picker-hardware" data-field="hardware" disabled>
|
|
<option value="">Choose hardware first</option>
|
|
</select>
|
|
</div>
|
|
|
|
<fieldset class="firmware-picker-control firmware-picker-radio-control firmware-picker-wide" data-radio-field="install" disabled>
|
|
<legend>Install operation</legend>
|
|
<div class="firmware-picker-radio-options" data-field="install">
|
|
Loading install choices...
|
|
</div>
|
|
</fieldset>
|
|
|
|
<fieldset class="firmware-picker-control firmware-picker-radio-control" data-radio-field="role" disabled>
|
|
<legend>Firmware role</legend>
|
|
<div class="firmware-picker-radio-options" data-field="role">
|
|
Loading roles...
|
|
</div>
|
|
</fieldset>
|
|
|
|
<fieldset class="firmware-picker-control firmware-picker-radio-control" data-radio-field="logging" disabled>
|
|
<legend>Logging / MQTT</legend>
|
|
<div class="firmware-picker-radio-options" data-field="logging">
|
|
Loading logging choices...
|
|
</div>
|
|
</fieldset>
|
|
|
|
<fieldset class="firmware-picker-control firmware-picker-radio-control" data-radio-field="ota" disabled>
|
|
<legend>OTA capability</legend>
|
|
<div class="firmware-picker-radio-options" data-field="ota">
|
|
Loading OTA choices...
|
|
</div>
|
|
</fieldset>
|
|
|
|
<div class="firmware-picker-control firmware-picker-select-control">
|
|
<label for="firmware-picker-mode">Connection / bridge mode</label>
|
|
<select id="firmware-picker-mode" data-field="mode" disabled>
|
|
<option value="">Loading modes...</option>
|
|
</select>
|
|
</div>
|
|
|
|
<fieldset class="firmware-picker-control firmware-picker-radio-control" data-radio-field="feature" disabled>
|
|
<legend>Feature profile</legend>
|
|
<div class="firmware-picker-radio-options" data-field="feature">
|
|
Loading profiles...
|
|
</div>
|
|
</fieldset>
|
|
|
|
<div class="firmware-picker-control firmware-picker-select-control">
|
|
<label for="firmware-picker-variant">Firmware variant</label>
|
|
<select id="firmware-picker-variant" data-field="variant" disabled>
|
|
<option value="">Loading variants...</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="firmware-picker-form-actions firmware-picker-wide">
|
|
<button type="reset" data-action="clear" disabled>Clear all choices</button>
|
|
<button type="button" data-action="copy-link" disabled>Copy link to settings</button>
|
|
<a data-role="share-link" hidden>Link to these settings</a>
|
|
<p data-role="link-status" aria-live="polite"></p>
|
|
</div>
|
|
</form>
|
|
|
|
<div class="firmware-picker-status" data-role="status" aria-live="polite">
|
|
Loading the current firmware catalog...
|
|
</div>
|
|
|
|
<section class="firmware-picker-result" data-role="result" aria-live="polite" hidden>
|
|
<p class="firmware-picker-eyebrow" data-role="result-eyebrow">Exact firmware match</p>
|
|
<h2 data-role="result-title">Recommended download</h2>
|
|
<p data-role="result-note" hidden></p>
|
|
<div data-role="result-list"></div>
|
|
</section>
|
|
|
|
<section class="firmware-picker-missing" data-role="missing" aria-live="polite" hidden>
|
|
<h2>No exact firmware matched</h2>
|
|
<p data-role="missing-text"></p>
|
|
<a href="https://github.com/mikecarper/MeshCore/releases">Browse all firmware releases</a>
|
|
</section>
|
|
|
|
<details class="firmware-asset-browser">
|
|
<summary>Advanced: search current release filenames</summary>
|
|
<p>
|
|
Use this for uncommon board suffixes or expert recovery. A filename match
|
|
is not a board-identity check.
|
|
</p>
|
|
<label>
|
|
Filename contains
|
|
<input data-field="asset-search" placeholder="Station_G2, heltec_v4, RAK_4631, ...">
|
|
</label>
|
|
<div data-role="asset-results"></div>
|
|
</details>
|
|
</div>
|
|
|
|
## What the choices mean
|
|
|
|
| Choice | Use |
|
|
| --- | --- |
|
|
| Companion | A phone, computer, or host application controls the radio |
|
|
| Repeater | Standalone mesh relay |
|
|
| Room Server | Hosts room conversations and history |
|
|
| Sensor / telemetry | Publishes supported sensor data |
|
|
| Terminal Chat | Standalone serial-terminal interface |
|
|
| USB logging / USB-connected MQTT | Node remains attached to a computer over a data-capable USB cable |
|
|
| Wi-Fi MQTT observer | Firmware connects directly to MQTT over Wi-Fi; this is not USB logging |
|
|
| USB logging + Wi-Fi MQTT | Unified FULL image sends to both paths; avoid two publishers aimed at the same broker unless messages are deduplicated |
|
|
| No logging | Normal standalone operation without the dedicated logging/MQTT profile |
|
|
| LoRa OTA repeater | Repeater profile that can stage an exact matching update received over LoRa |
|
|
| LoRa OTA source only | Full Companion serving a host-supplied update to another node without self-installing it |
|
|
|
|
Connection and bridge choices depend on the selected role. Companion firmware
|
|
may offer Full, combined USB + Bluetooth, Bluetooth, USB, Wi-Fi, serial, or
|
|
Ethernet transports.
|
|
Normal repeater firmware includes runtime-controlled RS-232 support where the
|
|
board has room; use `set bridge.enabled on` after configuring `bridge.uart` and
|
|
`bridge.baud`. The Wio-E5 remains the capacity exception and offers a separate
|
|
RS-232 image. Choose Wi-Fi MQTT under **Logging / MQTT**; it is an output mode,
|
|
not a second connection choice. Repeaters may still offer separate ESP-NOW or
|
|
Ethernet bridge firmware because those paths use different compiled drivers.
|
|
|
|
An ESP-NOW bridge target keeps LoRa as its primary mesh radio. Its runtime
|
|
`bridge.format` setting chooses the peer protocol: `wrapped` (the
|
|
backward-compatible bridge-to-bridge default using `bridge.secret`) or `raw`
|
|
(direct MeshCore ESP-NOW LR frames for `Generic_ESPNOW`,
|
|
`SenseCapIndicator-ESPNow`, and other primary-ESP-NOW nodes). This is one
|
|
firmware choice, not two board images. Match `bridge.channel` to the primary
|
|
nodes' `espnow.channel` before selecting `set bridge.format raw`.
|
|
For Heltec V4 specifically, `companion_radio_full` is still a LoRa-primary
|
|
Companion; choose the existing `heltec_v4_repeater_bridge_espnow` firmware to
|
|
make that board the LoRa/ESP-NOW gateway. Use its exact merged artifact when
|
|
changing roles or partition layouts.
|
|
|
|
## Share a selection
|
|
|
|
Select any combination of choices, then copy the address bar or use **Copy link
|
|
to settings**. Opening the link restores those choices after the release
|
|
catalog loads. Partial selections work too, so you can share a board and role
|
|
while leaving other choices open. **Clear all choices** removes the picker
|
|
parameters from the URL. Changes update the current browser-history entry
|
|
without reloading the page or adding a Back-button entry for every click.
|
|
|
|
For example, [RAK3401 repeater with internal storage](?hardware=RAK_3401&role=repeater&ota=lora-receiver&variant=no-external-sensors)
|
|
preselects that board, role, OTA capability, and storage profile.
|
|
|
|
The query parameters are `chipFamily`, `hardwareFamily`, `hardware`, `role`,
|
|
`logging`, `ota`, `mode`, `feature`, `variant`, and `install`. Values use the
|
|
picker's internal identifiers rather than the displayed labels. The generated
|
|
link also records `chipAuto` so automatic chip-family selection or an explicit
|
|
**Any** choice behaves the same after reopening. Existing section anchors and
|
|
unrelated query parameters are preserved.
|
|
|
|
Links use the current release catalog. If a linked choice is no longer available
|
|
or conflicts with another choice, the picker identifies it and asks you to
|
|
review the remaining selections. The downloadable HTML's **Copy link to
|
|
settings** button creates a public website link that other people can open.
|
|
|
|
## FULL versus standard
|
|
|
|
For a new installation, use the FULL / complete profile when it exists and the
|
|
board has enough flash. FULL profiles keep the complete supported feature set
|
|
and CLI. Standard profiles remain useful for boards without a FULL build, for
|
|
an intentionally narrower transport, or when retaining an existing compatible
|
|
partition layout.
|
|
|
|
Changing between standard and FULL ESP32 layouts requires the exact-board
|
|
merged image over USB. A running application cannot safely move its own active
|
|
and inactive partitions.
|
|
|
|
Current `full-usb-wifi` profiles use one binary for no external output, USB
|
|
packet logging/USB-connected MQTT, direct WiFi MQTT, or both. The picker shows
|
|
that same exact binary for each compatible logging choice; select the saved
|
|
runtime mode with `set logging.output off|usb|wifi|both`. A FULL logging-fallback
|
|
profile is listed only when no WiFi MQTT sibling exists; it appears for both
|
|
the no-output and USB choices because `set usb.logging off|on` is persistent.
|
|
On a fresh unified FULL install with no saved SSID, the setup AP and WiFi radio
|
|
remain available for 30 minutes per boot, then turn off automatically until the
|
|
next reboot or power cycle. An explicit administrator `start webconfig` remains
|
|
available as an override. A saved SSID switches to the normal indefinite
|
|
reconnect behavior instead.
|
|
|
|
Full Companion profiles use one binary for USB, BLE, ordinary Wi-Fi on ESP32,
|
|
source-only LoRa OTA, Terminal Chat, optional USB packet logging, and any
|
|
board-qualified serial or Ethernet Companion transport. Bulk builds therefore
|
|
omit separate attached-transport, Terminal Chat, and USB-logging artifacts
|
|
whenever the exact Full recipe exists. RAK4631 repeater and room-server
|
|
Ethernet images remain separate roles. Fresh installs default to logging off.
|
|
Heltec V3 and base OLED V4 Full images also contain the former direct Wi-Fi
|
|
MQTT Companion capability, configured at runtime through WebConfig, so their
|
|
separate `companion_radio_wifi_mqtt` artifacts are omitted from canonical
|
|
builds as well.
|
|
|
|
When Full Companion does not fit but a matching USB Companion does, that USB
|
|
artifact also supplies Terminal Chat and replaces its standalone release image.
|
|
Heltec E290 and T190 now publish one Full USB + BLE + WiFi Companion; their old
|
|
combined and single-transport names are explicit-build compatibility aliases.
|
|
SSD1306 Full Companion builds use `set display.rotation 90|180|270`; `0`
|
|
restores the board default, so a separate rotated release image is not
|
|
recommended.
|
|
|
|
Ordinary non-OTA roles also use one artifact for normal operation and USB
|
|
logging. On ESP32 1.17.1.5, run `set powersaving off` before `set usb.logging on`.
|
|
Select the saved mode with `set usb.logging off|on`; no `-logging-`
|
|
artifact is emitted. KISS, BLE-only Companion, and constrained LoRa OTA
|
|
repeater images retain their protocol/partition contracts and do not inherit
|
|
plaintext USB logging.
|
|
|
|
nRF52 Full Companion keeps the multi-role primary interface on `00`; it starts
|
|
as an ASCII terminal and automatically hands a complete `<` frame to Binary
|
|
Companion. `set usb.logging on reboot` adds its plaintext interface `02`.
|
|
|
|
Every ESP32 Full Companion instead exposes one USB TTY. Logging is off by
|
|
default, so the TTY serves the ASCII/Binary Companion switcher. On 1.17.1.5,
|
|
run these two text commands to enable USB logging:
|
|
|
|
```text
|
|
set powersaving off
|
|
set usb.logging on
|
|
```
|
|
|
|
The second command turns that same TTY into an input-capable plaintext
|
|
CLI/logging stream; framed Binary Companion is unavailable on USB while
|
|
logging owns it. `set usb.logging off` stops the logs and leaves the TTY in
|
|
the normal ASCII terminal, matching a fresh Full installation. Send
|
|
`+++MESHCORE-TERM-STOP`, or let a Companion app send a valid framed probe, to
|
|
switch from there to Binary Companion. BLE and Wi-Fi Companion remain usable
|
|
while the USB TTY is logging. ESP32 Full builds use the repository's
|
|
Arduino-ESP32 2.x base where the board supports it; RC32 and ESP32-C6 retain
|
|
their board-required Arduino 3.x platform but still expose only one USB TTY.
|
|
A second ESP32 CDC interface is not part of the release profile.
|
|
|
|
The picker includes the power-saving workaround when selecting **USB** or
|
|
**USB + WiFi** logging on ESP32 1.17.1.5. WiFi/MQTT-only logging does not need
|
|
it while the Repeater/Room Server bridge is running; check `get mqtt.running`.
|
|
The workaround is not added to nRF52 directions. See [logging by role](role_feature_switches.md)
|
|
for the saved settings and the original firmware's USB sleep issue.
|
|
|
|
## Installation methods
|
|
|
|
| File | Use |
|
|
| --- | --- |
|
|
| <code>-merged.bin</code> | Erase/fresh install, recovery, role migration, or partition-profile change on ESP32 over USB |
|
|
| Non-merged <code>.bin</code> | Update an existing same-board, same-role, same-partition installation |
|
|
| <code>.zip</code> | Native nRF52 Serial DFU update package; it is not an extra archive |
|
|
| <code>.uf2</code> | UF2 bootloader drag-and-drop install or update |
|
|
| <code>.hex</code> | Erase/recovery flash with a supported wired programmer |
|
|
|
|
Never send a merged ESP32 image through browser OTA or LoRa OTA. Back up the
|
|
node configuration and verify every filename suffix before flashing.
|
|
|
|
## LoRa OTA and OTAFIX
|
|
|
|
A LoRa OTA repeater build installs repeater firmware that can receive and
|
|
stage updates. A later LoRa update still needs an exact target identity,
|
|
compatible partition signature, matching radio settings, and the correct
|
|
update package.
|
|
|
|
nRF52 LoRa OTA requires an OTAFIX bootloader built for the exact board. There
|
|
is no universal bootloader file. Use the
|
|
[OTAFIX 2.4.6 for this release](https://github.com/mikecarper/Adafruit_nRF52_Bootloader_OTAFIX/releases/tag/0.11.0-OTAFIX2.4.6)
|
|
and select the hardware-matched HEX, Serial DFU ZIP, or bootloader-update UF2.
|
|
|
|
## Hardware and variant names
|
|
|
|
Hardware families with multiple released targets get a second hardware-variant
|
|
menu. It separates revisions, display type, expansion kit, radio/PA layout,
|
|
pin map, and other physical differences without crowding the first menu. The
|
|
firmware-variant menu separately exposes choices that still require different
|
|
code or wiring, such as serial port or the legacy `no_external_sensors` target
|
|
suffix. For RAK3401 and RAK4631, the picker labels that compact LoRa OTA option
|
|
**Internal storage (no external storage board)**. Its result details explain
|
|
the omitted optional environmental/ranging sensor drivers; the reduction does
|
|
not disable generic I2C or unrelated board-integrated peripherals. Other boards
|
|
retain the **Reduced optional environmental/ranging drivers** label.
|
|
Reduced RAK3401 and RAK4631 targets retain INA219/INA226/INA260/INA3221 as
|
|
voltage/current entries in the optional sensor table. They are not the only I2C
|
|
users: the SSD1306 OLED, supported autodiscovered RTCs, and RAK12500 GPS remain
|
|
separate I2C peripherals in compatible recipes. RAK12501/L76K GPS uses Serial1
|
|
instead. The explicit RAK4631 Serial1 bridge omits the combined GPS provider
|
|
because its bridge owns the RAK12501 UART, so that legacy image does not expose
|
|
RAK12500 either. The firmware-configured INA3221 and RAK12500 addresses are both
|
|
`0x42`; to install both, keep RAK12500 at `0x42`, strap INA3221 A0 to SCL for
|
|
`0x43`, and use a build with `-DTELEM_INA3221_ADDRESS=0x43`. Companion power saving,
|
|
controllable FEM receive gain, and radio-chip receive gain are saved settings
|
|
rather than separate recommended firmware files. Do not substitute a similarly
|
|
named physical target.
|
|
|
|
The header-wired RAK19007 W25Q16 LoRa-OTA recipes are also exact hardware
|
|
variants, labeled **External storage board (W25Q16)** in the picker. W25Q16 is
|
|
the flash-memory part on the added storage board; RAK13302 identifies the radio
|
|
module, not the storage board. Choose this variant for RAK4631 or for RAK3401 + RAK13302 only
|
|
when that core/radio combination, the `EF4015` flash wiring, and its matching
|
|
OTAFIX bootloader are all present. The common base-board wiring does not make
|
|
the two firmware or bootloader identities interchangeable.
|
|
|
|
The picker recommends one Full Companion image instead of separate USB, BLE,
|
|
ordinary WiFi, and USB-logging images. On ESP32, logging is off by default so
|
|
the one USB TTY starts in ASCII and automatically changes to framed Companion
|
|
when a complete `<` frame arrives. Enabling logging gives that TTY to the
|
|
plaintext CLI/logger and disables framed USB Companion until logging is turned
|
|
off and the normal ASCII-to-binary mode switch occurs. nRF52 Full Companion
|
|
retains its optional dedicated interface `02`.
|
|
Exact filename search still finds old aliases from earlier releases.
|
|
|
|
## Maintaining the runtime directions
|
|
|
|
The online picker and downloadable HTML use the same command renderer.
|
|
Hardware-specific controls are enabled only when `_data/firmware_controls.json`
|
|
matches the selected release family and exact target. If that metadata is
|
|
missing or belongs to another release, the picker retains basic role/logging
|
|
directions and links the complete guide without inventing hardware support.
|
|
|
|
After qualifying a new release, resolve its PlatformIO configuration with no
|
|
other PlatformIO process running, then generate the controls from that source
|
|
revision and its staged manifests:
|
|
|
|
```bash
|
|
pio project config --json-output > /tmp/meshcore-picker-pio-config.json
|
|
python3 scripts/generate_picker_controls.py \
|
|
--stage /path/to/staged-release \
|
|
--pio-config /tmp/meshcore-picker-pio-config.json
|
|
```
|
|
|
|
For the downloadable version, save the release family's public GitHub release
|
|
objects as a JSON array, then package the same picker UI and controls:
|
|
|
|
```bash
|
|
python3 scripts/package_firmware_picker.py \
|
|
--releases-json /path/to/releases.json \
|
|
--output /path/to/FIRMWARE-PICKER.html
|
|
```
|
|
|
|
This HTML embeds its catalog and directions, so selections work without an
|
|
internet connection. Firmware downloads and the USB web console still need
|
|
network access. When replacing the downloadable picker on release pages,
|
|
update its entry in each page's `SHA256SUMS.txt` as well.
|
|
|
|
|
|
## Memory-corrected 1.17.1.5 downloads
|
|
|
|
Corrected downloads retain the 1.17.1.5 release page and use source suffix
|
|
`aa20e927`, with `1e4d1e16` for Wireless Paper Full's 350-contact follow-up.
|
|
The picker accepts replacement source hashes within that exact
|
|
release version. Its installation directions identify the nRF52 queue-sharing
|
|
behavior, Wireless Paper Full's 350 contacts with a shared 256/128-slot queue,
|
|
and the 150-contact limit on the other six affected ESP32 Full profiles.
|
|
Those notices apply only to the corrected files. See the
|
|
[memory correction details](releases/1.17.1.5.md#memory-corrections-in-aa20e927)
|
|
and each replacement's `.memory.json` report before updating.
|