velxio/test/test_epaper/autosearch/02_controllers.md

94 lines
4.1 KiB
Markdown
Raw Normal View History

# 02 — ePaper controller IC families
Every panel ships with one of a small set of controllers. The panel's
size/resolution/colour-mode is glued to a specific controller — the
firmware library (GxEPD2, Adafruit_EPD, ESPHome `waveshare_epaper`) picks
the controller-specific driver based on the panel name, but the
**SPI command set is what we actually emulate**.
## The Solomon Systech SSD168x family (B/W mono, B/W/R)
This is by far the most common family for small panels (1.54"4.2"). They
all share ~95% of the command set; differences are mainly RAM size and
which driver-output config bytes are accepted.
| Controller | Typical panel | RAM (px) | Colours | Notes |
|---|---|---|---|---|
| **SSD1675A** (= IL3897) | 2.13" 250×122 | 250×122 | B/W or B/W/R | Two RAM planes for tri-colour |
| **SSD1680** | 2.13" / 2.9" tri-colour | 296×128 max | B/W or B/W/R | Newer revision of SSD1675 |
| **SSD1681** | 1.54" 200×200 | 200×200 | B/W | Smallest, fastest init |
| **SSD1683** | 4.2" 400×300 | 400×300 | B/W | 4.2" upgrade path |
| **SSD1677** | 7.5" 880×528 | 880×528 | B/W/R | Higher-res Solomon part |
## The UltraChip family (mid + large mono, multi-colour)
Used by GoodDisplay / Waveshare 4.2" 7.5" panels.
| Controller | Typical panel | RAM (px) | Colours | Notes |
|---|---|---|---|---|
| **UC8175** | 1.02" 80×128 | 80×128 | B/W | Small, hobbyist |
| **UC8176** | 4.2" 400×300 | 400×300 | B/W | Predates SSD1683 |
| **UC8179** (= GD7965) | 7.5" 800×480 | 800×480 | B/W or B/W/R | "DESPI-C02" PCB |
| **UC8159c** (= IL0371) | 5.65" 600×448 | 600×448 | **7-colour ACeP** | 4 px / byte (3-bit indices) |
## Spectra 6 (E Ink, used in Seeed 13.3" 1200×1600)
The **E Ink Spectra 6 13.3"** panel uses E Ink's own controller (datasheet
under NDA — community-reverse-engineered command set is in the GxEPD2
`epd13in3E` driver). Six colours: black, white, yellow, red, green, blue.
Encoded as **3 bits/pixel packed 2 px/byte**.
Key commands (subset, from GxEPD2 `epd13in3E.cpp`):
| Hex | Mnemonic | Notes |
|---|---|---|
| 0x00 | PSR (panel setting) | Resolution + colour-mode |
| 0x04 | POWER ON | Followed by BUSY high until panel boot |
| 0x10 | DTM1 | Image data plane |
| 0x12 | DRF | Display refresh — triggers ~12 s update |
| 0x07 | DEEP SLEEP | data byte 0xA5 |
## IT8951 (Carta 6"13.3" greyscale)
Used by Seeed EE03 + Waveshare 6"/7.8"/9.7"/10.3" Carta panels. **Not
SPI-raw**; it's a packet-based command stream over SPI with a "SYS_RUN"
boot handshake. Out of scope for Phase 1.
## Common command sequence (SSD1681 example)
The host's typical flow after power-on:
```
HW reset (RST low > 200 µs, high)
poll BUSY low
0x12 SWRST ── soft reset
poll BUSY low
0x01 OUTPUT_CTRL data: 0xC7 0x00 0x00 (display height-1)
0x11 DATA_ENTRY_MODE data: 0x03 (X+ Y+, addr X then Y)
0x44 SET_RAMX_RANGE data: 0x00 0x18 (start col, end col)
0x45 SET_RAMY_RANGE data: 0x00 0x00 0xC7 0x00
0x3C BORDER_WAVEFORM data: 0x05
0x21 DISPLAY_UPDATE_CTRL_1 data: 0x00 0x80 (BW + bypass red)
0x18 TEMPSENSOR_SELECT data: 0x80
0x4E SET_RAMX_COUNTER data: 0x00
0x4F SET_RAMY_COUNTER data: 0x00 0x00
poll BUSY low
── frame loop ──
0x24 WRITE_BLACK_VRAM data: <W*H/8 bytes of pixel data>
0x22 SET_DISP_UPDATE_CTRL_2 data: 0xF7 (full update)
0x20 ACTIVE_DISP_UPDATE_SEQ (no data)
poll BUSY high → low (~1s)
0x10 SLEEP_CTRL data: 0x01 (deep sleep)
```
## Sources
- SSD1681 datasheet (Adafruit mirror): <https://cdn-learn.adafruit.com/assets/assets/000/099/573/original/SSD1681.pdf>
- SSD1681 datasheet (BuyDisplay mirror): <https://www.buydisplay.com/download/ic/SSD1681.pdf>
- SSD1677 / 1680 / etc. archive: <https://cursedhardware.github.io/epd-driver-ic/>
- ESP-BSP SSD1681 command header: <https://github.com/espressif/esp-bsp/blob/master/components/lcd/esp_lcd_ssd1681/esp_lcd_ssd1681_commands.h>
- Adafruit_EPD (SSD1675 driver): <https://github.com/adafruit/Adafruit_EPD/blob/master/src/drivers/Adafruit_SSD1675.h>
- libdriver SSD1681: <https://github.com/libdriver/ssd1681>