Add epd7in3e display driver component
Ports Waveshare's official EPD_7in3e.c register/refresh sequence (the panel has no public datasheet, so their reference driver is the source of truth) to an ESP-IDF component using spi_master + gpio instead of the bcm2835/RPi hardware abstraction the reference targets. Unlike the reference driver, which toggles CS around every single byte, this holds CS low for each logical command/data phase and DMAs pixel data in 4KB chunks -- sending ~192,000 individual one-byte SPI transactions would make a full refresh impractically slow. Exposes a streaming API (epd_display_stream, pulling chunks from a caller-supplied read_fn) so the eventual HTTP fetch path can feed the panel without holding a full ~192KB frame in RAM, plus an in-memory convenience wrapper (epd_display_buffer) for cases like the upcoming QR code screen where buffering the whole frame is fine. Wired into wifi_provisioning_start() as an init + white-clear for now, to prove the driver builds/links/runs at the right point in the boot sequence ahead of the actual QR code content.
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include "esp_err.h"
|
||||
|
||||
/* Waveshare 7.3" E Ink Spectra 6 (E6) panel: 800x480, 4 bits/pixel packed
|
||||
* 2-pixels-per-byte, per the official EPD_7in3e.c reference driver. */
|
||||
#define EPD_WIDTH 800
|
||||
#define EPD_HEIGHT 480
|
||||
#define EPD_BYTES_PER_ROW ((EPD_WIDTH + 1) / 2)
|
||||
#define EPD_FRAME_BYTES (EPD_BYTES_PER_ROW * EPD_HEIGHT)
|
||||
|
||||
typedef enum {
|
||||
EPD_COLOR_BLACK = 0x0,
|
||||
EPD_COLOR_WHITE = 0x1,
|
||||
EPD_COLOR_YELLOW = 0x2,
|
||||
EPD_COLOR_RED = 0x3,
|
||||
EPD_COLOR_BLUE = 0x5,
|
||||
EPD_COLOR_GREEN = 0x6,
|
||||
} epd_color_t;
|
||||
|
||||
/** Configures SPI + GPIO and runs the panel's power-on register init sequence. */
|
||||
esp_err_t epd_init(void);
|
||||
|
||||
/** Fills the whole panel with a single color and refreshes. */
|
||||
esp_err_t epd_clear(epd_color_t color);
|
||||
|
||||
/**
|
||||
* Called repeatedly by epd_display_stream() to fill up to chunk_size bytes
|
||||
* into chunk. Must return the number of bytes written, or 0 once exhausted.
|
||||
*/
|
||||
typedef size_t (*epd_read_fn_t)(uint8_t *chunk, size_t chunk_size, void *ctx);
|
||||
|
||||
/**
|
||||
* Streams a full frame (EPD_FRAME_BYTES bytes, packed 2 pixels/byte) to the
|
||||
* panel via read_fn and refreshes. Pulling from a caller-supplied source
|
||||
* instead of a single buffer lets callers feed the panel directly from an
|
||||
* HTTP response without holding the whole ~192KB frame in RAM.
|
||||
*/
|
||||
esp_err_t epd_display_stream(epd_read_fn_t read_fn, void *ctx);
|
||||
|
||||
/** Convenience wrapper around epd_display_stream() for an in-memory frame buffer. */
|
||||
esp_err_t epd_display_buffer(const uint8_t *frame, size_t len);
|
||||
|
||||
/** Puts the panel into deep sleep to minimize power draw between refreshes. */
|
||||
esp_err_t epd_sleep(void);
|
||||
Reference in New Issue
Block a user