diff --git a/components/esp_lvgl_port/CHANGELOG.md b/components/esp_lvgl_port/CHANGELOG.md index 54f37404f..5755a4517 100644 --- a/components/esp_lvgl_port/CHANGELOG.md +++ b/components/esp_lvgl_port/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog -## [Unreleased] +## 2.7.1 + +### Features +- Added option to include a rounder callback ### Fixes - Fixed deinitialization of the task which was created with caps - https://github.com/espressif/esp-bsp/issues/680 diff --git a/components/esp_lvgl_port/README.md b/components/esp_lvgl_port/README.md index e52e648f7..5b05e6afd 100644 --- a/components/esp_lvgl_port/README.md +++ b/components/esp_lvgl_port/README.md @@ -64,6 +64,7 @@ Add an LCD screen to the LVGL. It can be called multiple times for adding multip .monochrome = false, .mipi_dsi = false, .color_format = LV_COLOR_FORMAT_RGB565, + .rounder_cb = my_rounder_cb, .rotation = { .swap_xy = false, .mirror_x = false, diff --git a/components/esp_lvgl_port/include/esp_lvgl_port_disp.h b/components/esp_lvgl_port/include/esp_lvgl_port_disp.h index a82728703..3d90f74c6 100644 --- a/components/esp_lvgl_port/include/esp_lvgl_port_disp.h +++ b/components/esp_lvgl_port/include/esp_lvgl_port_disp.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -33,6 +33,11 @@ typedef struct { bool mirror_y; /*!< LCD Screen mirrored Y (in esp_lcd driver) */ } lvgl_port_rotation_cfg_t; +/** + * @brief Rounder callback + */ +typedef void (*lvgl_port_rounder_cb_t)(lv_area_t *area); + /** * @brief Configuration display structure */ @@ -51,6 +56,7 @@ typedef struct { bool monochrome; /*!< True, if display is monochrome and using 1bit for 1px */ lvgl_port_rotation_cfg_t rotation; /*!< Default values of the screen rotation (Only HW state. Not supported for default SW rotation!) */ + lvgl_port_rounder_cb_t rounder_cb; /*!< Rounder callback for display area */ #if LVGL_VERSION_MAJOR >= 9 lv_color_format_t color_format; /*!< The color format of the display */ #endif diff --git a/components/esp_lvgl_port/src/lvgl8/esp_lvgl_port_disp.c b/components/esp_lvgl_port/src/lvgl8/esp_lvgl_port_disp.c index 30075b356..650ad409b 100644 --- a/components/esp_lvgl_port/src/lvgl8/esp_lvgl_port_disp.c +++ b/components/esp_lvgl_port/src/lvgl8/esp_lvgl_port_disp.c @@ -48,6 +48,7 @@ typedef struct { lv_color_t *trans_buf; /* Buffer send to driver */ uint32_t trans_size; /* Maximum size for one transport */ SemaphoreHandle_t trans_sem; /* Idle transfer mutex */ + lvgl_port_rounder_cb_t rounder_cb; /* Rounder callback for display area */ } lvgl_port_display_ctx_t; /******************************************************************************* @@ -66,6 +67,7 @@ static bool lvgl_port_flush_dpi_vsync_ready_callback(esp_lcd_panel_handle_t pane #endif #endif static void lvgl_port_flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); +static void lvgl_port_rounder_callback(lv_disp_drv_t *drv, lv_area_t *area); static void lvgl_port_update_callback(lv_disp_drv_t *drv); static void lvgl_port_pix_monochrome_callback(lv_disp_drv_t *drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); @@ -309,6 +311,12 @@ static lv_disp_t *lvgl_port_add_disp_priv(const lvgl_port_display_cfg_t *disp_cf disp_ctx->disp_drv.draw_buf = disp_buf; disp_ctx->disp_drv.user_data = disp_ctx; + /* Add rounder_cb */ + if (disp_cfg->rounder_cb) { + disp_ctx->rounder_cb = disp_cfg->rounder_cb; + disp_ctx->disp_drv.rounder_cb = lvgl_port_rounder_callback; + } + disp_ctx->disp_drv.sw_rotate = disp_cfg->flags.sw_rotate; if (disp_ctx->disp_drv.sw_rotate == false) { disp_ctx->disp_drv.drv_update_cb = lvgl_port_update_callback; @@ -504,6 +512,17 @@ static void lvgl_port_flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, } } +static void lvgl_port_rounder_callback(lv_disp_drv_t *drv, lv_area_t *area) +{ + assert(drv != NULL); + lvgl_port_display_ctx_t *disp_ctx = (lvgl_port_display_ctx_t *)drv->user_data; + assert(disp_ctx != NULL); + + if (disp_ctx->rounder_cb) { + disp_ctx->rounder_cb(area); + } +} + static void lvgl_port_update_callback(lv_disp_drv_t *drv) { assert(drv); diff --git a/components/esp_lvgl_port/src/lvgl9/esp_lvgl_port_disp.c b/components/esp_lvgl_port/src/lvgl9/esp_lvgl_port_disp.c index 99021737a..3622ebddc 100644 --- a/components/esp_lvgl_port/src/lvgl9/esp_lvgl_port_disp.c +++ b/components/esp_lvgl_port/src/lvgl9/esp_lvgl_port_disp.c @@ -60,6 +60,7 @@ typedef struct { lv_display_t *disp_drv; /* LVGL display driver */ lv_display_rotation_t current_rotation; SemaphoreHandle_t trans_sem; /* Idle transfer mutex */ + lvgl_port_rounder_cb_t rounder_cb; /* Rounder callback for display area */ #if LVGL_PORT_PPA lvgl_port_ppa_handle_t ppa_handle; #endif //LVGL_PORT_PPA @@ -297,6 +298,7 @@ static lv_display_t *lvgl_port_add_disp_priv(const lvgl_port_display_cfg_t *disp disp_ctx->flags.swap_bytes = disp_cfg->flags.swap_bytes; disp_ctx->flags.sw_rotate = disp_cfg->flags.sw_rotate; disp_ctx->current_rotation = LV_DISPLAY_ROTATION_0; + disp_ctx->rounder_cb = disp_cfg->rounder_cb; uint32_t buff_caps = 0; #if SOC_PSRAM_DMA_CAPABLE == 0 @@ -751,6 +753,12 @@ static void lvgl_port_disp_size_update_callback(lv_event_t *e) static void lvgl_port_display_invalidate_callback(lv_event_t *e) { + lvgl_port_display_ctx_t *disp_ctx = (lvgl_port_display_ctx_t *)lv_event_get_user_data(e); + lv_area_t *area = (lv_area_t *)lv_event_get_param(e); + if (area != NULL && disp_ctx != NULL && disp_ctx->rounder_cb != NULL) { + disp_ctx->rounder_cb(area); + } + /* Wake LVGL task, if needed */ lvgl_port_task_wake(LVGL_PORT_EVENT_DISPLAY, NULL); }