Repository navigation
UM FeatherS3 build env and board pin profile (um_feathers3) #283
Copy link
Copy link
Closed
Labels
board:doneBoard sync: Done columnBoard sync: Done columnpriority:P1Priority: P1 - MajorPriority: P1 - Majortype:featureDeliverable capability grouping epicsDeliverable capability grouping epics
Description
What
A second PlatformIO environment, um_feathers3, that builds Field Compass for the UM FeatherS3[D] (Adafruit PID 6399) the bench was rewired to on 2026-09-05 (#282), with the board-specific pins selected at compile time. feather_s3 keeps building the Adafruit 5477 image unchanged.
Verified inputs
board = um_feathers3exists in the pinned pioarduino platform 55.03.38-1: variantum_feathers3,memory_type = qio_qspi, 16 MB flash,default_16MB.csv,flash_mode = qio, extra flags-DARDUINO_FEATHERS3 -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1.[verified: ~/.platformio/platforms/espressif32@src-596c…/boards/um_feathers3.json]- Adafruit 6399 is "FeatherS3[D] ESP32-S3 by Unexpected Maker": "16MB QSPI Flash", "8MB Extra QSPI PSRAM", ships CircuitPython with a UF2 bootloader.
[verified: adafruit.com/product/6399, 2026-09-07]Noum_feathers3dvariant exists in the core; the FeatherS3 definition matches these specs. - Variant pins:
SDA 8, SCL 9, TX 43, RX 44, SCK 36, MOSI 35, MISO 37, SS 5, LDO2 39, VBAT_SENSE 2, VBUS_SENSE 34, LED 13, RGB 40.[verified: variants/um_feathers3/pins_arduino.h] - The Adafruit board JSON defines
ARDUINO_ADAFRUIT_FEATHER_ESP32S3.[verified: boards/adafruit_feather_esp32s3.json] - The firmware calls
SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI, SD_CS)andWire.begin()with no pins, and references no Adafruit-only variant symbols.[verified: git grep on fc/212-e4-screens]
Changes
| Define | Adafruit 5477 (feather_s3) |
UM FeatherS3 (um_feathers3) |
Where |
|---|---|---|---|
TFT_CS / TFT_DC / TFT_RST |
18 / 17 / 16 | 17 / 18 / 14 | per-env build_flags |
FRAM_CS |
15 | 12 | src/fc_config.h, #if defined(ARDUINO_FEATHERS3) |
SD_CS |
10 | 3 | same |
CTP_INT |
14 | 6 | same |
TFT_BL |
8 | 5 | same |
BUTTON_A/B/C |
9 / 6 / 5 | 1 / 38 / 33 | same |
| I²C, GPS UART, SPI bus | variant | variant | no change |
Plus:
platformio.ini: shared settings move to a[env]base section; each[env:…]carries only board, memory, partitions, flash and its three TFT control-line flags. CI discovery already excludes the bare[env]section (compile.ymlline 71).partitions/default_16MB.csv: vendored byte-identical copy of the core's table (same rule as the 4 MB one — build inputs live in git).- UM only: drive
LDO2(GPIO 39) HIGH at the top ofsetup(). On the FeatherS3 the second LDO powers the vertical STEMMA QT connector and the RGB LED; neither the Arduino variant nor UM's helper library enables it at boot, and its power-up default is not documented on UM's page.[hypothesis: LDO2 may already be on]Driving it HIGH is harmless if so. On the Adafruit board GPIO 39 is GPS TX, so this is board-conditional. docs/HARDWARE.mdandCLAUDE.md: the build/flash commands for the second env.
Consequences the owner decides at flash time
pio-flash confirmrunspio run -e um_feathers3 -t upload, which writes the Arduino bootloader, partition table and app. The UM board's shipped TinyUF2 + CircuitPython are replaced. Restorable from UM's releases.- The UM board has no MAX17048; battery is an ADC divider on GPIO 2 (
[verified: UMS3.h getBatteryVoltage]). The battery unit will report N/A. Not in scope here. - With
ARDUINO_USB_MODE=1the app enumerates on the same VID:PID as the bootloader (303A:1001).pio-flash's bootloader-entry discovery keys on a PID change; a later app-mode flash may need attention.[hypothesis: untested]First flash is from bootloader mode, so not in the way.
Acceptance
-
pio run -e feather_s3andpio run -e um_feathers3both build; sizes recorded - The
feather_s3image is unchanged by the restructure (same size and symbol set as the refactor(#265): E4 band 4 -- the screens leave src.ino; hardware verification before merge #280 build) -
pytest scripts/passes - Flashed to
um_featherviapio-flashon the owner's confirm; every peripheral checked on the UM board (this is also E4-6 (band 4): move the consumers and screens last #265's hardware verification of band 4) -
docs/HARDWARE.mdUM section says which env builds for the board
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
board:doneBoard sync: Done columnBoard sync: Done columnpriority:P1Priority: P1 - MajorPriority: P1 - Majortype:featureDeliverable capability grouping epicsDeliverable capability grouping epics
Activity
Strycher commentedon Sep 8, 2026
Flashed 2026-09-07 evening on the owner's GO ("Flash UM Feather."): env um_feathers3 @ 253f7af (branch fc/283-um-feathers3-env = #280 head + #282 docs + this), firmware sha256 cb34d5da6c1fe93edf0a03e2a491a55e2d0bd99d566b3d7a55ed5273041dde47, 1,797,424 bytes, to device um_feather on COM22 (bootloader mode). esptool 5.2.0: ESP32-S3 rev v0.2, USB mode USB-Serial/JTAG, MAC 44:1b:f6:dc:ab:64, flash auto-detected 16MB; bootloader @0x0, partition table @0x8000, boot_app0 @0xE000, app @0x10000 all written and hash-verified; pio upload exit 0. The board's shipped TinyUF2/CircuitPython are now replaced. Build: RAM 74,032 B (22.6%), flash 1,797,018 B of 6,553,600 (27.4%). Hardware verification of each peripheral follows from the serial boot log; recorded here when read. Flash history entry: C:\Dev.field_compass\flash-history.jsonl.
Strycher commentedon Sep 8, 2026
Run log, um_feather @ d6fa305, 2026-09-08 00:11-00:16 EDT, two identical boot cycles (full capture in the session scratchpad, um-serial-d6fa305.log):
Open: why I2C1 sees nothing (suspects: an unpowered device clamping SDA/SCL -- the display module's touch controller if its VCC is on the switched LDO2 hole, or the on-board MAX17048 if no LiPo is connected) and the blank panel (CS/DC/RST 17/18/14 wiring or module power). Owner to read the SDA hole voltage / try a LiPo / lift the display's I2C wires.
Strycher commentedon Sep 8, 2026
2026-09-08 01:13 EDT, um_feather @ 77ab753, after the owner rewired the display per the wire-by-wire table (docs/HARDWARE.md, UM section): TFT drawing; OLED up (glitchy on boot, layout work later); SD OK 30436 MB; RTC OK (time read); I2C1 scan 9 devices (LIS3MDL, VEML7700, MAX17048 x2 addr, SHT41, LSM6DSOX, BME688, OLED 0x3C, PCF8523 0x68); GPS fix; task watchdog 30 s with no resets (#285 fix verified on hardware). Still open: FRAM NOT FOUND since the last wiring move (it read mfg 0x04 / prod 0x4803 two boots earlier, so CS hole 12 or its lines moved), and FT6336U touch NOT FOUND at 0x38 (CTP SDA/SCL/INT wires). Root cause of the earlier dead I2C1 (SCL held low) and blank panel: display wires placed per the retracted 2026-09-05 05:46 table (TFT_CS->1, RST->3, CTP_INT->5, BL->6); the corrected holes are 17/14/6/5. The owner confirmed that table was what he wired from.
Strycher commentedon Sep 8, 2026
2026-09-08 02:16 EDT, um_feather @ 77ab753, after the owner rewired from docs/um-bench-wiring.md (silkscreen-only list): every peripheral verified from the board's own boot log. TFT + LVGL drawing; FT6336U touch found at 0x38 and armed; OLED 128x64 OK; I2C1 scan 10 devices; BME688/BSEC2 OK (state restored from SD); SHT41 OK; LSM6DSOX + LIS3MDL OK (heading steady); GPS fix in 26 s, 6-7 sats; RTC OK and synced from GPS; SD mounted 30436 MB with the serial log open; FRAM OK (mfg 0x04 prod 0x4803, 256 KB); MAX17048 found (4.2 V; reports 140 % charge -- gauge compensation on the UM board is a follow-up); settings loaded; task watchdog 30 s with no resets; WiFi FAILED on the placeholder credentials as expected. Loop 44 Hz. Not yet flashed: f655868 (touch init logs CTP_INT instead of a literal 14). Left on the branch to decide before PR: keep or drop the empty-scan I2C diagnostic in scanI2C (77ab753).
Strycher commentedon Sep 8, 2026
PR #288 (base fc/212-e4-screens, since this branch is #280's head plus this work). Hardware verification complete on um_feather 2026-09-08 02:16 EDT (see the previous comment for the full peripheral list); owner also confirmed the TFT sleep timeout. Citadel: work task Field_Compass-wmg closed, PR task Field_Compass-78j claimed. Left for the reviewer: keep or drop the empty-scan I2C diagnostic (77ab753); f655868 is on the branch but not flashed.
feat(#283): UM FeatherS3 build env and board pin profile (um_feathers3)
fix(#284): one SPI driver per bus; scan both I2C buses on the Feather…
diag(#283): when the UM board's I2C scan is empty, log idle line leve…
docs(#283): display module wire-by-wire table; how the first boot's b…
docs(#283): one-page UM bench wiring list, board labels only; warn th…
1 remaining item
fix(#283): touch init logs the real CTP_INT pin, not a literal 14
docs(#283): every peripheral verified on the UM board at 02:16; wire …
docs(#283): lock the UM bench wiring; CLAUDE.md pin assignments for b…
feat(#283): UM FeatherS3 build env and board pin profile (um_feathers3)
fix(#284): one SPI driver per bus; scan both I2C buses on the Feather…
diag(#283): when the UM board's I2C scan is empty, log idle line leve…
docs(#283): display module wire-by-wire table; how the first boot's b…
docs(#283): one-page UM bench wiring list, board labels only; warn th…
docs(#283): display SDO goes to MI, as it did on the Adafruit setup
fix(#283): touch init logs the real CTP_INT pin, not a literal 14
docs(#283): every peripheral verified on the UM board at 02:16; wire …
docs(#283): lock the UM bench wiring; CLAUDE.md pin assignments for b…