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.
- Open the device:
http://printdrop.localorhttp://printdrop/or its IP ( see Devices scanner). Log in with your Web UI login (defaultadmin / printdrop). - 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.
- Click Choose firmware .bin, pick the OTA binary for your wiring:
printdrop-sdio-*.binfor SDIO 4-bit (default) orprintdrop-spi-*.binfor SPI legacy. Confirm — the device writes the idle OTA slot and reboots. - Alternative: copy
firmware.bin+firmware.json{"version":"0.2.0"}to SD root, then refresh — OTA will offer "Update from SD".
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.
0x0.esptool.py below.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.
— 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.
# 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
# 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.
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).
- 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_VERSIONfromplatformio.iniand 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.