Files
tactility/Drivers/GDEQ031T10

GDEQ031T10

Display driver for the GoodDisplay GDEQ031T10, a 3.1" 320x240 SPI e-paper panel (UC8253-family controller) used by the LilyGO T-Deck Pro/Max.

The command sequence (panel setting, power on/off, fast/partial LUT timings, deep sleep) is ported from the vendor reference driver in Xinyuan-LilyGO/T-Deck-MAX (examples/Elink_paper/GDEQ031T10_Arduino/Display_EPD_W21.cpp).

Unlike EPDiyDisplay (which targets parallel-bus "EPD47"-style panels via the epdiy library), this panel uses a simple 4-wire SPI interface (CS/DC/RST/BUSY + SCK/MOSI), so it's driven directly with ESP-IDF's spi_master and gpio APIs rather than epdiy or esp_lcd_panel.

Each LVGL flush is staged and handed off to a dedicated refresh task (the physical refresh takes hundreds of ms to over a second, too long to run in LVGL's flush callback without stalling input). The task diffs the new frame against a shadow of what the panel currently holds and, where possible, performs a windowed partial refresh of just the changed region instead of redrawing the whole panel. A full refresh is still done on the first draw, on an explicit requestFullRefresh(), when a change covers most of the screen, or periodically to clear the ghosting that partial updates accumulate (gated by MAX_PARTIAL_REFRESHES, with a localized ghost-clear preferred over a full flash when the accumulated changes are confined to a small region). The panel's charge pump is powered off once the refresh task's queue goes idle, not after every single refresh. Four refresh modes are available, trading speed for quality:

  • Full (~3s) - best quality, used by default
  • Fast (~1.0s)
  • Slow (~1.5s)
  • Partial (~0.5s) - most ghosting

requestFullRefresh() forces the next flush to use Full mode, useful for clearing up ghosting accumulated from a run of fast/partial refreshes.