12035f2f39
- Migrates tactility-firmware and tactility-bluetooth from ~/.hermes/skills/ into .claude/skills/ for repo co-location - Adds AGENTS.md with local workstation context, board table, board-direct build rule, Hermes PYTHONPATH pitfall, common Tactility pitfalls, and in-repo skill index Refs: personal Gitea mirror
3.1 KiB
3.1 KiB
Batch Flashing 3x ES3C28P + RLCD + WiFi Persistence — 2026-07-11
Context
User had 4 boards: 3x ES3C28P color 2.8" ILI9341V (identical) + 1x waveshare-esp32-s3-rlcd 4.2" mono ST7305.
All use CP210x USB-UART, enumerate as same /dev/cu.usbmodem101 after swap on macOS. After flash, user said "I need to manually enable the wifi and connect on this board."
Observations
Port reuse
ls /dev/cu.usbmodem*always showed single/dev/cu.usbmodem101even after plugging different board.ioreg -p IOUSBshows AppleUSBSerial for CP210x, but macOS reuses same BSD node after disconnect.- Workflow: build once, flash, wait
Hard resetting via RTS pin... Done, unplug 2s, plug next board (same port name reappears with new timestampls -lt). - If 2 boards on hub simultaneously, might get
usbdmodem102/103, but CP210x driver sometimes still reuses 101 — checkls -lttimestamps.
Binary reuse per target
- ES3C28P:
Tactility.bin 0x2be0c0 31% free(2.7M) — includes audio codecs ES8311, FM8002E amp GPIO1, power driver GPIO9 ADC1_CH8 esp_adc, OCT PSRAM 120M. - RLCD:
0x2b78b0 32% free(2.7M slightly smaller, no audio) — different sdkconfig device IDCONFIG_TT_DEVICE_ID="waveshare-esp32-s3-rlcd". - Must
rm -rf build sdkconfigwhen switching target, else CMake caches wrong lvgl/display driver and fails withidf_build_get_property Unknown.
WiFi credentials persist on SD
- When second ES3C28P was flashed with
env -u PYTHONPATH ... idf.py -p /dev/cu.usbmodem101 flash, it auto-connected as192.168.68.115without manual config. - Reason:
storage.userDataLocation=SD→ wifi settings at/sdcard/tactility/settings/wifi.propertieson SD card partition, not in flash app partition.idf.py flasherases only app partitions (0x0 bootloader, 0x8000 partition table, 0x10000 app, 0x410000 system), not SD FATFS. - Fresh SD card (no settings) requires manual: Settings → WiFi → ON → Scan → FamReynaMesh → password. Then enable MCP Screen → ON (persists via
mcp-settings-persistence.mdfix). - Our scan loop for
192.168.68.113/115/116found two devices UP after second flash — proves SD not erased.
Verification for batch
# After each flash, wait 6s then probe
env -u PYTHONPATH python3 - << 'PY'
import socket
for ip in ["192.168.68.113","192.168.68.115","192.168.68.116","192.168.68.103"]:
try:
s=socket.socket(); s.settimeout(1.2); s.connect((ip,80)); print(f"{ip} UP"); s.close()
except: pass
PY
Pitfalls
- Flashing different target without
rm -rf build sdkconfigcauses simulator CMake (SDL_WAYLAND/SDL_X11) + LVGLidf_build_get_propertyerror — looks like LVGL bug but is stale cmake cache. Buildscripts/sdkconfig/is gitignored, butdefault.propertiesmust be force-added (git add -f).Libraries/lvglgets dirty (line endings) —git -C Libraries/lvgl checkout -- .before commit.env -u PYTHONPATH -u PYTHONHOMErequired for bothdevice.pyandidf.pywhen running from Hermes (see build-env-and-flash.md).- Multi-delete of
hermes-verify-*.pytriggers security approval "Mass file deletion" — delete one-by-one or approve.