Device matrix

August 20, 2026 · View on GitHub

Which board_config serves which product board, and what each one exposes under the board peripherals contract: eager UI in board_config.py, lazy extras in board_peripherals.py (PERIPHERALS).

For panel, touch controller, and bring-up quirks on these boards, see display-boards.md.

Paths below are relative to board_configs/ and are MicroPython trees (the ones with board_peripherals). CircuitPython twins under cp/ are eager-UI only (display_drv / app / touch / keypad / encoder / joystick) — they have no lazy PERIPHERALS; use native board for the rest.

display_drv / app / display_bus are always part of the board surface when present, and are omitted from the Eager column for brevity.


Panel-first boards

Boards whose display is the reason to buy them.

Productboard_config pathEager UILazy PERIPHERALS
Waveshare ESP32-P4-WIFI6-Touch-LCD-4Bfbdisplay/esp32-p4-wifi6-touch-lcd-4btouchaudio_out, audio_in, sdcard, camera, radio, wlan, ble, usb_device
Adafruit Qualia S3 + TL040HDS20fbdisplay/qualia_tl040hds20touch, keypad, io_expanderwlan, ble
Waveshare ESP32-S3-Touch-LCD-4.3fbdisplay/esp32-s3-touch-lcd-4_3touch, io_expandersdcard, can, rs485, usb_device, wlan, ble
Waveshare ESP32-S3-Touch-LCD-7fbdisplay/esp32-s3-touch-lcd-7touch, io_expandersdcard, can, rs485, usb_device, wlan, ble
LILYGO T-RGB 2.1″fbdisplay/t-rgb_480touchsdcard, battery, wlan, ble
LILYGO T-Embedbusdisplay/spi/t-embedencoderpixels, audio_out, audio_in, sdcard, battery, i2c, wlan, ble
LILYGO T-HMIbusdisplay/i80/t-hmitouchsdcard, i2c, wlan, ble
Waveshare RP2040-Touch-LCD-1.28busdisplay/spi/rp2040-touch-lcd-1.28touchaccelerometer, gyroscope, battery
Adafruit Metro M7 + TFT shield 1947busdisplay/spi/metro_m7_tft_touch_shield_1947touchpixels, led, sdcard, radio, wlan, i2c
ST NUCLEO-H743ZI2 + TFT shield 1947busdisplay/spi/nucleo_h743zi2_tft_touch_shield_1947touchled, sdcard, ethernet

The ESP32-P4 WIFI6-Touch-LCD-4B has no ethernet PHY (ETH is a different SKU); camera stays in PERIPHERALS as a CSI stub.


Sensor-rich and general boards

All rows have board_peripherals.py unless noted. Some factories still raise NotImplementedError until the chip drivers land — the PERIPHERALS set is the contract surface, not a completeness guarantee.

Productboard_config path (MP)Eager UILazy PERIPHERALSNotes
Adafruit FunHousebusdisplay/spi/funhousetouch, keypadtemperature, humidity, pressure, pixels, audio_out, wlanno BLE on ESP32-S2
Adafruit PyGamerbusdisplay/spi/pygamerjoystick, keypadpixels, accelerometer, sdcard, battery, audio_out, i2c
Adafruit Feather RP2040 + RGB matrix wingfbdisplay/feather_rp2040_rgb_matrix_64x32i2cmatrix is display_drv
Adafruit Feather RP2040 DVIfbdisplay/adafruit_feather_rp2040_dvi_320x240MP stub raises NotImplementedError (SRAM); CP POC under cp/fbdisplay/adafruit_feather_rp2040_dvi_320x240
Teensy 4.1 + FlexIO ILI9341busdisplay/i80/teensy41_flexio_ili9341(empty)split layout; no onboard lazy extras
Teensy 4.1 + RGB matrix featherwingfbdisplay/rgb_matrix_featherwing_teensy41_64x32(empty)
Adafruit PyBadgebusdisplay/spi/pybadgekeypadpixels, accelerometer, audio_out, i2c
Adafruit PyPortalbusdisplay/spi/pyportaltouchsdcard, radio, audio_out, i2c, wlanAirLift as radio/wlan
Adafruit PyPortal Titanobusdisplay/spi/pyportal_titanotouchsdcard, radio, audio_out, i2c, wlan
Adafruit HalloWing M4busdisplay/spi/hallowing_m4pixels, accelerometer, audio_out, i2c
ODROID-GObusdisplay/spi/odroid_gojoystick, keypadbattery, sdcard, audio_out, wlan
M5Stack CoreS3busdisplay/spi/m5stack-cores3touchaudio_in, audio_out, sdcard, camera, accelerometer, gyroscope, i2c, wlan, bleAW88298/ES7210/BMI270 wired; camera stub
M5Stack Tab5 (ILI9881C)fbdisplay/m5stack_tab5_ili9881ctouchaudio_in, audio_out, sdcard, camera, i2c, wlan, bleES8388/ES7210 wired; camera stub
M5Stack Tab5 (ST7123)fbdisplay/m5stack_tab5_st7123touchaudio_in, audio_out, sdcard, camera, i2c, wlan, blesame
LILYGO T-Display-S3busdisplay/i80/t-display-s3battery, wlan, ble
LILYGO T-Display-S3 Probusdisplay/spi/t-display-s3-protouchsdcard, battery, wlan, ble
LILYGO T-QT Probusdisplay/spi/t-qt-probattery, wlan, ble
LILYGO T-Dongle-S3busdisplay/spi/t-dongle-s3pixels, wlan, ble
Adafruit MatrixPortal M4fbdisplay/matrixportal_m4_64x32accelerometer, i2cHUB75 is display_drv
Adafruit MatrixPortal S3fbdisplay/matrixportal_s3_64x64accelerometer, i2c, wlan, ble
BPI-Centi-S3busdisplay/i80/bpi-centi-s3encoderwlan, ble
WT32-SC01 Plusbusdisplay/i80/wt32sc01-plustouchsdcard, wlan, ble
ESP32-WROVER-E ST7789 + joystickbusdisplay/spi/esp32_wrover_e_st7789_joystickjoystickwlan
PiTFT ILI9341 FeatherWingbusdisplay/spi/pitft_ili9341_featherwingtouchi2chost-dependent STEMMA
Pico 2 + DVI Sock / PiCowbell HSTXfbdisplay/pico2_dvi_sock_640x480(empty)Sock and PiCowbell share GP12–19
Pico 2 W + DVI Sock / PiCowbell HSTXfbdisplay/pico2w_dvi_sock_640x480wlan, blesame HSTX pins + CYW43
Olimex RP2350pcfbdisplay/olimex_rp2350pc_640x480sdcard, led, i2conboard HDMI (HSTX); no adapter
SparkFun IoT RedBoard RP2350 + HSTX→DVIfbdisplay/sparkfun_iot_redboard_rp2350_hstx_640x480sdcard, led, i2c, wlan, bleneeds FPC + SparkFun HSTX→DVI breakout

MIP install

import mip
mip.install(
    "github:PyDevices/pydevices/board_configs/<path>"
)

Replace <path> with a directory from the tables (for example fbdisplay/esp32-p4-wifi6-touch-lcd-4b). Also install the PyDevices packages listed in that board’s package.json deps.


Notes

  • Lazy roles listed in PERIPHERALS may still raise NotImplementedError until factories are filled — the set is the contract surface, not a completeness guarantee.
  • bt (Classic) is omitted unless a product is known to expose BR/EDR.
  • Light / ALS sensors have no contract role yet — omit from PERIPHERALS.
  • Metro M7 and Nucleo-H743ZI2 rows are the host board plus the Adafruit TFT touch shield 1947; the shield carries the display and touch.
  • Generic OLED breakouts and EyeSPI stacks are not enumerated here unless they expose meaningful non-display PERIPHERALS roles.