Solana Badge v1 · rev lcd

Flash

Put firmware on the badge, from this page.

The badge speaks the Espressif ROM bootloader over its USB-C port, and Chromium browsers can open a serial port. So there is nothing to install — pick an image, connect the board, and it gets written here.

Everything runs locally. The images are static files served with this page, the serial port is granted by you to this tab only, and nothing about your board is sent anywhere.

01 Pick a firmware

The factory-test image. It walks the ILI9341 panel and its backlight, reads the six buttons through the TCA9534, drives both WS2812 LEDs, samples the battery divider, opens a T=1 link to the SE050 and reads its ATR, and captures both PDM microphones with live level bars.

This is what you flash to find out whether a board came back from assembly working. It answers that question and nothing else — there is no launcher and no app support.

Built from firmware/testkit/Badge-testkit-full.bin · tracked in the repo

02 Connect the badge

Plug the badge into USB-C and switch S1 to the CH340C side. If the browser shows no port, hold BOOT1, tap RST1, release BOOT1 and pick “Already in bootloader” below.

DTR/RTS through the auto-program circuit. Right for the USB-C port with S1 on the CH340C side.

03 Write it

What gets written

Offsets come from the images themselves. The badge is a 16 MB ESP32-S3 with 8 MB octal of PSRAM; the compiled image is built against esp32:esp32:esp32s3:PSRAM=opi,FlashSize=16M,PartitionScheme=custom,CDCOnBoot=cdc.

Test kit

OffsetPartSize
0x0000merged image654 KB

firmware/testkit/Badge-testkit-full.bin

Solana OS

OffsetPartSize
0x0000bootloader20 KB
0x8000partition table3 KB
0xe000OTA select8 KB
0x10000application1748 KB

firmware/solana-os/

If it will not connect

No port in the picker
The CH340C needs a driver on older macOS and on Windows. Check that S1 is on the CH340C side — flipped the other way, the port you want is the S3's own USB and you should pick the “Native USB” reset mode.
“Failed to connect” / no sync
Put the board into download mode by hand: hold BOOT1, tap RST1, release BOOT1. Then choose “Already in bootloader” and connect.
It connects, then fails partway
Drop the baud rate to 115200. Long or unpowered hubs lose bytes at 921600 far more often than the cable being at fault.
Port is busy
Close any serial monitor holding it — the Arduino IDE, screen, or another tab of this page.

Prefer a terminal? The same test-kit image flashes with esptool.py --chip esp32s3 write_flash 0x0 firmware/testkit/Badge-testkit-full.bin, and Solana OS builds and uploads with arduino-cli — see the USB module for how the auto-program circuit gets the board into the bootloader on its own.

Solana Badge · DEF CON Generated from pcb/v1, pinout/ and firmware/testkit/testkit.ino