Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
303d9a8
feat(lpvm-native): per-chip JIT placement seam for the classic ESP32
Yona-Appletree Aug 1, 2026
75c217f
feat(fw-esp32v3): classic ESP32 (LX6) firmware crate, boots on the DO…
Yona-Appletree Aug 1, 2026
c788ce3
feat(lpc-hardware): DOM-Z-102 board manifest + HardwareTarget::Esp32
Yona-Appletree Aug 1, 2026
a2a4418
feat(fw-esp32v3): radio_ram_probe — M2-P3 RAM ledger measured on the …
Yona-Appletree Aug 1, 2026
5d485eb
docs(lp-fw): add fw-esp32v3 to the crate family table
Yona-Appletree Aug 1, 2026
34edf14
ci(fw-esp32v3): gated Firmware build (esp32v3) job + size-check and c…
Yona-Appletree Aug 1, 2026
2ec818d
test(lpa-boards): RUNTIME_ONLY allowlist for boards whose sidecar lan…
Yona-Appletree Aug 1, 2026
f468e58
fix(lpc-hardware): dom-z-102 labels match the silkscreen (IO18/16/14/…
Yona-Appletree Aug 1, 2026
82156a3
feat(fw-esp32v3): server app layer over UART0 — LpServer boots on the…
Yona-Appletree Aug 1, 2026
a42f95c
feat(lpvm-native): xt-placed-code — classic firmware JIT modules live…
Yona-Appletree Aug 1, 2026
5a40f35
fix(lpa-client): CH340-class UART bridges get a real reset, via whole…
Yona-Appletree Aug 1, 2026
7aff9b1
feat(fw-esp32v3): wire the placed JIT path + 921600 UART — GLSL execu…
Yona-Appletree Aug 1, 2026
71494b7
Merge origin/main into classic bring-up
Yona-Appletree Aug 1, 2026
1cfac1f
test(lpa-boards): dom-z-102 now has both manifest halves — drop its d…
Yona-Appletree Aug 1, 2026
8836b41
feat(fw-esp32v3): classic WS281x RMT backend — 4 channels at 2 blocks…
Yona-Appletree Aug 1, 2026
e3c6f20
Merge branch 'claude/infallible-bose-84a52e' of https://github.com/li…
Yona-Appletree Aug 1, 2026
b189882
fix(fw-esp32v3): a panic handler that can report, and the defect prov…
Yona-Appletree Aug 1, 2026
3228451
fix(lpc-hardware): dom-z-102's top-right terminal is IO12 (relay), no…
Yona-Appletree Aug 1, 2026
471304c
chore(studio): auto-refresh story baselines [validate-stories]
github-actions[bot] Aug 1, 2026
039b9b9
chore(studio): auto-refresh story baselines [validate-stories]
github-actions[bot] Aug 1, 2026
3c362eb
fix(fw-esp32v3): clear the two clippy reds gating the esp32v3 CI job
Yona-Appletree Aug 1, 2026
9aef8ca
feat(fw-esp32v3): pull the lp-recovery RTC ledger forward from M7 int…
Yona-Appletree Aug 1, 2026
da4ccc4
chore(studio): auto-refresh story baselines [validate-stories]
github-actions[bot] Aug 1, 2026
c87ec50
fix(fw-esp32v3): name the RMT open fault — it is an OOM, not RMT
Yona-Appletree Aug 1, 2026
d38bdbf
chore(studio): auto-refresh story baselines [validate-stories]
github-actions[bot] Aug 1, 2026
3c8fa09
style(lpc-shared): satisfy fmt-check on the chip-map import pair
Yona-Appletree Aug 1, 2026
ced3928
fix(lpc-shared): white point is a multiply, not a 3 KB per-channel table
Yona-Appletree Aug 1, 2026
55cbbe5
test(projects): quad60-v3 capacity fixture + M4-P3 silicon sweep
Yona-Appletree Aug 1, 2026
cee3ab9
docs(adr): classic ESP32 flash/RAM budget — flash is fine, RAM is the…
Yona-Appletree Aug 1, 2026
c6ca6ef
Merge remote-tracking branch 'origin/main' into claude/infallible-bos…
Yona-Appletree Aug 1, 2026
c4ea400
test(fw-esp32v3): verify 16-bit gamma on classic silicon; file a heap…
Yona-Appletree Aug 1, 2026
dd1b2f8
docs: how brightness, gamma, white point and dithering actually work
Yona-Appletree Aug 1, 2026
c4e30fb
Merge remote-tracking branch 'origin/main' into claude/infallible-bos…
Yona-Appletree Aug 1, 2026
22aa56a
chore(studio): auto-refresh story baselines [validate-stories]
github-actions[bot] Aug 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions .github/workflows/pre-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,79 @@ jobs:
- name: Clippy esp32s3 firmware
run: cd lp2025 && just clippy-fw-esp32s3

# fw-esp32v3 (classic ESP32, "v3"/WROOM-32E) — the second crate on the
# Xtensa fork, cloned from firmware-xtensa above. Same anti-rot rationale:
# nothing else in CI compiles this crate.
#
# Shares the broad `firmware` filter with firmware-xtensa and
# firmware-size, for the same reason both give: it is the link closure of
# the device image, and a narrow lp-fw/fw-esp32v3 filter would stop
# rebuilding on shared-crate changes most likely to break it — which since
# M3-P1 is the whole `lpa-server` / `fw-esp32-common` stack.
#
# Compile-only, like firmware-xtensa: hardware validation is manual.
firmware-esp32v3:
name: Firmware build (esp32v3)
runs-on: ubuntu-24.04
needs: detect-changes
if: needs.detect-changes.outputs.firmware == 'true'
env:
CARGO_INCREMENTAL: "0"
steps:
- name: Install system deps (libudev for espflash)
run: sudo apt-get update && sudo apt-get install -y libudev-dev pkg-config

- name: Checkout lp2025
uses: actions/checkout@v4
with:
path: lp2025

# Installs the Xtensa Rust fork as the `esp` toolchain plus its bundled
# GNU binutils, which the build needs on PATH — the Rust target spec
# links through xtensa-esp32-elf-gcc, not rust-lld.
#
# Pinned rather than floating, same reasoning and same pin as
# firmware-xtensa: the crate's rust-toolchain.toml says `channel = "esp"`,
# which locally tracks whatever espup installed; CI pins so a fork
# release cannot turn a green PR red on its own. Keep this version in
# sync with firmware-xtensa's.
- name: Install Xtensa Rust toolchain
uses: esp-rs/xtensa-toolchain@v1.6
with:
version: 1.95.0.0
buildtargets: esp32
default: true
ldproxy: false

# `lp2025 -> target`, mirroring firmware-xtensa: this crate is a
# repo-root workspace member (M3-P1 folded it in) and writes into the
# shared root target/, so the cache key must be the repo root.
- name: Cache cargo registry and build artifacts
uses: Swatinem/rust-cache@v2
with:
workspaces: lp2025 -> target
cache-targets: false
save-if: ${{ github.ref == 'refs/heads/main' }}

- name: Install just
uses: extractions/setup-just@v3

# Pinned to match the firmware-size and firmware-xtensa jobs.
# ~/.cargo/bin is restored by rust-cache above, so this is a no-op on a
# warm cache.
- name: Install espflash
run: cargo install espflash --version 3.3.0 --locked

# Builds the crate and checks the image against its 3 MB app partition.
- name: Check esp32v3 image size
run: cd lp2025 && just fw-esp32v3-size-check

# The lint gate for this crate. Nothing else in CI lints it —
# `clippy-host` excludes it, because it cross-compiles for Xtensa under
# a different toolchain.
- name: Clippy esp32v3 firmware
run: cd lp2025 && just clippy-fw-esp32v3

# The Xtensa HOST path: `lpvm-native`'s `rt_emu` compiling shaders for Xtensa
# and executing them on `lp-xt-emu`, linked against a cross-compiled builtins
# image. Nothing else in CI runs Xtensa *code* — `firmware-xtensa` above only
Expand Down
42 changes: 42 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ members = [
"lp-cli",
"lp-fw/fw-esp32c6",
"lp-fw/fw-esp32s3",
# NOT in default-members (like the two above): a cross-target Xtensa crate
# that only `just build-fw-esp32v3` / `just clippy-fw-esp32v3` build, under
# its own `esp` toolchain.
"lp-fw/fw-esp32v3",
"lp-fw/fw-emu",
"lp-fw/fw-tests",
"lp-core/lpc-mapping",
Expand Down Expand Up @@ -310,6 +314,16 @@ opt-level = "z"
inherits = "release"
opt-level = "s"

# fw-esp32v3 (classic ESP32, LX6): same reasoning as the S3 profile above, and
# deliberately the same `opt-level = "s"` rather than the workspace default
# "z". The S3's evidence is that "z" missed a 30 µs cold-frame RMT deadline on
# the *faster* LX7; there is no reason to assume the LX6 is safe where the LX7
# was not. M4 re-checks the cold first frame with real RMT output on this chip.
# No per-package overrides — the S3 profile carries none either.
[profile.release-esp32v3]
inherits = "release"
opt-level = "s"

# Profile for fw-emu: opt-level=3 avoids Cranelift codegen bugs in emulator (InvalidMemoryAccess).
# Used by test_scene_render_fw_emu via ensure_binary_built(..with_profile("release-emu")).
[profile.release-emu]
Expand Down
Loading
Loading