72 lines
2.8 KiB
Markdown
72 lines
2.8 KiB
Markdown
# EPD Implementation Reference — GDEY075T7 (UC8179)
|
||
|
||
This document describes the current working state of the UC8179 E-Paper driver as implemented in `components/EPD/epd.cpp`.
|
||
|
||
## Panel Info
|
||
|
||
- **Controller:** UC8179 (Good Display)
|
||
- **Panel:** GDEY075T7 (7.5" B/W, 800×480)
|
||
- **Platform:** ESP-IDF (Native SPI2 Host)
|
||
- **Status:** **Fully Operational** (B/W and 4-Level Grayscale)
|
||
|
||
## Hardware Interface
|
||
|
||
### BUSY Pin Polarity
|
||
- **Logic:** LOW = Busy, HIGH = Idle
|
||
- **Wait loop:** `while (gpio_get_level(BUSY) == 0) { vTaskDelay(5); }`
|
||
|
||
### SPI Configuration
|
||
- **Host:** `SPI2_HOST`
|
||
- **Clock:** `SPI_FREQUENCY` (2MHz typically for EPD)
|
||
- **Mode:** SPI Mode 0
|
||
- **Transfer Size:** Chunked into 4096-byte buffers to avoid DMA limits and task watchdogs.
|
||
|
||
## Key Implementation Details
|
||
|
||
### Data Polarity & VCOM (0x50)
|
||
We use `0x29` for VCOM and Data Interval:
|
||
- **VBD:** `00` (Floating/Black border?)
|
||
- **N2OCP:** `1` (Auto-copy NEW data to OLD data after refresh)
|
||
- **DDX:** `01` (Data Polarity: 0=Black, 1=White)
|
||
- **Note:** In our 4-gray unpacking, we send `~output_byte`, effectively inverting the logic to match the panel's expectation for the LUTs used by the UC8179.
|
||
|
||
### Refresh Management
|
||
The driver tracks refresh history to prevent ghosting or panel damage:
|
||
- **Full Refresh:** Required every 5 fast refreshes or after 24 hours.
|
||
- **Fast Refresh (B/W):** Optimized waveforms via `0xE5` -> `0x5A`.
|
||
- **4-Gray Refresh:** Optimized waveforms via `0xE5` -> `0x5F`.
|
||
|
||
## Grayscale Mapping (4-Level)
|
||
|
||
The input is a packed 2bpp bitmap (4 pixels per byte). We unpack this into two sequential data layers: **Old (0x10)** and **New (0x13)**.
|
||
|
||
| Gray Level | Input Bits (2bpp) | Old Layer (0x10) | New Layer (0x13) | Final Value (Inverted) |
|
||
| :--- | :--- | :--- | :--- | :--- |
|
||
| **White** | `11` | 1 | 1 | `00` (Low) |
|
||
| **Gray 1** | `10` | 0 | 1 | `10` |
|
||
| **Gray 2** | `01` | 1 | 0 | `01` |
|
||
| **Black** | `00` | 0 | 0 | `11` (High) |
|
||
|
||
*Note: The hardware logic for 4-gray on UC8179 drives the pixels based on the difference between the Old and New layers over multiple sub-frames.*
|
||
|
||
## Driver State Machine
|
||
|
||
### Initialization (Full)
|
||
1. **Hardware Reset:** RST Low (10ms), RST High (10ms).
|
||
2. **Power Setting (0x01):** `0x07, 0x07, 0x3f, 0x3f`.
|
||
3. **Booster Soft Start (0x06):** `0x17, 0x17, 0x28, 0x17`.
|
||
4. **Power On (0x04):** Wait 100ms + Busy Idle.
|
||
5. **Panel Setting (0x00):** `0x1F` (800x480, KW Mode).
|
||
6. **Resolution (0x61):** `800×480`.
|
||
7. **VCOM (0x50):** `0x29, 0x07`.
|
||
|
||
### Fast Mode Adjustments
|
||
- **Booster (0x06):** `0x27, 0x27, 0x18, 0x17` (Stronger drive for fast transitions).
|
||
- **Fast Mode Enable (0xE0):** `0x02`.
|
||
- **Timing (0xE5):** `0x5A` (B/W) or `0x5F` (4-Gray).
|
||
|
||
### Sleep Sequence
|
||
1. **VCOM pre-sleep (0x50):** `0xF7`.
|
||
2. **Power Off (0x02):** Wait for Busy Idle.
|
||
3. **Deep Sleep (0x07):** `0xA5` (Check code).
|