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+
1858enum {
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
96119private:
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