Skip to content

UM FeatherS3 build env and board pin profile (um_feathers3) #283

Closed

Description

@Strycher

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_feathers3 exists in the pinned pioarduino platform 55.03.38-1: variant um_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] No um_feathers3d variant 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) and Wire.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.yml line 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 of setup(). 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.md and CLAUDE.md: the build/flash commands for the second env.

Consequences the owner decides at flash time

  • pio-flash confirm runs pio 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=1 the 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

Activity

  1. Strycher commented on Sep 8, 2026

    @Strycher
    OwnerAuthor

    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.

  2. Strycher commented on Sep 8, 2026

    @Strycher
    OwnerAuthor

    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):

    • TFT_eSPI init OK, LVGL OK, PSRAM 8189 KB free; panel BLANK behind a lit backlight (GPIO 5).
    • I2C1 (SDA 8/SCL 9) scan: 0 devices. I2C2 (SDA 16/SCL 15, Wire1) scan: 0 devices. OLED, BME688, SHT41, LSM6DSOX, MAX17048, FT6336U touch, PCF8523 RTC all NOT FOUND; every transaction returns ESP_ERR_INVALID_STATE (no ACK).
    • SD OK 30436 MB, FRAM OK (mfg 0x04 prod 0x4803) -- so the SPI bus, holes 3 and 12, and the stacked Adalogger wing are good. The RTC on that same wing is NOT FOUND, so the I2C bus on 8/9 is electrically dead, not mis-mapped.
    • GPS OK on RX 44 / TX 43: first NMEA at 32 s, fix at 33 s, 8-9 sats, HDOP 1.3-1.4.
    • WiFi FAILED (placeholder credentials, expected).
    • Task watchdog reset every ~70 s: filed as Watchdog timeout silently stays at the core's 5 s: esp_task_wdt_init fails 'TWDT already initialized' #285 (5 s core default, esp_task_wdt_init 'already initialized').
      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.
  3. Strycher commented on Sep 8, 2026

    @Strycher
    OwnerAuthor

    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.

  4. Strycher commented on Sep 8, 2026

    @Strycher
    OwnerAuthor

    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).

  5. added
    board:testingBoard sync: Testing column
    and removed
    board:readyBoard sync: Ready column
    on Sep 8, 2026
  6. Strycher commented on Sep 8, 2026

    @Strycher
    OwnerAuthor

    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.

  7. added 5 commits that reference this issue on Sep 8, 2026
  8. 1 remaining item

  9. added 3 commits that reference this issue on Sep 8, 2026
  10. added 9 commits that reference this issue on Sep 8, 2026
  11. added
    board:doneBoard sync: Done column
    and removed
    board:testingBoard sync: Testing column
    on Sep 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    board:doneBoard sync: Done columnpriority:P1Priority: P1 - Majortype:featureDeliverable capability grouping epics

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions