Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion components/esp_lvgl_port/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
1 change: 1 addition & 0 deletions components/esp_lvgl_port/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
8 changes: 7 additions & 1 deletion components/esp_lvgl_port/include/esp_lvgl_port_disp.h
Original file line number Diff line number Diff line change
@@ -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
*/
Expand Down Expand Up @@ -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
*/
Expand All @@ -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
Expand Down
19 changes: 19 additions & 0 deletions components/esp_lvgl_port/src/lvgl8/esp_lvgl_port_disp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/*******************************************************************************
Expand All @@ -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);

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions components/esp_lvgl_port/src/lvgl9/esp_lvgl_port_disp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Loading