Skip to content
foonerd edited this page Oct 23, 2026 · 17 revisions

evo-esp32

The evo fabric on a microcontroller: a standalone music player on an ESP32 touch panel, built the way an evo device is built. A declared catalogue describes the device; plugins stock its slots and never address each other; one steward owns the state and serves what the panel draws and what a phone or another player reads.

Where the project stands. The fabric runs on the first board. The firmware for the Waveshare ESP32-C5-Touch-LCD-2.8 compiles its catalogue in, mounts the card, and plays FLAC, WAV and MP3 from it through the on-board codec and, on the same frames, through a Raspberry Pi DAC HAT on the headers; the panel draws the face from the steward's projections and takes touch: transport, seek, volume, a library of the card's folders and of the DLNA media servers on the network, the album's cover from its folder, and a Settings page whose theme, style and rotation are kept in a text file on the card, which also names the Wi-Fi network the player joins; over it, internet radio from playlists on the card, with the stations' logos and the songs' titles as they change (see Configuration). 44.1 and 96 kHz play at real time; 192 kHz is beyond the chip and is greyed out in the library (see Hardware). The same fabric runs on the host as an ordinary Rust workspace, where every plugin is tested and the face is rendered to a PNG. It meets the board through the hardware layers of volumio-esp-companion: bring-up, display, touch, the card, the codec and DAC drivers.

The player's face: the disc style in portrait and the card style in landscape

Start here

Page What it is for
Face What the panel shows: Now Playing in the evo family's five themes, two styles, four rotations; renders from the host.
Configuration evoconfig.txt on the card and the Settings page on the panel: the keys, the status file the player writes back, and where the controls are in each style.
Update New firmware: the first flash over USB, then releases the player finds by itself, or takes from its web page or from the card; what the panel shows meanwhile, the trial minute, the way back.
Hardware The first board, what it has for a player, what it lacks, and what a carrier board adds.
Boards The ESP32 touch panels recorded as targets for the player, by role: the one on the bench, the next to buy, the rest by what they would prove, and the ones that do not fit.
Audio out What the panel gives a DAC, the options recorded against it (Raspberry Pi DAC HATs, bare I2S modules, DAC chips from TI and ESS, a speaker amplifier, digital-out boards, and the Hymnal board), the wiring of a Pi HAT to the panel, the carrier-board shape, the PCM5102A worked through, and what is still to prove on the bench.

How it is put together

flowchart LR
    core["evo-core<br/>the fabric on Linux"]
    audio["evo-device-audio<br/>the audio slot shapes"]
    esp["evo-esp32<br/>the fabric on an MCU"]
    comp["volumio-esp-companion<br/>hal · core · drivers · platform · firmware"]

    core -.->|concepts| esp
    audio -.->|slot shapes| esp
    comp ==>|crates by commit| esp
Loading

What carries from evo-core is the shape, not the code: a catalogue resolved when the firmware is built; plugin crates admitted in-process; a steward that owns subjects, emits happenings and serves projections; one network client protocol outward. Processes, Unix sockets and runtime admission have no equivalent on a microcontroller and are replaced by what does.

What this repository does not write: pins, bring-up, display, touch, IO expander, Wi-Fi, configuration store, HTTP, nor the pages themselves. Those are the companion project's crates, consumed by tag where one exists and by commit where the work is ahead of it. One hardware layer, two applications: the Volumio companion and this player. The panel here is a consumer of the steward's projections, drawn by the player's own face crate (see Face) on the companion's display and touch drivers.

flowchart TB
    sdk[sdk · no_std · plugin contract, slot contracts]
    steward[steward · no_std · the authority]
    cat[catalogue · std · the host tool, emits the catalogue as Rust]
    plugins[plugins/org.evoframework.* · stock the slots]
    host[distributions/host · the fabric on a desktop, panel to PNG]
    fw[firmware/waveshare-esp32-c5-touch-lcd-28 · the fabric on the board]

    steward --> sdk
    plugins --> sdk
    host --> steward
    host --> plugins
    host -.->|build.rs| cat
    fw --> steward
    fw --> plugins
    fw -.->|build.rs| cat
Loading

Arrows read "depends on". Plugins never depend on each other, nor on the steward; the steward never names a plugin.

Two devices on one panel

Volumio companion evo-esp32 player
The engine Volumio on a Raspberry Pi, over the network The panel itself
Audio None leaves the panel I2S to an external DAC or amplifier; see Audio out
Needs on the panel Power Power, a stereo DAC and a jack on a carrier board
Repository volumio-esp-companion this one

Clone this wiki locally