Repository navigation
Boards
The boards the project targets, what each carries, and where each stands. Facts are from the vendors' pages, read on 17 October 2026; sources at the end.
Three boards share one panel, one touch controller and one shape, and differ in the chip behind them. From Waveshare's ESP32 LCD comparison table:
| Board | SoC | PSRAM | Flash | Display | Touch | IMU | RTC | TF | Speaker | Mic | Battery | Standing |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ESP32-C5-Touch-LCD-2.8 | ESP32-C5HR8, RISC-V | 8 MB | 32 MB | ST7789, SPI, 240x320 | CST3530 | yes | yes | yes | yes | yes | yes | Running: bring-up through the expander, panel, touch, the application, album art, configuration by card, joins on 2.4 or 5 GHz. No audio yet. |
| ESP32-C6-Touch-LCD-2.8 | ESP32-C6, RISC-V | none | 16 MB | ST7789, SPI, 240x320 | CST3530 | yes | yes | yes | yes | yes | yes | Planned. |
| ESP32-S3-Touch-LCD-2.8 | ESP32-S3R8, Xtensa | 8 MB | 16 MB | ST7789, SPI, 240x320 | CST3530 | yes | yes | yes | yes | no | yes | Planned. |
All three list I2C, UART and an SH1.0 12-pin header as peripheral interfaces.
What the differences mean for the companion:
- The C5 has 2.4 and 5 GHz Wi-Fi; the C6 is 2.4 GHz only.
- The C6 has no PSRAM, so album art is decoded differently there, or not at all: the capabilities record says which.
- The S3 has no microphone, so voice features cannot exist on it.
- The S3 is Xtensa where the C5 and C6 are RISC-V: a different Rust target and toolchain, which is why each firmware crate pins its own.
The first board, from Waveshare's product page:
| Part | What |
|---|---|
| Module | ESP32-C5-WROOM-1: RISC-V 32-bit up to 240 MHz, 384 KB SRAM, 8 MB PSRAM, 32 MB flash |
| Radio | 2.4 and 5 GHz Wi-Fi, Bluetooth 5 (LE), IEEE 802.15.4 |
| Display | 2.8" IPS, 240x320, 262K colours, 4-wire SPI, ST7789 |
| Touch | Capacitive, CST3530, I2C with interrupt |
| Audio | ES8311 codec, NS4150B amplifier, onboard microphone, MX1.25 speaker header; an 8 ohm 2 W speaker is in the box |
| Sensors | QMI8658 six-axis IMU, SHTC3 temperature and humidity |
| RTC | PCF85063, SH1.0 RTC battery header |
| Power | ETA6098 charger, MX1.25 3.7 V Li battery header, power on/off chip, BAT power button |
| IO expander | CH32V003 |
| Storage | TF slot, up to 64 GB |
| Connectors | UART header, I2C header, SH1.0 12-pin, expansion IO pads, USB-C (full-speed USB) |
| Buttons | RESET, BOOT (usable as a general-purpose button) |
| In the box | SH1.0 12-pin cable, two SH1.0 4-pin cables, the speaker, optionally a 1000 mAh battery |
From Waveshare's schematic and the board-connections table in its repository, read 17 October 2026. Directions are from the ESP32-C5's side.
| Function | ESP32-C5 pin |
|---|---|
| I2C, one bus shared by every onboard device and the I2C header | SDA GPIO 0, SCL GPIO 1; 2 kΩ pull-ups to 3.3 V on the board |
| SPI, shared by the LCD and the TF card | SCK GPIO 6, MOSI GPIO 7, MISO GPIO 8 |
| LCD (ST7789) | DC GPIO 9, CS GPIO 10; reset on the IO expander's EXIO1; backlight on the expander's PWM |
| TF card | CS GPIO 23, SPI mode |
| Touch (CST3530, I2C 0x58) | INT GPIO 5; reset on the expander's EXIO0 |
| IMU (QMI8658) | INT1 GPIO 4 |
| I2S to the codec (ES8311) | BCLK GPIO 24, LRCK GPIO 25, data in GPIO 26, data out GPIO 27; no external MCLK |
| USB | D− GPIO 13, D+ GPIO 14 (USB Serial/JTAG; also on J8) |
| UART0 | TXD GPIO 11, RXD GPIO 12 (J6); the serial console by default |
| BOOT button | GPIO 28 |
| IO expander (CH32V003, I2C 0x24) | EXIO0 touch reset, EXIO1 LCD reset, EXIO2 RTC interrupt, EXIO3 amplifier enable, EXIO4–7 on pads and J8; PWM the backlight; ADC the battery |
| Free | GPIO 2, GPIO 3 (on J8) |
The expander owns the resets and the backlight, so the firmware brings it up first, releases the resets, then the panel, then the touch. Its firmware is programmed at the factory.

| Header | Pins, from pin 1 | What it is for |
|---|---|---|
| J8, SH1.0 12-pin | GND, USB 5 V, USB D−, USB D+, GND, 3V3, GPIO 2, GPIO 3, EXIO6, EXIO7, BOOT0, CHIP_PU | Power, USB and a few lines on one cable, to a case or a dock |
| J5, I2C 4-pin | SCL, SDA, 3V3, GND | The board's own I2C bus, for adding a peripheral; see Connections |
| J6, UART 4-pin | RXD, TXD, 3V3, GND | UART0; the serial link to a Pi; see Connections |
Pin 1 is as the schematic numbers it; check the silkscreen before wiring.
Waveshare SKU 27579, the panel rpi-waveshare28 drives on a Raspberry Pi: ST7789V (ST7789T3) over 4-wire SPI, 240(H) x 320(V) native portrait; Hynitron CST328 capacitive touch over I2C at 0x1A; no MISO on either connector. The same display controller family as the ESP32 boards; a different touch controller, which is why the CST3530 gets a driver of its own.
Any vendor's ESP32 display board is in scope after the three siblings, SPI panels before QSPI, RGB and MIPI. A board joins as one crate under firmware/; a controller chip it carries that the project has not met joins as one crate under drivers/. The repository's firmware/README.md and drivers/README.md say what each crate must contain.
- Waveshare, ESP32-C5-Touch-LCD-2.8 product page: https://www.waveshare.com/product/esp32-related/displays/lcd-spi-qspi/esp32-c5-touch-lcd-2.8.htm
- Waveshare docs, ESP32-C5-Touch-LCD-2.8: https://docs.waveshare.com/ESP32-C5-Touch-LCD-2.8
- Waveshare's board repository, with the schematic and the board-connections table: https://github.com/waveshareteam/ESP32-C5-Touch-LCD-2.8
- Espressif, ESP32-C6 product page (2.4 GHz Wi-Fi 6): https://www.espressif.com/en/products/socs/esp32-c6
- rpi-waveshare28, Hardware: https://github.com/foonerd/rpi-waveshare28
Volumio ESP Companion is free and open source, designed, built and maintained by one developer in his own time. If it has earned a place beside your player:
Provided as-is under the MIT licence; sponsorship is a thank-you, not a purchase: it buys no priority, no features and no support agreement.