Field Instrument FI-221 (proposed)KEEL

Lays the bootloader on a bare ESP32 and proves it landed. WATCHFIRE sails it afterward.

v1.0.0
self-test not run

Station 01Wire

Open the port, walk the board into its ROM bootloader, and find out what is actually on the other end. Every step below is shown separately because on cheap boards the failure is always one specific step.

Reset into the bootloader

    What is on the wire

    statenothing connected

    Protocol lane

    Station 02Board

    A flashed board with the wrong pins is a brick that boots cleanly. This is the wiring the stock diy-v1 build expects, and the checks worth making before any of it is powered.

    diy-v1 pin map

    Source: meshtastic/firmware, variants/esp32/diy/v1/variant.h, branch develop, read 2026-08-11. Re-read it before trusting this page — variants move.

    The 30-pin header, as it is printed

    These are not the ESP32 default SPI pins

    SCK D5, MOSI D27, MISO D19, CS D18. Wiring from habit (VSPI 18/23/19/5) puts SCK and CS on each other's pins and the radio never answers.

    Every pin the variant names

    Worth getting right

    Ask the radio directly

    The ROM bootloader will read and write any register, and the GPIO matrix is just registers — so KEEL can bit-bang SPI over the serial wire and ask the radio to identify itself, with no firmware running on the chip. It is slow (one round trip per clock edge) and it answers in seconds instead of a flash-and-boot cycle.

    A pass here means one thing only: the SX127x version register read back exactly 0x12. Anything else is reported as what it saw. This probe has not yet been run against a real radio.

    Pre-flight

    These are checks you make, not checks KEEL makes. Nothing here is verified by this program — ticking a box records that you looked.

    Station 03Image

    Drop the Meshtastic release archive. KEEL reads what is in it, reads the install script that ships inside it, and takes its offsets from that script rather than from anything hard-coded here.

    Drop firmware-*.zip here, or loose .bin files — or click to choose

    Station 04Plan

    Everything that will happen, before anything happens. Nothing is sent to the board until this page is approved.

    No plan yet. Load a release in station 03.

    Station 05Burn

    The map is the truth of the run. Bands fill as bytes land and go solid only when the chip's own digest agrees with ours.

    planned erasing / writing verified failed
    sent 0 of 0 elapsed 0.0 s rate retries 0

    Protocol lane

    Station 06Proof

    What was written, where, and whether the chip agrees. This is the record that makes a node traceable a year from now.

    No run yet.

    Station 07Handoff

    A verified write is not a working node. Two things always come next.

    The region is unset, and the radio will not transmit

    Meshtastic ships with the LoRa region deliberately unset, and holds the transmitter off until someone sets it. This is not a fault to debug. Set it in WATCHFIRE, or over the CLI, before expecting any traffic. Match it to the module you actually soldered on: a 915 MHz part on a 433 MHz region setting is a radio that talks to nothing, and a 433 MHz part told to run US_915 is worse than useless.

    Then hand off to WATCHFIRE

    KEEL's job ends at the bootloader. Configuration, channels, codeplug and telemetry are WATCHFIRE's. Release the port here before opening it there — two pages cannot hold the same serial port.

    Boot log

    Station 08Simulator

    A synthetic ESP32 ROM bootloader answering the same command set on the same framing. Pick a fault, then run the whole instrument against it with nothing plugged in.

    Faults

    Self-test

    Offline, in this page, against the simulator. It exercises the codecs, the parsers, the planner, the map, and a whole failing burn.