PrintDrop
Flash Firmware

Flash PrintDrop

Two paths: the easy OTA update from the device's own web UI, and the full Web Serial flasher for first install or recovery. Both use the same binaries built by CI for printdrop (SDIO 4-bit) and printdrop_spi (SPI legacy) — dual OTA slots on 4 MB.

Recommended — OTA from the device
No cable. Works once the device is on your Wi-Fi. Uses dual 1 344 KB OTA slots — a bad flash rolls back.
  1. Open the device: http://printdrop.local or http://printdrop/ or its IP ( see Devices scanner). Log in with your Web UI login (default admin / printdrop).
  2. Go to Settings → Firmware (OTA) — the three Settings tabs are now Wi-Fi / Web UI Login / Firmware (OTA). The card shows Current version and OTA enabled.
  3. Click Choose firmware .bin, pick the OTA binary for your wiring: printdrop-sdio-*.bin for SDIO 4-bit (default) or printdrop-spi-*.bin for SPI legacy. Confirm — the device writes the idle OTA slot and reboots.
  4. Alternative: copy firmware.bin + firmware.json {"version":"0.2.0"} to SD root, then refresh — OTA will offer "Update from SD".
Download OTA bin SDIO All releases

OTA via web UI needs only the .bin. For SD-card update copy both firmware.bin (rename the OTA bin) + firmware.json to SD root — the json is generated for the selected variant (SDIO).

LED: idle 2 s blink, activity fast, error double-blink. Button short = eject/refresh printer view; long 5 s = factory reset.

Web Serial flasher — esptool-js
First install, or recovery when OTA is not reachable. Runs in Chrome/Edge via Web Serial — no Python needed. The same merged binaries as CI builds are flashed at 0x0.
Web Serial is not available here (needs Chrome or Edge on desktop over https or localhost). You can still download the bins and use esptool.py below.
Variant:
SDIO needs 6 wires (CLK 40 CMD 14 D0 39 D1 12 D2 13 D3 15) + 10 k pull-ups; SPI is 4-wire CS 12 MISO 39 MOSI 14 CLK 40.
Latest release — SDIO 4-bit
Loading latest release…

Download from GitHub Releases, then pick the file above — direct browser fetch from GitHub is blocked by CORS, so download + select is the reliable path.

Needs Chrome/Edge, USB cable to CP2102 (COM5) or native USB — may need BOOT+RESET
— idle — connect a board, pick a .bin, then flash —
Tip: if the board runs TinyUSB (printdrop), send BOOTLOADER via serial first: "BOOTLOADER" | Out-File -Encoding ascii COM5

If Web Serial fails, use esptool.py — see command below. The auto-reset on this board is half-wired (RTS→EN only); open the port with RTS/DTR deasserted.

Manual — esptool.py
When the browser route is not available, or for CI.
OTA via curl (device already on Wi-Fi)
# needs Web UI login (default admin/printdrop)
curl -u admin:printdrop -F "file=@printdrop-sdio-0.2.0.bin" http://printdrop.local/api/ota
# — device writes idle OTA slot and reboots
Full flash via esptool (initial install)
# put board in download mode first:
#  - software: "BOOTLOADER" | Out-File -Encoding ascii COM5   (then check for "waiting for download")
#  - hardware: hold BOOT, tap RESET, release BOOT
esptool.py --chip esp32s3 --port COM11 --before default_reset --after hard_reset write_flash -z \
  0x0      bootloader-0.2.0.bin \
  0x8000   partitions-0.2.0.bin \
  0x10000  printdrop-sdio-0.2.0.bin \
  0x2B0000 littlefs-0.2.0.bin
# or single shot with merged full image:
esptool.py --chip esp32s3 --port COM11 write_flash -z 0x0 printdrop-sdio-full-0.2.0.bin

Offsets are from partitions_printdrop_ota.csv (4 MB: app0 0x10000 0x150000, app1 0x160000, spiffs 0x2B0000). For SPI build replace sdio with spi. If COM11 is gone (TinyUSB firmware), use the BOOTLOADER hatch on COM5.

LittleFS

The Web UI (HTML/CSS/JS) lives in LittleFS (data/). After a full flash that includes littlefs.bin, no extra step is needed. To update only the UI: pio run -e printdrop -t uploadfs (or flash littlefs.bin at 0x2B0000).

Notes
  • SDIO 4-bit is the default (-e printdrop). SPI legacy is -e printdrop_spi — same pins plus D1 12 D2 13 D3 15, needs 10 k pull-ups on CMD/D0-D3.
  • Version is PRINTDROP_VERSION from platformio.ini and shown in the device's Status and OTA cards and at /api/status.
  • CI builds both envs on every tag v* and attaches bins + SHA256SUMS to the GitHub Release — the Web Serial flasher above can fetch them directly.