AGlass0fMilk / mbed-lvgl

mbed-os port of LittleVGL
Other
16 stars 7 forks source link

Add support for "tearing effect" synchronization signal in ST7789 driver #4

Open AGlass0fMilk opened 5 years ago

AGlass0fMilk commented 5 years ago

Need to add support for the "tearing effect" signal synchronization to avoid writing display memory while it's being read. This can cause the display to "slide" transition between frames if the write speed is slow.

geoffrey-vl commented 4 years ago

I've noticed that the ST7789 within uDisplay has following functions:

void set_tearing_effect_scanline(uint16_t row);
void tearing_effect_off(void);
void tearing_effect_on(uint8_t mode);

Does it mean it is supported?

AGlass0fMilk commented 4 years ago

I've noticed that the ST7789 within uDisplay has following functions:

void set_tearing_effect_scanline(uint16_t row);
void tearing_effect_off(void);
void tearing_effect_on(uint8_t mode);

Does it mean it is supported?

The driver should support it. You'd have to do something like block the mbed-lvgl draw function until the tearing effect signal goes active.

I tried using the TE signal to eliminate the tearing effect on a 240px X 240px display I was using with the nRF52840. Unfortunately I found the SPI transfers were still too slow to have any success.

The ST7789 only supports up to about 15MHz maximum clock speed. The nRF52840 display SPI instance only supports 8MHz, then 16MHz. When I tried to use the 16MHz setting there were corrupt pixels shown on the display so I just accepted the unavoidable tearing effect.

The transfers are fast enough that you can update small parts of the display at a time without really noticing. This could be ensured using the TE signal. From my experience, it does not seem possible to do seamless animation (at least 20-24fps) through SPI with a high resolution display and the nRF52840. Maybe it's possible to reduce the display's color bit-depth.

I have since stopped working on that project though.

RayzzzzzZ commented 2 years ago

I've noticed that the ST7789 within uDisplay has following functions:

void set_tearing_effect_scanline(uint16_t row);
void tearing_effect_off(void);
void tearing_effect_on(uint8_t mode);

Does it mean it is supported?

The driver should support it. You'd have to do something like block the mbed-lvgl draw function until the tearing effect signal goes active.

I tried using the TE signal to eliminate the tearing effect on a 240px X 240px display I was using with the nRF52840. Unfortunately I found the SPI transfers were still too slow to have any success.

The ST7789 only supports up to about 15MHz maximum clock speed. The nRF52840 display SPI instance only supports 8MHz, then 16MHz. When I tried to use the 16MHz setting there were corrupt pixels shown on the display so I just accepted the unavoidable tearing effect.

The transfers are fast enough that you can update small parts of the display at a time without really noticing. This could be ensured using the TE signal. From my experience, it does not seem possible to do seamless animation (at least 20-24fps) through SPI with a high resolution display and the nRF52840. Maybe it's possible to reduce the display's color bit-depth.

I have since stopped working on that project though.

52840 spi have 32M. ST7789 support more faster than 16M It can solve the slide in simple view.