Skip to content

Commit c325482

Browse files
fix screen tearing issue when switch between frames
1 parent f64f392 commit c325482

File tree

3 files changed

+17
-22
lines changed

3 files changed

+17
-22
lines changed

libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp

+4-12
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,13 @@ int Arduino_H7_Video::begin() {
5656

5757
textFont(Font_5x7);
5858

59-
/* Video controller/bridge init */
60-
_shield->init(_edidMode);
61-
6259
/* Configure SDRAM */
6360
SDRAM.begin();
6461

65-
dsi_lcdClear(0);
62+
/* Video controller/bridge init */
63+
_shield->init(_edidMode);
6664

6765
#if __has_include("lvgl.h")
68-
dsi_getNextFrameBuffer();
69-
7066
/* Initiliaze LVGL library */
7167
lv_init();
7268

@@ -107,17 +103,13 @@ void Arduino_H7_Video::end() {
107103
void Arduino_H7_Video::beginDraw() {
108104
ArduinoGraphics::beginDraw();
109105

110-
#if __has_include("lvgl.h")
111-
dsi_getNextFrameBuffer();
112-
#endif
113-
114106
dsi_lcdClear(0);
115107
}
116108

117109
void Arduino_H7_Video::endDraw() {
118110
ArduinoGraphics::endDraw();
119111

120-
dsi_getNextFrameBuffer();
112+
dsi_drawCurrentFrameBuffer();
121113
}
122114

123115
void Arduino_H7_Video::clear(){
@@ -165,7 +157,7 @@ void lvgl_displayFlushing(lv_disp_drv_t * disp, const lv_area_t * area, lv_color
165157
uint32_t height = lv_area_get_height(area);
166158
uint32_t offsetPos = (area->x1 + (dsi_getDisplayXSize() * area->y1)) * sizeof(uint16_t);
167159

168-
dsi_lcdDrawImage((void *) color_p, (void *)(dsi_getCurrentFrameBuffer() + offsetPos), width, height, DMA2D_INPUT_RGB565);
160+
dsi_lcdDrawImage((void *) color_p, (void *)(dsi_getActiveFrameBuffer() + offsetPos), width, height, DMA2D_INPUT_RGB565);
169161
lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/
170162
}
171163

libraries/Arduino_H7_Video/src/dsi.cpp

+11-9
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,9 @@ int dsi_init(uint8_t bus, struct edid *edid, struct display_timing *dt) {
247247
HAL_DSI_PatternGeneratorStop(&dsi);
248248

249249
dsi_lcdClear(0);
250-
dsi_getNextFrameBuffer();
250+
dsi_drawCurrentFrameBuffer();
251251
dsi_lcdClear(0);
252-
dsi_getNextFrameBuffer();
252+
dsi_drawCurrentFrameBuffer();
253253
}
254254

255255
void dsi_lcdClear(uint32_t Color) {
@@ -319,18 +319,20 @@ uint32_t dsi_getFramebufferEnd(void) {
319319
return (FB_BASE_ADDRESS + 2 * (lcd_x_size * lcd_y_size * BYTES_PER_PIXEL));
320320
}
321321

322-
uint32_t dsi_getNextFrameBuffer(void) {
322+
void dsi_drawCurrentFrameBuffer(void) {
323323
int fb = pend_buffer++ % 2;
324-
324+
325325
__HAL_LTDC_LAYER_ENABLE(&(ltdc), fb);
326-
__HAL_LTDC_LAYER_DISABLE(&(ltdc), !fb);
327-
__HAL_LTDC_VERTICAL_BLANKING_RELOAD_CONFIG(&(ltdc));
328-
329-
return fb ? FB_ADDRESS_0 : FB_ADDRESS_1;
326+
__HAL_LTDC_LAYER_DISABLE(&(ltdc), !fb);
327+
__HAL_LTDC_VERTICAL_BLANKING_RELOAD_CONFIG(&(ltdc));
330328
}
331329

332330
uint32_t dsi_getCurrentFrameBuffer() {
333-
return pend_buffer ? FB_ADDRESS_0 : FB_ADDRESS_1;
331+
return (ltdc.LayerCfg[pend_buffer%2].FBStartAdress);
332+
}
333+
334+
uint32_t dsi_getActiveFrameBuffer() {
335+
return (ltdc.LayerCfg[(pend_buffer+1)%2].FBStartAdress);
334336
}
335337

336338
uint32_t dsi_getDisplayXSize(){

libraries/Arduino_H7_Video/src/dsi.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ void dsi_lcdClear(uint32_t color);
3636
void dsi_lcdDrawImage(void *pSrc, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t ColorMode);
3737
void dsi_lcdFillArea(void *pDst, uint32_t xSize, uint32_t ySize, uint32_t ColorMode);
3838
void dsi_configueCLUT(uint32_t* clut);
39-
uint32_t dsi_getNextFrameBuffer(void);
39+
void dsi_drawCurrentFrameBuffer(void);
4040
uint32_t dsi_getCurrentFrameBuffer(void);
41+
uint32_t dsi_getActiveFrameBuffer(void);
4142
uint32_t dsi_getFramebufferEnd(void);
4243
uint32_t dsi_getDisplayXSize(void);
4344
uint32_t dsi_getDisplayYSize(void);

0 commit comments

Comments
 (0)