How to reduce time between area flushes?


I’m developing a device based on ESP32, using an AMOLED display 454 x 454 x RGB 16bit. As the display has a MIPI interface, I’m using an SSD2805 chip to convert parallel data to MIPI signals. A bunch of wires, but all is working fine. I’m using two call backs: a rounder callback to correct addresses sent to the display, and a flush callback:

static void my_disp_flush(struct _disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
  SSD2805_dispFlush(area->x1, area->y1, area->x2, area->y2, (const uint16_t*)color_p);
  lv_disp_flush_ready(disp_drv);         /* Indicate you are ready with the flushing*/

Double buffering is used, trying sizes between 40 and 80 lines. I have a full screen refresh taking almost 300 ms, that’s quite a lot, especially after checking execution times.

With buffers of 40 lines, each call to my_disp_flush() takes 4.4 ms, with 19.2 ms between each call (12 in total).
With buffers of 80 lines, each call to my_disp_flush() takes 8 ms, with 34 ms between each call (6 in total).
Total time doesn’t improve much, and time between each call to my_disp_flush() is almost doubled when doubling the buffers size. Run time of the function is almost doubled when doubling the buffer size, as expected.

What MCU/Processor/Board and compiler are you using?

ESP32 NodeMCU / SSD2805 MIPI converted / MIPI AMOLED display
PlatformIO 5.1.1
SSD2805 / I2S libraries as in TechToys blog

What LVGL version are you using?


What do you want to achieve?

I’d like to reduce the time between each call to the flush callback function to have a faster refresh rate. Is that possible? Where is the delay coming from?

What have you tried so far?

Investigating lv_refr.c module trying to find where the long delay might come from, with no luck… Thank you for any suggestion!

Code to reproduce

See above my flush callback function.

Screenshot and/or video