diff --git a/modules/lvgl/lvgl.c b/modules/lvgl/lvgl.c index 4c3d562520a..430d4a83c3b 100644 --- a/modules/lvgl/lvgl.c +++ b/modules/lvgl/lvgl.c @@ -27,6 +27,8 @@ struct lvgl_disp_data disp_data[DT_ZEPHYR_DISPLAYS_COUNT] = {{ .blanking_on = false, }}; +#define DISPLAY_BUFFER_ALIGN(alignbytes) __aligned(alignbytes) + #if DT_HAS_COMPAT_STATUS_OKAY(zephyr_displays) #define DISPLAY_NODE(n) DT_ZEPHYR_DISPLAY(n) #elif DT_HAS_CHOSEN(zephyr_display) @@ -77,21 +79,21 @@ static uint8_t *mono_vtile_buf_p[DT_ZEPHYR_DISPLAYS_COUNT] = {NULL}; /* prevent unaligned memory accesses. */ /* clang-format off */ -#define LV_BUFFERS_DEFINE(n) \ - static uint8_t buf0_##n[BUFFER_SIZE(n)] \ - IF_ENABLED(CONFIG_LV_Z_VDB_CUSTOM_SECTION, (Z_GENERIC_SECTION(.lvgl_buf))) \ - __aligned(CONFIG_LV_Z_VDB_ALIGN); \ - \ - IF_ENABLED(CONFIG_LV_Z_DOUBLE_VDB, ( \ - static uint8_t buf1_##n[BUFFER_SIZE(n)] \ - IF_ENABLED(CONFIG_LV_Z_VDB_CUSTOM_SECTION, (Z_GENERIC_SECTION(.lvgl_buf))) \ - __aligned(CONFIG_LV_Z_VDB_ALIGN); \ - )) \ - \ - IF_ENABLED(ALLOC_MONOCHROME_CONV_BUFFER, ( \ - static uint8_t mono_vtile_buf_##n[BUFFER_SIZE(n)] \ - IF_ENABLED(CONFIG_LV_Z_VDB_CUSTOM_SECTION, (Z_GENERIC_SECTION(.lvgl_buf))) \ - __aligned(CONFIG_LV_Z_VDB_ALIGN); \ +#define LV_BUFFERS_DEFINE(n) \ + static DISPLAY_BUFFER_ALIGN(LV_DRAW_BUF_ALIGN) uint8_t buf0_##n[BUFFER_SIZE(n)] \ + IF_ENABLED(CONFIG_LV_Z_VDB_CUSTOM_SECTION, (Z_GENERIC_SECTION(.lvgl_buf))) \ + __aligned(CONFIG_LV_Z_VDB_ALIGN); \ + \ + IF_ENABLED(CONFIG_LV_Z_DOUBLE_VDB, ( \ + static DISPLAY_BUFFER_ALIGN(LV_DRAW_BUF_ALIGN) uint8_t buf1_##n[BUFFER_SIZE(n)] \ + IF_ENABLED(CONFIG_LV_Z_VDB_CUSTOM_SECTION, (Z_GENERIC_SECTION(.lvgl_buf))) \ + __aligned(CONFIG_LV_Z_VDB_ALIGN); \ + )) \ + \ + IF_ENABLED(ALLOC_MONOCHROME_CONV_BUFFER, ( \ + static uint8_t mono_vtile_buf_##n[BUFFER_SIZE(n)] \ + IF_ENABLED(CONFIG_LV_Z_VDB_CUSTOM_SECTION, (Z_GENERIC_SECTION(.lvgl_buf))) \ + __aligned(CONFIG_LV_Z_VDB_ALIGN); \ )) FOR_EACH(LV_BUFFERS_DEFINE, (), LV_DISPLAYS_IDX_LIST); diff --git a/modules/lvgl/lvgl_display_16bit.c b/modules/lvgl/lvgl_display_16bit.c index 084cce0e371..a72ddd39899 100644 --- a/modules/lvgl/lvgl_display_16bit.c +++ b/modules/lvgl/lvgl_display_16bit.c @@ -20,7 +20,7 @@ void lvgl_flush_cb_16bit(lv_display_t *display, const lv_area_t *area, uint8_t * flush.y = area->y1; flush.desc.buf_size = w * 2U * h; flush.desc.width = w; - flush.desc.pitch = w; + flush.desc.pitch = ROUND_UP(w * 2U, LV_DRAW_BUF_STRIDE_ALIGN) / 2U; flush.desc.height = h; flush.buf = (void *)px_map; diff --git a/modules/lvgl/lvgl_display_24bit.c b/modules/lvgl/lvgl_display_24bit.c index 0841655399f..ffb37868792 100644 --- a/modules/lvgl/lvgl_display_24bit.c +++ b/modules/lvgl/lvgl_display_24bit.c @@ -20,7 +20,7 @@ void lvgl_flush_cb_24bit(lv_display_t *display, const lv_area_t *area, uint8_t * flush.y = area->y1; flush.desc.buf_size = w * 3U * h; flush.desc.width = w; - flush.desc.pitch = w; + flush.desc.pitch = ROUND_UP(w * 3U, LV_DRAW_BUF_STRIDE_ALIGN) / 3U; flush.desc.height = h; flush.buf = (void *)px_map; diff --git a/modules/lvgl/lvgl_display_32bit.c b/modules/lvgl/lvgl_display_32bit.c index 1a9e11abe4a..3e3e07fe85a 100644 --- a/modules/lvgl/lvgl_display_32bit.c +++ b/modules/lvgl/lvgl_display_32bit.c @@ -20,7 +20,7 @@ void lvgl_flush_cb_32bit(lv_display_t *display, const lv_area_t *area, uint8_t * flush.y = area->y1; flush.desc.buf_size = w * 4U * h; flush.desc.width = w; - flush.desc.pitch = w; + flush.desc.pitch = ROUND_UP(w * 4U, LV_DRAW_BUF_STRIDE_ALIGN) / 4U; flush.desc.height = h; flush.buf = (void *)px_map; lvgl_flush_display(&flush); diff --git a/modules/lvgl/lvgl_display_8bit.c b/modules/lvgl/lvgl_display_8bit.c index a843ece19a4..15bd850907d 100644 --- a/modules/lvgl/lvgl_display_8bit.c +++ b/modules/lvgl/lvgl_display_8bit.c @@ -19,7 +19,7 @@ void lvgl_flush_cb_8bit(lv_display_t *display, const lv_area_t *area, uint8_t *p flush.y = area->y1; flush.desc.buf_size = w * h; flush.desc.width = w; - flush.desc.pitch = w; + flush.desc.pitch = ROUND_UP(w, LV_DRAW_BUF_STRIDE_ALIGN); flush.desc.height = h; flush.buf = (void *)px_map;