Skip to content

Commit e496f61

Browse files
committed
feat(bus & lcd): support MIPI-DSI LCD
1 parent fca144d commit e496f61

File tree

118 files changed

+1630
-566
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+1630
-566
lines changed

examples/LCD/3wireSPI_RGB/3wireSPI_RGB.ino

Lines changed: 79 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include <Arduino.h>
4444
#include <ESP_Panel_Library.h>
4545

46+
/* The following default configurations are for the board 'jingcai: ESP32_4848S040C_I_Y_3, ST7701' */
4647
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4748
//////////////////// Please update the following configuration according to your LCD spec //////////////////////////////
4849
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -64,7 +65,8 @@
6465
#define EXAMPLE_LCD_RGB_TIMING_VPW (10)
6566
#define EXAMPLE_LCD_RGB_TIMING_VBP (10)
6667
#define EXAMPLE_LCD_RGB_TIMING_VFP (10)
67-
#define EXAMPLE_LCD_USE_EXTERNAL_CMD (0)
68+
#define EXAMPLE_LCD_RGB_BOUNCE_BUFFER_SIZE (EXAMPLE_LCD_WIDTH * 10)
69+
#define EXAMPLE_LCD_USE_EXTERNAL_CMD (1)
6870
#if EXAMPLE_LCD_USE_EXTERNAL_CMD
6971
/**
7072
* LCD initialization commands.
@@ -86,10 +88,44 @@ const esp_lcd_panel_vendor_init_cmd_t lcd_init_cmd[] = {
8688
// {0xC1, (uint8_t []){0x0D, 0x02}, 2, 0},
8789
// {0x29, (uint8_t []){0x00}, 0, 120},
8890
// // or
89-
// ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xFF, {0x77, 0x01, 0x00, 0x00, 0x10}),
90-
// ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC0, {0x3B, 0x00}),
91-
// ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC1, {0x0D, 0x02}),
92-
// ESP_PANEL_LCD_CMD_WITH_NONE_PARAM(120, 0x29),
91+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xFF, {0x77, 0x01, 0x00, 0x00, 0x10}),
92+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC0, {0x3B, 0x00}),
93+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC1, {0x0D, 0x02}),
94+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC2, {0x31, 0x05}),
95+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xCD, {0x00}),
96+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB0, {0x00, 0x11, 0x18, 0x0E, 0x11, 0x06, 0x07, 0x08, 0x07, 0x22, 0x04, 0x12,
97+
0x0F, 0xAA, 0x31, 0x18}),
98+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB1, {0x00, 0x11, 0x19, 0x0E, 0x12, 0x07, 0x08, 0x08, 0x08, 0x22, 0x04, 0x11,
99+
0x11, 0xA9, 0x32, 0x18}),
100+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xFF, {0x77, 0x01, 0x00, 0x00, 0x11}),
101+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB0, {0x60}),
102+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB1, {0x32}),
103+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB2, {0x07}),
104+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB3, {0x80}),
105+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB5, {0x49}),
106+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB7, {0x85}),
107+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xB8, {0x21}),
108+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC1, {0x78}),
109+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xC2, {0x78}),
110+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE0, {0x00, 0x1B, 0x02}),
111+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE1, {0x08, 0xA0, 0x00, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x44, 0x44}),
112+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE2, {0x11, 0x11, 0x44, 0x44, 0xED, 0xA0, 0x00, 0x00, 0xEC, 0xA0, 0x00, 0x00}),
113+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE3, {0x00, 0x00, 0x11, 0x11}),
114+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE4, {0x44, 0x44}),
115+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE5, {0x0A, 0xE9, 0xD8, 0xA0, 0x0C, 0xEB, 0xD8, 0xA0, 0x0E, 0xED, 0xD8, 0xA0,
116+
0x10, 0xEF, 0xD8, 0xA0}),
117+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE6, {0x00, 0x00, 0x11, 0x11}),
118+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE7, {0x44, 0x44}),
119+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE8, {0x09, 0xE8, 0xD8, 0xA0, 0x0B, 0xEA, 0xD8, 0xA0, 0x0D, 0xEC, 0xD8, 0xA0,
120+
0x0F, 0xEE, 0xD8, 0xA0}),
121+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xEB, {0x02, 0x00, 0xE4, 0xE4, 0x88, 0x00, 0x40}),
122+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xEC, {0x3C, 0x00}),
123+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xED, {0xAB, 0x89, 0x76, 0x54, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20,
124+
0x45, 0x67, 0x98, 0xBA}),
125+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xFF, {0x77, 0x01, 0x00, 0x00, 0x13}),
126+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xE5, {0xE4}),
127+
ESP_PANEL_LCD_CMD_WITH_8BIT_PARAM(0, 0xFF, {0x77, 0x01, 0x00, 0x00, 0x00}),
128+
ESP_PANEL_LCD_CMD_WITH_NONE_PARAM(120, 0x11),
93129
};
94130
#endif
95131

@@ -169,43 +205,43 @@ void setup()
169205

170206
#if EXAMPLE_LCD_PIN_NUM_BK_LIGHT >= 0
171207
Serial.println("Initialize backlight and turn it off");
172-
ESP_PanelBacklight *backlight = new ESP_PanelBacklight(EXAMPLE_LCD_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL, true);
208+
ESP_PanelBacklight *backlight = new ESP_PanelBacklight(
209+
EXAMPLE_LCD_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL, true
210+
);
173211
backlight->begin();
174212
backlight->off();
175213
#endif
176214

177215
Serial.println("Create 3-wire SPI + RGB LCD bus");
178216
#if EXAMPLE_LCD_RGB_DATA_WIDTH == 8
179-
ESP_PanelBus_RGB *lcd_bus = new ESP_PanelBus_RGB(EXAMPLE_LCD_WIDTH, EXAMPLE_LCD_HEIGHT,
180-
EXAMPLE_LCD_PIN_NUM_SPI_CS, EXAMPLE_LCD_PIN_NUM_SPI_SCK,
181-
EXAMPLE_LCD_PIN_NUM_SPI_SDA,
182-
EXAMPLE_LCD_PIN_NUM_RGB_DATA0, EXAMPLE_LCD_PIN_NUM_RGB_DATA1,
183-
EXAMPLE_LCD_PIN_NUM_RGB_DATA2, EXAMPLE_LCD_PIN_NUM_RGB_DATA3,
184-
EXAMPLE_LCD_PIN_NUM_RGB_DATA4, EXAMPLE_LCD_PIN_NUM_RGB_DATA5,
185-
EXAMPLE_LCD_PIN_NUM_RGB_DATA6, EXAMPLE_LCD_PIN_NUM_RGB_DATA7,
186-
EXAMPLE_LCD_PIN_NUM_RGB_HSYNC, EXAMPLE_LCD_PIN_NUM_RGB_VSYNC,
187-
EXAMPLE_LCD_PIN_NUM_RGB_PCLK, EXAMPLE_LCD_PIN_NUM_RGB_DE,
188-
EXAMPLE_LCD_PIN_NUM_RGB_DISP);
217+
ESP_PanelBus_RGB *lcd_bus = new ESP_PanelBus_RGB(
218+
EXAMPLE_LCD_WIDTH, EXAMPLE_LCD_HEIGHT,
219+
EXAMPLE_LCD_PIN_NUM_SPI_CS, EXAMPLE_LCD_PIN_NUM_SPI_SCK, EXAMPLE_LCD_PIN_NUM_SPI_SDA,
220+
EXAMPLE_LCD_PIN_NUM_RGB_DATA0, EXAMPLE_LCD_PIN_NUM_RGB_DATA1, EXAMPLE_LCD_PIN_NUM_RGB_DATA2,
221+
EXAMPLE_LCD_PIN_NUM_RGB_DATA3, EXAMPLE_LCD_PIN_NUM_RGB_DATA4, EXAMPLE_LCD_PIN_NUM_RGB_DATA5,
222+
EXAMPLE_LCD_PIN_NUM_RGB_DATA6, EXAMPLE_LCD_PIN_NUM_RGB_DATA7, EXAMPLE_LCD_PIN_NUM_RGB_HSYNC,
223+
EXAMPLE_LCD_PIN_NUM_RGB_VSYNC, EXAMPLE_LCD_PIN_NUM_RGB_PCLK, EXAMPLE_LCD_PIN_NUM_RGB_DE,
224+
EXAMPLE_LCD_PIN_NUM_RGB_DISP
225+
);
189226
#elif EXAMPLE_LCD_RGB_DATA_WIDTH == 16
190-
ESP_PanelBus_RGB *lcd_bus = new ESP_PanelBus_RGB(EXAMPLE_LCD_WIDTH, EXAMPLE_LCD_HEIGHT,
191-
EXAMPLE_LCD_PIN_NUM_SPI_CS, EXAMPLE_LCD_PIN_NUM_SPI_SCK,
192-
EXAMPLE_LCD_PIN_NUM_SPI_SDA,
193-
EXAMPLE_LCD_PIN_NUM_RGB_DATA0, EXAMPLE_LCD_PIN_NUM_RGB_DATA1,
194-
EXAMPLE_LCD_PIN_NUM_RGB_DATA2, EXAMPLE_LCD_PIN_NUM_RGB_DATA3,
195-
EXAMPLE_LCD_PIN_NUM_RGB_DATA4, EXAMPLE_LCD_PIN_NUM_RGB_DATA5,
196-
EXAMPLE_LCD_PIN_NUM_RGB_DATA6, EXAMPLE_LCD_PIN_NUM_RGB_DATA7,
197-
EXAMPLE_LCD_PIN_NUM_RGB_DATA8, EXAMPLE_LCD_PIN_NUM_RGB_DATA9,
198-
EXAMPLE_LCD_PIN_NUM_RGB_DATA10, EXAMPLE_LCD_PIN_NUM_RGB_DATA11,
199-
EXAMPLE_LCD_PIN_NUM_RGB_DATA12, EXAMPLE_LCD_PIN_NUM_RGB_DATA13,
200-
EXAMPLE_LCD_PIN_NUM_RGB_DATA14, EXAMPLE_LCD_PIN_NUM_RGB_DATA15,
201-
EXAMPLE_LCD_PIN_NUM_RGB_HSYNC, EXAMPLE_LCD_PIN_NUM_RGB_VSYNC,
202-
EXAMPLE_LCD_PIN_NUM_RGB_PCLK, EXAMPLE_LCD_PIN_NUM_RGB_DE,
203-
EXAMPLE_LCD_PIN_NUM_RGB_DISP);
227+
ESP_PanelBus_RGB *lcd_bus = new ESP_PanelBus_RGB(
228+
EXAMPLE_LCD_WIDTH, EXAMPLE_LCD_HEIGHT,
229+
EXAMPLE_LCD_PIN_NUM_SPI_CS, EXAMPLE_LCD_PIN_NUM_SPI_SCK, EXAMPLE_LCD_PIN_NUM_SPI_SDA,
230+
EXAMPLE_LCD_PIN_NUM_RGB_DATA0, EXAMPLE_LCD_PIN_NUM_RGB_DATA1, EXAMPLE_LCD_PIN_NUM_RGB_DATA2,
231+
EXAMPLE_LCD_PIN_NUM_RGB_DATA3, EXAMPLE_LCD_PIN_NUM_RGB_DATA4, EXAMPLE_LCD_PIN_NUM_RGB_DATA5,
232+
EXAMPLE_LCD_PIN_NUM_RGB_DATA6, EXAMPLE_LCD_PIN_NUM_RGB_DATA7, EXAMPLE_LCD_PIN_NUM_RGB_DATA8,
233+
EXAMPLE_LCD_PIN_NUM_RGB_DATA9, EXAMPLE_LCD_PIN_NUM_RGB_DATA10, EXAMPLE_LCD_PIN_NUM_RGB_DATA11,
234+
EXAMPLE_LCD_PIN_NUM_RGB_DATA12, EXAMPLE_LCD_PIN_NUM_RGB_DATA13, EXAMPLE_LCD_PIN_NUM_RGB_DATA14,
235+
EXAMPLE_LCD_PIN_NUM_RGB_DATA15, EXAMPLE_LCD_PIN_NUM_RGB_HSYNC, EXAMPLE_LCD_PIN_NUM_RGB_VSYNC,
236+
EXAMPLE_LCD_PIN_NUM_RGB_PCLK, EXAMPLE_LCD_PIN_NUM_RGB_DE, EXAMPLE_LCD_PIN_NUM_RGB_DISP
237+
);
204238
#endif
205239
lcd_bus->configRgbTimingFreqHz(EXAMPLE_LCD_RGB_TIMING_FREQ_HZ);
206-
lcd_bus->configRgbTimingPorch(EXAMPLE_LCD_RGB_TIMING_HPW, EXAMPLE_LCD_RGB_TIMING_HBP, EXAMPLE_LCD_RGB_TIMING_HFP,
207-
EXAMPLE_LCD_RGB_TIMING_VPW, EXAMPLE_LCD_RGB_TIMING_VBP, EXAMPLE_LCD_RGB_TIMING_VFP);
208-
// lcd_bus->configRgbBounceBufferSize(EXAMPLE_LCD_WIDTH * 10); // Set bounce buffer to avoid screen drift
240+
lcd_bus->configRgbTimingPorch(
241+
EXAMPLE_LCD_RGB_TIMING_HPW, EXAMPLE_LCD_RGB_TIMING_HBP, EXAMPLE_LCD_RGB_TIMING_HFP,
242+
EXAMPLE_LCD_RGB_TIMING_VPW, EXAMPLE_LCD_RGB_TIMING_VBP, EXAMPLE_LCD_RGB_TIMING_VFP
243+
);
244+
lcd_bus->configRgbBounceBufferSize(EXAMPLE_LCD_RGB_BOUNCE_BUFFER_SIZE); // Set bounce buffer to avoid screen drift
209245
lcd_bus->begin();
210246

211247
Serial.println("Create LCD device");
@@ -214,23 +250,23 @@ void setup()
214250
// Configure external initialization commands, should called before `init()`
215251
lcd->configVendorCommands(lcd_init_cmd, sizeof(lcd_init_cmd)/sizeof(lcd_init_cmd[0]));
216252
#endif
217-
// lcd->configAutoReleaseBus(true); // If the "3-wire SPI" interface are sharing pins of the "RGB" interface to
218-
// save GPIOs, please enable this function to release the bus object and pins
219-
// (except CS signal). And then, the "3-wire SPI" interface cannot be used to
220-
// transmit commands any more.
221-
// lcd->configMirrorByCommand(true); // This function is conflict with `configAutoReleaseBus(true)`, please don't
222-
// enable them at the same time
253+
// lcd->configEnableIO_Multiplex(true); // If the "3-wire SPI" interface are sharing pins of the "RGB" interface to
254+
// save GPIOs, please enable this function to release the bus object and pins
255+
// (except CS signal). And then, the "3-wire SPI" interface cannot be used to
256+
// transmit commands any more.
257+
// lcd->configMirrorByCommand(true); // This function is conflict with `configAutoReleaseBus(true)`, please don't
258+
// enable them at the same time
223259
lcd->init();
224-
lcd->reset(); // If the `configAutoReleaseBus(true)` is called, here should not call `reset()`
225-
// to deinit the LCD device
260+
lcd->reset();
226261
lcd->begin();
227-
lcd->displayOn(); // This function is conflict with `configAutoReleaseBus(true)`, please don't
228-
// enable them at the same time
262+
lcd->displayOn();
229263
#if EXAMPLE_ENABLE_PRINT_LCD_FPS
264+
/* Attach a callback function which will be called when the Vsync signal is detected */
230265
lcd->attachRefreshFinishCallback(onVsyncEndCallback, nullptr);
231266
#endif
232267

233268
Serial.println("Draw color bar from top left to bottom right, the order is B - G - R");
269+
/* Users can refer to the implementation within `colorBardTest()` to draw patterns on the LCD */
234270
lcd->colorBarTest(EXAMPLE_LCD_WIDTH, EXAMPLE_LCD_HEIGHT);
235271

236272
#if EXAMPLE_LCD_PIN_NUM_BK_LIGHT >= 0

examples/LCD/QSPI/QSPI.ino

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,12 @@
5656
#include <Arduino.h>
5757
#include <ESP_Panel_Library.h>
5858

59+
/* The following default configurations are for the board 'Espressif: Custom, ST77922' */
5960
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6061
//////////////////// Please update the following configuration according to your LCD spec //////////////////////////////
6162
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6263
/**
63-
* Currently, the library supports the following SPI LCDs:
64+
* Currently, the library supports the following QSPI LCDs:
6465
* - GC9B71
6566
* - SH8601
6667
* - SPD2010
@@ -136,15 +137,18 @@ void setup()
136137

137138
#if EXAMPLE_LCD_PIN_NUM_BK_LIGHT >= 0
138139
Serial.println("Initialize backlight control pin and turn it off");
139-
ESP_PanelBacklight *backlight = new ESP_PanelBacklight(EXAMPLE_LCD_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL, true);
140+
ESP_PanelBacklight *backlight = new ESP_PanelBacklight(
141+
EXAMPLE_LCD_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL, true
142+
);
140143
backlight->begin();
141144
backlight->off();
142145
#endif
143146

144147
Serial.println("Create QSPI LCD bus");
145-
ESP_PanelBus_QSPI *panel_bus = new ESP_PanelBus_QSPI(EXAMPLE_LCD_PIN_NUM_SPI_CS, EXAMPLE_LCD_PIN_NUM_SPI_SCK,
146-
EXAMPLE_LCD_PIN_NUM_SPI_DATA0, EXAMPLE_LCD_PIN_NUM_SPI_DATA1,
147-
EXAMPLE_LCD_PIN_NUM_SPI_DATA2, EXAMPLE_LCD_PIN_NUM_SPI_DATA3);
148+
ESP_PanelBus_QSPI *panel_bus = new ESP_PanelBus_QSPI(
149+
EXAMPLE_LCD_PIN_NUM_SPI_CS, EXAMPLE_LCD_PIN_NUM_SPI_SCK, EXAMPLE_LCD_PIN_NUM_SPI_DATA0,
150+
EXAMPLE_LCD_PIN_NUM_SPI_DATA1, EXAMPLE_LCD_PIN_NUM_SPI_DATA2, EXAMPLE_LCD_PIN_NUM_SPI_DATA3
151+
);
148152
panel_bus->configQspiFreqHz(EXAMPLE_LCD_SPI_FREQ_HZ);
149153
panel_bus->begin();
150154

@@ -159,10 +163,12 @@ void setup()
159163
lcd->begin();
160164
lcd->displayOn();
161165
#if EXAMPLE_ENABLE_ATTACH_CALLBACK
162-
lcd->attachRefreshFinishCallback(onDrawBitmapFinishCallback, NULL);
166+
/* Attach a callback function which will be called when every bitmap drawing is completed */
167+
lcd->attachDrawBitmapFinishCallback(onDrawBitmapFinishCallback, NULL);
163168
#endif
164169

165170
Serial.println("Draw color bar from top left to bottom right, the order is B - G - R");
171+
/* Users can refer to the implementation within `colorBardTest()` to draw patterns on the LCD */
166172
lcd->colorBarTest(EXAMPLE_LCD_WIDTH, EXAMPLE_LCD_HEIGHT);
167173

168174
#if EXAMPLE_LCD_PIN_NUM_BK_LIGHT >= 0

0 commit comments

Comments
 (0)