Device matrix
Campaign and product boards in this repo use the board devices contract: eager UI in
board_config.py, lazy extras in
board_devices.py (DEVICES).
Related inventories (keep concerns separate):
| Doc | Role |
|---|---|
| board-inventory.md | Physical Detect fixtures (#) — chip, flash, runtime |
| firmware-fixtures.md | Detect probe notes / esptool details |
| pydisplay-display-boards.md | Display bring-up quirks (panel, touch, soft-reset) |
| This file | Fixture # ↔︎ product ↔︎ board_config ↔︎ eager / lazy
roles |
Paths below are relative to board_configs/ and are
MicroPython trees (with board_devices).
CircuitPython twins under cp/ are eager-UI only
(display_drv / runtime / touch /
keypad / encoder / joystick) — no
lazy DEVICES (use native board for the
rest).
Campaign matrix
First-wave display campaign. Lazy column is the live
DEVICES set.
| Product | Inventory # | board_config path |
Eager UI | Lazy DEVICES |
|---|---|---|---|---|
| Waveshare ESP32-P4-WIFI6-Touch-LCD-4B | #1 | fbdisplay/esp32-p4-wifi6-touch-lcd-4b |
touch |
audio, microphone, sdcard,
camera, radio, wlan,
ble, usb_device |
| Adafruit Qualia S3 + TL040HDS20 | #8 | fbdisplay/qualia_tl040hds20 |
touch, keypad,
io_expander |
wlan, ble |
| Waveshare ESP32-S3-Touch-LCD-4.3 | — | fbdisplay/esp32-s3-touch-lcd-4_3 |
touch, io_expander |
sdcard, can, rs485,
usb_device, wlan, ble |
| Waveshare ESP32-S3-Touch-LCD-7 | — | fbdisplay/esp32-s3-touch-lcd-7 |
touch, io_expander |
sdcard, can, rs485,
usb_device, wlan, ble |
| LILYGO T-RGB 2.1″ | — | fbdisplay/t-rgb_480 |
touch |
sdcard, battery, wlan,
ble |
| LILYGO T-Embed | — | busdisplay/spi/t-embed |
encoder |
pixels, audio, microphone,
sdcard, battery, i2c,
wlan, ble |
| LILYGO T-HMI | — | busdisplay/i80/t-hmi |
touch |
sdcard, i2c, wlan,
ble |
| Waveshare RP2040-Touch-LCD-1.28 | — | busdisplay/spi/rp2040-touch-lcd-1.28 |
touch |
accelerometer, gyroscope,
battery |
| Adafruit Metro M7 + TFT shield 1947 | #5 host | busdisplay/spi/metro_m7_tft_touch_shield_1947 |
touch |
pixels, led, sdcard,
radio, wlan, i2c |
| ST NUCLEO-H743ZI2 + TFT shield 1947 | #25 | busdisplay/spi/nucleo_h743zi2_tft_touch_shield_1947 |
touch |
led, sdcard, ethernet |
display_drv / runtime /
display_bus are always part of the board surface when
present; they are omitted from the Eager column for brevity.
P4 WIFI6-Touch-LCD-4B has no ethernet PHY (ETH is a different SKU);
camera stays in DEVICES as a CSI stub.
Product matrix (MP retrofit)
Sensor-rich / inventory-linked products. All rows below have
board_devices.py unless noted. Some factories still raise
NotImplementedError until chip drivers land — the
DEVICES set is the contract surface.
| Product | Inventory # | board_config path (MP) |
Eager UI | Lazy DEVICES |
Notes |
|---|---|---|---|---|---|
| Adafruit FunHouse | #13 | busdisplay/spi/funhouse |
touch, keypad |
temperature, humidity,
pressure, pixels, audio,
wlan |
no BLE on ESP32-S2 |
| Adafruit PyGamer | #27 | busdisplay/spi/pygamer |
joystick, keypad |
pixels, accelerometer,
sdcard, battery, audio,
i2c |
|
| Adafruit Feather RP2040 + RGB matrix wing | #7 host | fbdisplay/feather_rp2040_rgb_matrix_64x32 |
— | i2c |
matrix is display_drv |
| Adafruit Feather RP2040 DVI | #21 | fbdisplay/adafruit_feather_rp2040_dvi_320x240 |
— | — | MP stub raises NotImplementedError (SRAM); CP POC under
cp/fbdisplay/adafruit_feather_rp2040_dvi_320x240 |
| Teensy 4.1 + FlexIO ILI9341 | #23 | busdisplay/i80/teensy41_flexio_ili9341 |
— | (empty) | split layout; no onboard lazy extras |
| Teensy 4.1 + RGB matrix featherwing | #23 | fbdisplay/rgb_matrix_featherwing_teensy41_64x32 |
— | (empty) | |
| Adafruit MagTag | — | epaperdisplay/magtag |
keypad |
pixels, audio, i2c,
wlan |
no contract role for ALS |
| Adafruit PyBadge | — | busdisplay/spi/pybadge |
keypad |
pixels, accelerometer, audio,
i2c |
|
| Adafruit PyPortal | — | busdisplay/spi/pyportal |
touch |
sdcard, radio, audio,
i2c, wlan |
AirLift as radio/wlan |
| Adafruit PyPortal Titano | — | busdisplay/spi/pyportal_titano |
touch |
sdcard, radio, audio,
i2c, wlan |
|
| Adafruit HalloWing M4 | — | busdisplay/spi/hallowing_m4 |
— | pixels, accelerometer, audio,
i2c |
|
| ODROID-GO | — | busdisplay/spi/odroid_go |
joystick, keypad |
battery, sdcard, audio,
wlan |
|
| M5Stack CoreS3 | — | busdisplay/spi/m5stack-cores3 |
touch |
microphone, audio, sdcard,
camera, accelerometer, gyroscope,
i2c, wlan, ble |
AW88298/ES7210/BMI270 wired; camera stub |
| M5Stack Tab5 (ILI9881C) | — | fbdisplay/m5stack_tab5_ili9881c |
touch |
microphone, audio, sdcard,
camera, i2c, wlan,
ble |
ES8388/ES7210 wired; camera stub |
| M5Stack Tab5 (ST7123) | — | fbdisplay/m5stack_tab5_st7123 |
touch |
microphone, audio, sdcard,
camera, i2c, wlan,
ble |
same |
| LILYGO T-Display-S3 | — | busdisplay/i80/t-display-s3 |
— | battery, wlan, ble |
|
| LILYGO T-Display-S3 Pro | — | busdisplay/spi/t-display-s3-pro |
touch |
sdcard, battery, wlan,
ble |
|
| LILYGO T-QT Pro | — | busdisplay/spi/t-qt-pro |
— | battery, wlan, ble |
|
| LILYGO T-Dongle-S3 | — | busdisplay/spi/t-dongle-s3 |
— | pixels, wlan, ble |
|
| Adafruit MatrixPortal M4 | — | fbdisplay/matrixportal_m4_64x32 |
— | accelerometer, i2c |
HUB75 is display_drv |
| Adafruit MatrixPortal S3 | — | fbdisplay/matrixportal_s3_64x64 |
— | accelerometer, i2c, wlan,
ble |
|
| BPI-Centi-S3 | — | busdisplay/i80/bpi-centi-s3 |
encoder |
wlan, ble |
|
| WT32-SC01 Plus | — | busdisplay/i80/wt32sc01-plus |
touch |
sdcard, wlan, ble |
|
| ESP32-WROVER-E ST7789 + joystick | — | busdisplay/spi/esp32_wrover_e_st7789_joystick |
joystick |
wlan |
|
| PiTFT ILI9341 FeatherWing | — | busdisplay/spi/pitft_ili9341_featherwing |
touch |
i2c |
host-dependent STEMMA |
| Pico 2 + DVI Sock / PiCowbell HSTX | — | fbdisplay/pico2_dvi_sock_640x480 |
— | (empty) | Sock and PiCowbell share GP12–19 |
| Pico 2 W + DVI Sock / PiCowbell HSTX | — | fbdisplay/pico2w_dvi_sock_640x480 |
— | wlan, ble |
same HSTX pins + CYW43 |
| Olimex RP2350pc | — | fbdisplay/olimex_rp2350pc_640x480 |
— | sdcard, led, i2c |
onboard HDMI (HSTX); no adapter |
| SparkFun IoT RedBoard RP2350 + HSTX→DVI | — | fbdisplay/sparkfun_iot_redboard_rp2350_hstx_640x480 |
— | sdcard, led, i2c,
wlan, ble |
needs FPC + SparkFun HSTX→DVI breakout |
Inventory
fixtures without a product board_config
Detect capture only — no dedicated pydisplay product config to retrofit. Shield / host rows above already cover Metro M7 (#5) and Nucleo (#25) with display shields.
| # | Board / model | Notes |
|---|---|---|
| 2–4, 6, 9–10, 12, 14–15, 22 | Generic ESP32-S3 modules | No product display config |
| 11 | Waveshare RP2040-Plus | No product display config (distinct from RP2040-Touch-LCD-1.28) |
| 16 | Raspberry Pi Pico | Host only; use sock / shield configs when applicable |
| 17, 20, 28 | ESP32-PICO-V3-02 boards | No product display config |
| 18 | Adafruit QT Py M0 | No onboard display config (EyeSPI stacks are separate) |
| 19 | Seeed XIAO nRF52840 Sense | Sensors on-hand; no display board_config |
| 24 | SparkFun Thing Plus SAMD51 | No product display config |
| 26 | Adafruit PyRuler | No display |
| 29 | Adafruit Feather nRF52840 Express | Host only |
| 30 | Adafruit Trinket M0 | No display |
MIP install
import mip
mip.install(
"github:PyDevices/micropython-hardware/board_configs/<path>"
)Replace <path> with a directory from the tables
(for example fbdisplay/esp32-p4-wifi6-touch-lcd-4b). Also
install pydisplay core packages listed in that board’s
package.json deps.
Notes
- Lazy roles listed in
DEVICESmay still raiseNotImplementedErroruntil factories are filled — the set is the contract surface, not a completeness guarantee. - Boards without an Inventory # were not part of the 2026-07-18 Detect fixture capture (or are common products kept for the matrix).
bt(Classic) is omitted unless a product is known to expose BR/EDR.- Light / ALS sensors have no contract role yet — omit from
DEVICES. - Metro M7 inventory #5 is the host; the campaign path is the host + Adafruit TFT shield 1947.
- Generic epaper/OLED breakouts and EyeSPI stacks are not enumerated
here unless they expose meaningful non-display
DEVICESroles.