Description
I would like to use RGB332 as LVGL’s native format in my application. My display is a RGB332 1024x600 RGB TTL display on a ESP32S3.
lv.conf has these options for LV_COLOR_DEPTH:
/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/
None of which seem to fit. I am setting up drawing using
lv_init();
lv_display_t * lv_display = lv_display_create(1024, 600);
lv_display_set_flush_cb(lv_display, lv_flush_cb);
lv_display_set_buffers(lv_display, lv_buf, NULL, H_RES*V_RES/10, LV_DISPLAY_RENDER_MODE_PARTIAL);
and then in my lv_flush_cb
:
void lv_flush_cb(lv_display_t * display, const lv_area_t * area, unsigned char * px_map)
{
uint8_t * buf = (uint8_t *)px_map;
int16_t x, y;
for(y = area->y1; y <= area->y2; y++) {
for(x = area->x1; x <= area->x2; x++) {
// bg is a framebuffer i maintain that is drawn to the ESP GDMA to the display
bg[y*1024 + x] = (*buf);
buf++;
}
}
// Inform LVGL that you are ready with the flushing and buf is not used anymore
lv_display_flush_ready(display);
}
With LV_COLOR_DEPTH
at 8, this only results in a black screen. Setting LV_COLOR_DEPTH
to 16 and converting RGB565 to RGB332 on the fly in lv_flush_cb
does work fine, but is slow and wastes CPU and RAM.
How can I achieve this? I can’t find much information online other than older versions of LVGL which indicated that LV_COLOR_DEPTH = 8 was for RGB332. But that seems to have changed.