Skip to content

Commit c0f1be5

Browse files
authored
UDisplay Modular Refactoring, adding DSI for P4 (#24107)
1 parent e7bc18c commit c0f1be5

33 files changed

+4239
-2530
lines changed

lib/lib_display/UDisplay/uDisplay.cpp

Lines changed: 598 additions & 628 deletions
Large diffs are not rendered by default.

lib/lib_display/UDisplay/uDisplay.h

Lines changed: 88 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,54 @@
77
#include <SPI.h>
88

99
#ifdef ESP32
10+
#if __has_include("soc/soc_caps.h")
11+
# include "soc/soc_caps.h"
12+
#else
13+
# error "No ESP capability header found"
14+
#endif
15+
#if (SOC_LCDCAM_I80_NUM_BUSES && !SOC_PARLIO_GROUPS)
16+
#define UDISPLAY_I80
17+
#include "uDisplay_I80_panel.h"
18+
#endif
19+
20+
#if defined(SOC_LCD_RGB_SUPPORTED)
21+
#include "uDisplay_RGB_panel.h"
22+
#endif
23+
#if SOC_MIPI_DSI_SUPPORTED
24+
#include "uDisplay_DSI_panel.h"
25+
#endif
26+
1027
#ifdef CONFIG_IDF_TARGET_ESP32S3
1128
#define USE_ESP32_S3
1229
#endif
1330
#include "soc/gpio_periph.h"
1431
#include <rom/gpio.h>
15-
#include "driver/spi_master.h"
32+
// #include "driver/spi_master.h"
1633
#endif
1734

35+
#include "uDisplay_SPI_controller.h"
36+
#include "uDisplay_I2C_panel.h"
37+
#include "uDisplay_EPD_panel.h"
38+
#include "uDisplay_SPI_panel.h"
39+
40+
// ===== Panel Config Union =====
41+
// Union to hold any panel configuration type
42+
// Only one config is active at a time based on interface type
43+
union PanelConfigUnion {
44+
SPIPanelConfig spi;
45+
I2CPanelConfig i2c;
46+
EPDPanelConfig epd;
47+
#ifdef UDISPLAY_I80
48+
I80PanelConfig i80;
49+
#endif
50+
#if SOC_LCD_RGB_SUPPORTED
51+
esp_lcd_rgb_panel_config_t rgb; // ESP-IDF native config
52+
#endif
53+
#if SOC_MIPI_DSI_SUPPORTED
54+
DSIPanelConfig dsi;
55+
#endif
56+
};
57+
1858
enum {
1959
UT_RD,UT_RDM,UT_CP,UT_RTF,UT_MV,UT_MVB,UT_RT,UT_RTT,UT_RDW,UT_RDWM,UT_WR,UT_WRW,UT_CPR,UT_AND,UT_SCALE,UT_LIM,UT_DBG,UT_GSRT,UT_XPT,UT_CPM,UT_END
2060
};
@@ -24,37 +64,20 @@ enum {
2464
#define UDSP_READ_STATUS 0xf2
2565

2666

27-
#define SIMPLERS_XP par_dbl[1]
28-
#define SIMPLERS_XM par_cs
29-
#define SIMPLERS_YP par_rs
30-
#define SIMPLERS_YM par_dbl[0]
31-
32-
#ifdef USE_ESP32_S3
33-
#include <esp_lcd_panel_io.h>
34-
#include "esp_private/gdma.h"
35-
#include <hal/gpio_ll.h>
36-
#include <hal/lcd_hal.h>
37-
#include <soc/lcd_cam_reg.h>
38-
#include <soc/lcd_cam_struct.h>
39-
#include "esp_lcd_panel_interface.h"
40-
#include "esp_lcd_panel_rgb.h"
41-
#include "esp_pm.h"
42-
#include "esp_lcd_panel_ops.h"
43-
#include <hal/dma_types.h>
44-
#include <rom/cache.h>
45-
#include "esp_rom_lldesc.h"
46-
#endif // USE_ESP32_S3
67+
// Simple resistive touch pin mapping (I80 only):
68+
// XP = data_pins_low[1], XM = cs_pin, YP = dc_pin, YM = data_pins_low[0]
4769

4870
#define _UDSP_I2C 1
4971
#define _UDSP_SPI 2
5072
#define _UDSP_PAR8 3
5173
#define _UDSP_PAR16 4
5274
#define _UDSP_RGB 5
75+
#define _UDSP_DSI 6
5376

5477
#define UDISP1_WHITE 1
5578
#define UDISP1_BLACK 0
5679

57-
#define MAX_LUTS 5
80+
// #define MAX_LUTS 5
5881

5982
#define DISPLAY_INIT_MODE 0
6083
#define DISPLAY_INIT_PARTIAL 1
@@ -95,14 +118,25 @@ class uDisplay : public Renderer {
95118

96119
private:
97120
uint8_t *frame_buffer;
98-
uint8_t *lut_full;
99-
uint8_t *lut_partial;
100-
uint8_t *lut_array[MAX_LUTS];
121+
// uint8_t *lut_full; // MOVED to EPDPanelConfig.lut_full_data
122+
// uint8_t *lut_partial; // MOVED to EPDPanelConfig.lut_partial_data
123+
// uint8_t *lut_array[MAX_LUTS]; // MOVED to EPDPanelConfig.lut_array_data
124+
#if SOC_MIPI_DSI_SUPPORTED
125+
uint8_t dsp_cmds[1024]; // for DSI, does not hurt for ESP32
126+
#else
101127
uint8_t dsp_cmds[256];
128+
#endif
102129
char dname[16];
103-
SPIClass *uspi;
130+
131+
SPIController *spiController;
104132
TwoWire *wire;
105-
SPISettings spiSettings;
133+
UniversalPanel* universal_panel = nullptr;
134+
135+
// ===== Panel Configuration Union =====
136+
// Heap-allocated union holding the active panel config
137+
// Allocated after parsing :H line, populated during INI parsing
138+
PanelConfigUnion* panel_config = nullptr;
139+
106140

107141
uint16_t x_addr_offs[4];
108142
uint16_t y_addr_offs[4];
@@ -117,8 +151,8 @@ class uDisplay : public Renderer {
117151
uint16_t seta_xp2;
118152
uint16_t seta_yp1;
119153
uint16_t seta_yp2;
120-
uint16_t lutptime;
121-
uint16_t lut3time;
154+
// uint16_t lutptime; // MOVED to EPDPanelConfig.lut_partial_time
155+
// uint16_t lut3time; // MOVED to EPDPanelConfig.update_time
122156
uint16_t lut_num;
123157

124158
uint8_t bpp;
@@ -129,14 +163,14 @@ class uDisplay : public Renderer {
129163
uint8_t i2c_col_end;
130164
uint8_t i2c_page_start;
131165
uint8_t i2c_page_end;
132-
uint8_t dsp_ncmds;
166+
uint16_t dsp_ncmds;
133167
uint8_t dsp_on;
134168
uint8_t dsp_off;
135169
uint8_t allcmd_mode;
136170
uint8_t splash_size;
137171
uint8_t dimmer8;
138172
uint8_t spi_speed;
139-
uint8_t spi_nr;
173+
// uint8_t spi_nr;
140174
uint8_t rot[4];
141175
uint8_t rot_t[4];
142176
uint8_t madctrl;
@@ -150,19 +184,19 @@ class uDisplay : public Renderer {
150184
uint8_t inv_off;
151185
uint8_t sa_mode;
152186
uint8_t dim_op;
153-
uint8_t lutfsize;
154-
uint8_t lutpsize;
155-
uint8_t lut_siz_full;
156-
uint8_t lut_siz_partial;
157-
uint8_t epcoffs_full;
158-
uint8_t epc_full_cnt;
159-
uint8_t epcoffs_part;
160-
uint8_t epc_part_cnt;
161-
uint8_t lut_cnt[MAX_LUTS];
162-
uint8_t lut_cmd[MAX_LUTS];
163-
uint8_t lut_siz[MAX_LUTS];
187+
// uint8_t lutfsize; // MOVED to EPDPanelConfig.lutfsize
188+
// uint8_t lutpsize; // MOVED to EPDPanelConfig.lutpsize
189+
// uint8_t lut_siz_full; // Local variable only
190+
// uint8_t lut_siz_partial; // Local variable only
191+
// uint8_t epcoffs_full; // MOVED to EPDPanelConfig.epcoffs_full
192+
// uint8_t epc_full_cnt; // MOVED to EPDPanelConfig.epc_full_cnt
193+
// uint8_t epcoffs_part; // MOVED to EPDPanelConfig.epcoffs_part
194+
// uint8_t epc_part_cnt; // MOVED to EPDPanelConfig.epc_part_cnt
195+
// uint8_t lut_cnt[MAX_LUTS]; // MOVED to EPDPanelConfig.lut_cnt_data
196+
// uint8_t lut_cmd[MAX_LUTS]; // MOVED to EPDPanelConfig.lut_cmd
197+
// uint8_t lut_siz[MAX_LUTS]; // MOVED to EPDPanelConfig.lut_siz
164198
uint8_t ep_mode;
165-
uint8_t ep_update_mode;
199+
// uint8_t ep_update_mode; // MOVED to EPDPanel.update_mode
166200
uint8_t sspi;
167201

168202
int8_t spec_init;
@@ -172,64 +206,29 @@ class uDisplay : public Renderer {
172206
int8_t reset;
173207
int8_t splash_font;
174208
int8_t bpmode;
175-
int8_t spi_cs;
176-
int8_t spi_clk;
177-
int8_t spi_mosi;
178-
int8_t spi_dc;
209+
// int8_t spi_cs;
210+
// int8_t spi_clk;
211+
// int8_t spi_mosi;
212+
// int8_t spi_dc;
179213
int8_t bpanel;
180-
int8_t spi_miso;
181-
int8_t busy_pin;
214+
// int8_t spi_miso;
215+
// int8_t busy_pin; // MOVED to EPDPanelConfig.busy_pin (EPD-only)
182216

183-
int16_t lutftime;
217+
// int16_t lutftime; // MOVED to EPDPanelConfig.lut_full_time
184218
int16_t rotmap_xmin;
185219
int16_t rotmap_xmax;
186220
int16_t rotmap_ymin;
187221
int16_t rotmap_ymax;
188222

189-
void beginTransaction(SPISettings s);
190-
void endTransaction(void);
191223
void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
192224
void drawPixel(int16_t x, int16_t y, uint16_t color);
193225
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
194226
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
195227
uint32_t str2c(char **sp, char *vp, uint32_t len);
228+
196229
void i2c_command(uint8_t val);
197-
void ulcd_command_one(uint8_t val);
198-
void ulcd_command(uint8_t val);
199-
void ulcd_data8(uint8_t val);
200-
void ulcd_data16(uint16_t val);
201-
void ulcd_data32(uint32_t val);
202-
void write8(uint8_t val);
203-
void write8_slow(uint8_t val);
204-
void write9(uint8_t val, uint8_t dc);
205-
void write9_slow(uint8_t val, uint8_t dc);
206-
void hw_write9(uint8_t val, uint8_t dc);
207-
void write16(uint16_t val);
208-
void write32(uint32_t val);
209-
void spi_data9(uint8_t d, uint8_t dc);
210-
uint8_t readData(void);
211-
uint8_t readStatus(void);
212-
uint8_t writeReg16(uint8_t reg, uint16_t wval);
213-
void WriteColor(uint16_t color);
214-
void SetLut(const unsigned char* lut);
215-
void SetLuts(void);
216-
void DisplayFrame_29(void);
217-
void Updateframe_EPD();
218-
void SetFrameMemory(const unsigned char* image_buffer);
219-
void SetFrameMemory(const unsigned char* image_buffer, uint16_t x, uint16_t y, uint16_t image_width, uint16_t image_height);
220-
void SetMemoryArea(int x_start, int y_start, int x_end, int y_end);
221-
void SetMemoryPointer(int x, int y);
222-
void DrawAbsolutePixel(int x, int y, int16_t color);
223-
void drawPixel_EPD(int16_t x, int16_t y, uint16_t color);
224-
void fillRect_EPD(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
225-
void drawFastVLine_EPD(int16_t x, int16_t y, int16_t h, uint16_t color);
226-
void drawFastHLine_EPD(int16_t x, int16_t y, int16_t w, uint16_t color);
227-
void Init_EPD(int8_t p);
228-
void spi_command_EPD(uint8_t val);
229-
void spi_data8_EPD(uint8_t val);
230-
void ClearFrameMemory(unsigned char color);
231-
void ClearFrame_42(void);
232-
void DisplayFrame_42(void);
230+
231+
233232
uint8_t strlen_ln(char *str);
234233
int32_t next_val(char **sp);
235234
uint32_t next_hex(char **sp);
@@ -238,82 +237,11 @@ class uDisplay : public Renderer {
238237
void delay_sync(int32_t time);
239238
void reset_pin(int32_t delayl, int32_t delayh);
240239
void delay_arg(uint32_t arg);
241-
void Send_EP_Data(void);
240+
242241
void send_spi_cmds(uint16_t cmd_offset, uint16_t cmd_size);
243242
void send_spi_icmds(uint16_t cmd_size);
244243

245244

246-
#ifdef USE_ESP32_S3
247-
int8_t par_cs;
248-
int8_t par_rs;
249-
int8_t par_wr;
250-
int8_t par_rd;
251-
252-
int8_t par_dbl[8];
253-
int8_t par_dbh[8];
254-
255-
int8_t de;
256-
int8_t vsync;
257-
int8_t hsync;
258-
int8_t pclk;
259-
260-
uint16_t hsync_polarity;
261-
uint16_t hsync_front_porch;
262-
uint16_t hsync_pulse_width;
263-
uint16_t hsync_back_porch;
264-
uint16_t vsync_polarity;
265-
uint16_t vsync_front_porch;
266-
uint16_t vsync_pulse_width;
267-
uint16_t vsync_back_porch;
268-
uint16_t pclk_active_neg;
269-
270-
esp_lcd_panel_handle_t _panel_handle = NULL;
271-
272-
esp_lcd_i80_bus_handle_t _i80_bus = nullptr;
273-
gdma_channel_handle_t _dma_chan;
274-
lldesc_t *_dmadesc = nullptr;
275-
uint32_t _dmadesc_size = 0;
276-
uint32_t _clock_reg_value;
277-
void calcClockDiv(uint32_t* div_a, uint32_t* div_b, uint32_t* div_n, uint32_t* clkcnt, uint32_t baseClock, uint32_t targetFreq);
278-
void _alloc_dmadesc(size_t len);
279-
void _setup_dma_desc_links(const uint8_t *data, int32_t len);
280-
void pb_beginTransaction(void);
281-
void pb_endTransaction(void);
282-
void pb_wait(void);
283-
bool pb_busy(void);
284-
void _pb_init_pin(bool);
285-
bool pb_writeCommand(uint32_t data, uint_fast8_t bit_length);
286-
void pb_writeData(uint32_t data, uint_fast8_t bit_length);
287-
void pb_pushPixels(uint16_t* data, uint32_t length, bool swap_bytes, bool use_dma);
288-
void pb_writeBytes(const uint8_t* data, uint32_t length, bool use_dma);
289-
void _send_align_data(void);
290-
volatile lcd_cam_dev_t* _dev;
291-
uint32_t* _cache_flip;
292-
static constexpr size_t CACHE_SIZE = 256;
293-
uint32_t _cache[2][CACHE_SIZE / sizeof(uint32_t)];
294-
bool _has_align_data;
295-
uint8_t _align_data;
296-
void cs_control(bool level);
297-
uint32_t get_sr_touch(uint32_t xp, uint32_t xm, uint32_t yp, uint32_t ym);
298-
void drawPixel_RGB(int16_t x, int16_t y, uint16_t color);
299-
#endif
300-
301-
#ifdef ESP32
302-
// dma section
303-
bool DMA_Enabled = false;
304-
uint8_t spiBusyCheck = 0;
305-
spi_transaction_t trans;
306-
spi_device_handle_t dmaHAL;
307-
spi_host_device_t spi_host = VSPI_HOST;
308-
// spi_host_device_t spi_host = VSPI_HOST;
309-
bool initDMA(int32_t ctrl_cs);
310-
void deInitDMA(void);
311-
bool dmaBusy(void);
312-
void dmaWait(void);
313-
void pushPixelsDMA(uint16_t* image, uint32_t len);
314-
void pushPixels3DMA(uint8_t* image, uint32_t len);
315-
#endif // ESP32
316-
317245
#ifdef USE_UNIVERSAL_TOUCH
318246
// universal touch driver
319247
void ut_trans(char **sp, uint8_t **ut_code);

0 commit comments

Comments
 (0)