Skip to content

Commit 39c33a4

Browse files
authored
Merge pull request #689 from espressif/feat/lvgl_port_rounder_cb
feat(esp_lvgl_port): Add rounder_cb option for displays
2 parents c927778 + 2603d70 commit 39c33a4

File tree

5 files changed

+39
-2
lines changed

5 files changed

+39
-2
lines changed

components/esp_lvgl_port/CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Changelog
22

3-
## [Unreleased]
3+
## 2.7.1
4+
5+
### Features
6+
- Added option to include a rounder callback
47

58
### Fixes
69
- Fixed deinitialization of the task which was created with caps - https://github.com/espressif/esp-bsp/issues/680

components/esp_lvgl_port/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ Add an LCD screen to the LVGL. It can be called multiple times for adding multip
6464
.monochrome = false,
6565
.mipi_dsi = false,
6666
.color_format = LV_COLOR_FORMAT_RGB565,
67+
.rounder_cb = my_rounder_cb,
6768
.rotation = {
6869
.swap_xy = false,
6970
.mirror_x = false,

components/esp_lvgl_port/include/esp_lvgl_port_disp.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -33,6 +33,11 @@ typedef struct {
3333
bool mirror_y; /*!< LCD Screen mirrored Y (in esp_lcd driver) */
3434
} lvgl_port_rotation_cfg_t;
3535

36+
/**
37+
* @brief Rounder callback
38+
*/
39+
typedef void (*lvgl_port_rounder_cb_t)(lv_area_t *area);
40+
3641
/**
3742
* @brief Configuration display structure
3843
*/
@@ -51,6 +56,7 @@ typedef struct {
5156
bool monochrome; /*!< True, if display is monochrome and using 1bit for 1px */
5257

5358
lvgl_port_rotation_cfg_t rotation; /*!< Default values of the screen rotation (Only HW state. Not supported for default SW rotation!) */
59+
lvgl_port_rounder_cb_t rounder_cb; /*!< Rounder callback for display area */
5460
#if LVGL_VERSION_MAJOR >= 9
5561
lv_color_format_t color_format; /*!< The color format of the display */
5662
#endif

components/esp_lvgl_port/src/lvgl8/esp_lvgl_port_disp.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ typedef struct {
4848
lv_color_t *trans_buf; /* Buffer send to driver */
4949
uint32_t trans_size; /* Maximum size for one transport */
5050
SemaphoreHandle_t trans_sem; /* Idle transfer mutex */
51+
lvgl_port_rounder_cb_t rounder_cb; /* Rounder callback for display area */
5152
} lvgl_port_display_ctx_t;
5253

5354
/*******************************************************************************
@@ -66,6 +67,7 @@ static bool lvgl_port_flush_dpi_vsync_ready_callback(esp_lcd_panel_handle_t pane
6667
#endif
6768
#endif
6869
static void lvgl_port_flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
70+
static void lvgl_port_rounder_callback(lv_disp_drv_t *drv, lv_area_t *area);
6971
static void lvgl_port_update_callback(lv_disp_drv_t *drv);
7072
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);
7173

@@ -309,6 +311,12 @@ static lv_disp_t *lvgl_port_add_disp_priv(const lvgl_port_display_cfg_t *disp_cf
309311
disp_ctx->disp_drv.draw_buf = disp_buf;
310312
disp_ctx->disp_drv.user_data = disp_ctx;
311313

314+
/* Add rounder_cb */
315+
if (disp_cfg->rounder_cb) {
316+
disp_ctx->rounder_cb = disp_cfg->rounder_cb;
317+
disp_ctx->disp_drv.rounder_cb = lvgl_port_rounder_callback;
318+
}
319+
312320
disp_ctx->disp_drv.sw_rotate = disp_cfg->flags.sw_rotate;
313321
if (disp_ctx->disp_drv.sw_rotate == false) {
314322
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,
504512
}
505513
}
506514

515+
static void lvgl_port_rounder_callback(lv_disp_drv_t *drv, lv_area_t *area)
516+
{
517+
assert(drv != NULL);
518+
lvgl_port_display_ctx_t *disp_ctx = (lvgl_port_display_ctx_t *)drv->user_data;
519+
assert(disp_ctx != NULL);
520+
521+
if (disp_ctx->rounder_cb) {
522+
disp_ctx->rounder_cb(area);
523+
}
524+
}
525+
507526
static void lvgl_port_update_callback(lv_disp_drv_t *drv)
508527
{
509528
assert(drv);

components/esp_lvgl_port/src/lvgl9/esp_lvgl_port_disp.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ typedef struct {
6060
lv_display_t *disp_drv; /* LVGL display driver */
6161
lv_display_rotation_t current_rotation;
6262
SemaphoreHandle_t trans_sem; /* Idle transfer mutex */
63+
lvgl_port_rounder_cb_t rounder_cb; /* Rounder callback for display area */
6364
#if LVGL_PORT_PPA
6465
lvgl_port_ppa_handle_t ppa_handle;
6566
#endif //LVGL_PORT_PPA
@@ -297,6 +298,7 @@ static lv_display_t *lvgl_port_add_disp_priv(const lvgl_port_display_cfg_t *disp
297298
disp_ctx->flags.swap_bytes = disp_cfg->flags.swap_bytes;
298299
disp_ctx->flags.sw_rotate = disp_cfg->flags.sw_rotate;
299300
disp_ctx->current_rotation = LV_DISPLAY_ROTATION_0;
301+
disp_ctx->rounder_cb = disp_cfg->rounder_cb;
300302

301303
uint32_t buff_caps = 0;
302304
#if SOC_PSRAM_DMA_CAPABLE == 0
@@ -751,6 +753,12 @@ static void lvgl_port_disp_size_update_callback(lv_event_t *e)
751753

752754
static void lvgl_port_display_invalidate_callback(lv_event_t *e)
753755
{
756+
lvgl_port_display_ctx_t *disp_ctx = (lvgl_port_display_ctx_t *)lv_event_get_user_data(e);
757+
lv_area_t *area = (lv_area_t *)lv_event_get_param(e);
758+
if (area != NULL && disp_ctx != NULL && disp_ctx->rounder_cb != NULL) {
759+
disp_ctx->rounder_cb(area);
760+
}
761+
754762
/* Wake LVGL task, if needed */
755763
lvgl_port_task_wake(LVGL_PORT_EVENT_DISPLAY, NULL);
756764
}

0 commit comments

Comments
 (0)