← micropython-hardware docs

TFT_eSPI parity (Arduino) vs pydisplay / displayif

TFT_eSPI is an Arduino graphics library with per-board User_Setup pin tables and many chip drivers. pydisplay splits the same problem across bus drivers, chip drivers, and displayif accelerated scanout.

This document states what is implemented, what uses Python fallbacks, and what is out of scope (document only).

Bus-level mapping

TFT_eSPI mode pydisplay (Python) displayif (MicroPython C) Notes
SPI (SPI_FREQUENCY, TFT_*) spibus.SPIBus + chip driver (ili9341, st7789, …) spibus cmod Full parity for SPI TFT init + pixel push via BusDisplay
8-bit parallel 8080 (TFT_D0TFT_D7, TFT_WR) drivers/bus/i80bus.py (viper GPIO bitbang) rp2: PIO+DMA i80bus; esp32-S3: esp_lcd I80; mimxrt1062: FlexIO MCULCD; samd51: GPIO bitbang (common/i80bus) Native path preferred when flashed; Python path works without displayif
16-bit parallel esp32-S3 i80bus only TFT_eSPI 16-bit setups map to esp32 native driver, not Python
RGB / DPI parallel rgbframebuffer (esp32 RGB LCD, mimxrt1062 eLCDIF) Not in TFT_eSPI for RP2040; Qualia / RK043 class panels
rgbmatrix, picodvi, mipidsi Not TFT_eSPI scope (HUB75, DVI/HSTX, MIPI DSI)

RP2040 / RP2350

Capability Status
SPI TFT Donespibus + vendored chip drivers; board configs under busdisplay/spi/
8-bit I80 Done (native) — displayif i80bus PIO+DMA on rp2; example ili9341_i80_rp2040
8-bit I80 (Python) Donei80bus.py + gpio_pin (RP2040 SIO); RP2350 uses same SIO base
RGB parallel N/A — no RP DPI peripheral; use SPI/I80 or picodvi (DVI)
MIPI DSI N/A — RP2350 has HSTX (DVI), not DSI; use picodvi + HSTX board configs
DVI / HSTX Donepicodvi (RP2040 PIO libdvi, RP2350 HSTX); configs: pico2_dvi_sock, pico2w_dvi_sock, olimex_rp2350pc, sparkfun_iot_redboard_rp2350_hstx, pimoroni_pico_dv_base, adafruit_metro_rp2350_hstx_640x480

drivers/bus/_rp2_wip.py was an early PIO experiment — superseded by displayif i80bus; not wired from board configs.

ESP32 (S2/S3/C3/P4, …)

Capability Status
SPI TFT Donespibus + chip drivers
8-bit I80 Done (S3) — displayif i80bus; configs e.g. t-display-s3, wt32sc01-plus
RGB parallel Done (RGB LCD SoCs) — displayif rgbframebuffer; Qualia, t-rgb_480
MIPI DSI Done (P4) — displayif mipidsi; Waveshare 4B, M5 Tab5 MP config
HUB75 Done (S3) — displayif rgbmatrix Protomatter

PSRAM: large rgbframebuffer / mipidsi framebuffers need CONFIG_SPIRAM in sdkconfig. Enable SPIRAM for the ESP32 board before linking displayif.

mimxrt (1062 / 1176)

Capability Status
SPI / I2C Donespibus, i2cbus
8-bit I80 Done (1062) — FlexIO i80bus
RGB parallel Done (1062) — eLCDIF rgbframebuffer; RK043 EVK config
MIPI DSI Done (1176)mipidsi + TC358762 bridge; Waveshare 5″ DSI EVK config
HUB75 Done (1062)rgbmatrix Protomatter

samd (SAMD51)

Capability Status
SPI / I2C Done
8-bit I80 Done (SAMD51) — GPIO bitbang via common/i80bus/gpio_bitbang.c
RGB / DSI N/A — stubs only; no SoC DPI/DSI
HUB75 Donergbmatrix Protomatter (Matrix Portal M4 configs)

Chip drivers (TFT_eSPI SetupNNN_*)

TFT_eSPI bundles dozens of controller init tables. pydisplay vendors CircuitPython displayio chip drivers (ili9341, st7701, gc9a01, …) and wires them through BusDisplay / EPaperDisplay — equivalent role, different file layout. Adding a new panel is a driver + board_config pair, not a User_Setup.h edit.

Board config coverage (MP + CP)

Board MP CP
M5 Tab5 ILI9881C (early) m5stack_tab5_ili9881c cp/fbdisplay/m5stack_tab5_ili9881c
M5 Tab5 ST7123 (current) m5stack_tab5_st7123
Pico 2 + DVI Sock / PiCowbell HSTX pico2_dvi_sock_640x480 cp/fbdisplay/pico2_dvi_sock_640x480
Pico 2 W + DVI Sock / PiCowbell HSTX pico2w_dvi_sock_640x480 cp/fbdisplay/pico2w_dvi_sock_640x480
Olimex RP2350pc (onboard HDMI) olimex_rp2350pc_640x480 cp/fbdisplay/olimex_rp2350pc_640x480
SparkFun IoT RedBoard + HSTX→DVI sparkfun_iot_redboard_rp2350_hstx_640x480 cp/fbdisplay/sparkfun_iot_redboard_rp2350_hstx_640x480
Metro RP2350 HSTX adafruit_metro_rp2350_hstx_640x480 cp/fbdisplay/adafruit_metro_rp2350_hstx_640x480
Pimoroni Pico DV (RP2040 PIO) pimoroni_pico_dv_base_640x480 cp/fbdisplay/pimoroni_pico_dv_base_640x480
LilyGO T-RGB t-rgb_480 — (MP-focused)

When not to port TFT_eSPI features