Skip to content

feat: add Seeed reTerminal E1004 (13.3" T133A01 Spectra 6) support#103

Draft
TehesFR wants to merge 1 commit into
OpenDisplay:mainfrom
TehesFR:feat/seeed-reterminal-e1004
Draft

feat: add Seeed reTerminal E1004 (13.3" T133A01 Spectra 6) support#103
TehesFR wants to merge 1 commit into
OpenDisplay:mainfrom
TehesFR:feat/seeed-reterminal-e1004

Conversation

@TehesFR

@TehesFR TehesFR commented Jul 15, 2026

Copy link
Copy Markdown

Adds an esp32-s3-E1004 env and runtime support for the Seeed reTerminal E1004 (13.3" T133A01 Spectra 6, 1200x1600, dual-controller: one CS per panel half).

Depends on bitbank2/bb_epaper#32 — the env pins lib_deps to that PR's commit; other envs keep upstream bb_epaper. All E1004 code is compiled out without the fork's BBEP_T133A01 define and runtime-gated on e1004_panel_used(), so nothing changes for existing devices. The pin can be switched to upstream once #32 merges.

How it works

  • Row streaming cannot split rows across two chip selects, so full frames (boot screen, 0x70 and PIPE_WRITE transfers) are collected in a 937.5 KB 4bpp PSRAM framebuffer and sent with bbepWritePlane().
  • bbepInitIO() runs the full dual-chip init for this panel; the generic wakeup + re-init is skipped. CS2 comes from the display block's reserved_pin_2 (cs_pin_2 in the toolbox schema), default GPIO2.
  • bbepRefresh() is synchronous for the T133A01 (~30 s); waitforrefresh() treats an already-idle panel as completed. Fast refresh is forced to FULL (the fast fallback re-init wipes the frame).
  • A panel-0x0042 config must be 1200x1600 BWGBRY, otherwise the framebuffer is not attached and boot/transfers fail cleanly; bbepWritePlane() failures NACK with 0x74.
  • Env builds with OPENDISPLAY_ZLIB_WINDOW_BITS=15 (py-opendisplay/HA compress with standard 32K-window zlib; the default 512-byte window rejects the compressed START).

Device config

field value
system_config.pwr_pin 12
panel_ic_type 66 (0x0042)
pixel_width x height / color_scheme 1200x1600 / 4 (BWGBRY)
reset / busy / dc / cs / data / clk 38 / 13 / 11 / 10 / 9 / 7
cs_pin_2 (reserved_pin_2) 2
rotation 0 (required)

Validation (real hardware)

Boot screen, and Home Assistant end to end (compressed 0x70: 960,000 bytes in 193 chunks, 10.2 s, then FULL refresh and 0x73). esp32-s3-N32R8-extuart and esp32-s3-N16R8 still build against upstream bb_epaper.
CleanShot 2026-07-15 at 10 41 03

Limitations

  • rotation must be 0 (hosts/renderers rotate; the validated dual-CS write path is native-orientation only).
  • No partial updates (structurally rejected in both partial protocols).
  • Follow-up: generalizing the predicate to iFlags & BBEP_SPLIT_BUFFER would cover other dual-controller panels (e.g. EP81_SPECTRA), not testable here.

Adds an esp32-s3-E1004 env and runtime support for the dual-controller
T133A01/EL133UF1 1200x1600 Spectra 6 panel (panel_ic_type 0x0042).

The panel is driven through bb_epaper's EP133A_SPECTRA_1200x1600 (pinned
to the bitbank2/bb_epaper#32 commit until it is merged upstream). Full
frames are collected in a 937.5 KB 4bpp PSRAM framebuffer and sent with
bbepWritePlane(), which splits the frame across the two chip selects;
the row-streaming write paths cannot address the second controller.
CS2 comes from the display block's spare cs_pin_2 field (default GPIO2)
and is parked/driven with the other panel lines across power state
changes. All E1004-specific code is gated on the BBEP_T133A01 define,
so envs building against upstream bb_epaper are unchanged.
@TehesFR

TehesFR commented Jul 15, 2026

Copy link
Copy Markdown
Author

cc @jonasniesner
Feel free to edit anything you want, but this is working on my side.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant