Skip to content

Commit c6a6674

Browse files
committed
fixed(lv_port): compiler failed for other chips
1 parent 8b8d8c9 commit c6a6674

File tree

5 files changed

+147
-70
lines changed

5 files changed

+147
-70
lines changed

bsp/esp32_s3_lcd_ev_board/src/esp32_s3_lcd_ev_board.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ lv_disp_t *bsp_display_start(void)
350350
bsp_display_cfg_t cfg = {
351351
.lvgl_port_cfg = ESP_LVGL_PORT_INIT_CONFIG()
352352
};
353-
cfg.lvgl_port_cfg.task_stack = 8092;
353+
cfg.lvgl_port_cfg.task_stack = CONFIG_BSP_DISPLAY_LVGL_TASK_STACK_SIZE_KB * 1024;
354354

355355
return bsp_display_start_with_config(&cfg);
356356
}

components/esp_lvgl_port/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
file(GLOB_RECURSE IMAGE_SOURCES images/*.c)
22

3-
idf_component_register(SRCS "esp_lvgl_port.c" ${IMAGE_SOURCES} INCLUDE_DIRS "include" REQUIRES "esp_lcd" PRIV_REQUIRES "esp_timer")
3+
idf_component_register(SRCS "esp_lvgl_port.c" "esp_lvgl_rgb.c" ${IMAGE_SOURCES} INCLUDE_DIRS "include" "priv_include" REQUIRES "esp_lcd" PRIV_REQUIRES "esp_timer")
44

55
idf_build_get_property(build_components BUILD_COMPONENTS)
66
if("espressif__button" IN_LIST build_components)

components/esp_lvgl_port/esp_lvgl_port.c

Lines changed: 3 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "esp_lcd_panel_ops.h"
1717
#include "esp_lcd_panel_rgb.h"
1818
#include "esp_lvgl_port.h"
19+
#include "esp_lvgl_rgb.h"
1920

2021
#include "lvgl.h"
2122

@@ -81,11 +82,6 @@ typedef struct lvgl_port_ctx_s {
8182
#endif
8283
} lvgl_port_ctx_t;
8384

84-
typedef struct {
85-
esp_lcd_panel_handle_t rgb_handle;
86-
uint32_t rgb_ref_period;
87-
} lv_manual_refresh;
88-
8985
#ifdef ESP_LVGL_PORT_TOUCH_COMPONENT
9086
typedef struct {
9187
esp_lcd_touch_handle_t handle; /* LCD touch IO handle */
@@ -126,7 +122,6 @@ typedef struct {
126122
static lvgl_port_ctx_t lvgl_port_ctx;
127123
static int lvgl_port_timer_period_ms = 5;
128124
static TaskHandle_t lvgl_task_handle = NULL;
129-
static TaskHandle_t lcd_task_handle = NULL;
130125

131126
/*******************************************************************************
132127
* Function definitions
@@ -137,7 +132,6 @@ static void lvgl_port_task_deinit(void);
137132

138133
// LVGL callbacks
139134
#if LVGL_PORT_HANDLE_FLUSH_READY
140-
static bool lvgl_port_rgb_on_vsync_callback(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx);
141135
static bool lvgl_port_flush_ready_callback(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx);
142136
#endif
143137
static void lvgl_port_flush_callback(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
@@ -248,37 +242,6 @@ esp_err_t lvgl_port_deinit(void)
248242
return ESP_OK;
249243
}
250244

251-
static void lvgl_manual_task(void *arg)
252-
{
253-
TickType_t tick;
254-
lv_manual_refresh *refresh = (lv_manual_refresh *)arg;
255-
256-
ESP_LOGI(TAG, "Starting LCD refresh task");
257-
258-
for (;;) {
259-
esp_lcd_rgb_panel_refresh(refresh->rgb_handle);
260-
tick = xTaskGetTickCount();
261-
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
262-
vTaskDelayUntil(&tick, pdMS_TO_TICKS(refresh->rgb_ref_period));
263-
}
264-
}
265-
266-
esp_err_t create_manual_task(const lvgl_port_display_cfg_t *disp_cfg)
267-
{
268-
static lv_manual_refresh refresh;
269-
270-
refresh.rgb_handle = disp_cfg->panel_handle;
271-
refresh.rgb_ref_period = disp_cfg->trans_mode.flags.ref_period;
272-
273-
BaseType_t ret = xTaskCreate(lvgl_manual_task, "LCD", 2048, &refresh, disp_cfg->trans_mode.flags.ref_priority, &lcd_task_handle);
274-
if (ret != pdPASS) {
275-
ESP_LOGE(TAG, "Failed to create LCD task");
276-
return ESP_FAIL;
277-
}
278-
279-
return ESP_OK;
280-
}
281-
282245
lv_disp_t *lvgl_port_add_disp(const lvgl_port_display_cfg_t *disp_cfg)
283246
{
284247
esp_err_t ret = ESP_OK;
@@ -348,20 +311,13 @@ lv_disp_t *lvgl_port_add_disp(const lvgl_port_display_cfg_t *disp_cfg)
348311
disp_ctx->disp_drv.user_data = disp_ctx;
349312

350313
if (disp_cfg->trans_mode.manual_mode) {
351-
create_manual_task(disp_cfg);
314+
lvgl_rgb_create_manual_task(disp_cfg);
352315
}
353316

354317
#if LVGL_PORT_HANDLE_FLUSH_READY
355318
/* Register done callback */
356319
if (disp_cfg->flags.interface_RGB) {
357-
const esp_lcd_rgb_panel_event_callbacks_t cbs = {
358-
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 2) && CONFIG_BSP_LCD_RGB_BOUNCE_BUFFER_MODE
359-
.on_bounce_frame_finish = lvgl_port_rgb_on_vsync_callback,
360-
#else
361-
.on_vsync = lvgl_port_rgb_on_vsync_callback,
362-
#endif
363-
};
364-
esp_lcd_rgb_panel_register_event_callbacks(disp_ctx->panel_handle, &cbs, &disp_ctx->disp_drv);
320+
lvgl_rgb_register_event_callbacks(disp_ctx, disp_cfg);
365321
} else {
366322
const esp_lcd_panel_io_callbacks_t cbs = {
367323
.on_color_trans_done = lvgl_port_flush_ready_callback,
@@ -736,8 +692,6 @@ void lvgl_port_flush_ready(lv_disp_t *disp)
736692
lv_disp_flush_ready(disp->driver);
737693
}
738694

739-
740-
741695
/*******************************************************************************
742696
* Private functions
743697
*******************************************************************************/
@@ -780,25 +734,6 @@ static void lvgl_port_task_deinit(void)
780734
}
781735

782736
#if LVGL_PORT_HANDLE_FLUSH_READY
783-
IRAM_ATTR static bool lvgl_port_rgb_on_vsync_callback(esp_lcd_panel_handle_t panel_handle, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx)
784-
{
785-
BaseType_t need_yield = pdFALSE;
786-
787-
lv_disp_drv_t *disp_drv = (lv_disp_drv_t *)user_ctx;
788-
assert(disp_drv != NULL);
789-
lvgl_port_display_ctx_t *disp_ctx = disp_drv->user_data;
790-
791-
if (disp_ctx->lcd_manual_mode) {
792-
xTaskNotifyFromISR(lcd_task_handle, ULONG_MAX, eNoAction, &need_yield);
793-
}
794-
795-
if (disp_ctx->lcd_transdone_cb) {
796-
need_yield = disp_ctx->lcd_transdone_cb(panel_handle, user_ctx);
797-
}
798-
799-
return (need_yield == pdTRUE);
800-
}
801-
802737
static bool lvgl_port_flush_ready_callback(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx)
803738
{
804739
lv_disp_drv_t *disp_drv = (lv_disp_drv_t *)user_ctx;
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include "esp_system.h"
8+
#include "esp_log.h"
9+
#include "esp_err.h"
10+
#include "esp_check.h"
11+
#include "esp_timer.h"
12+
#include "freertos/FreeRTOS.h"
13+
#include "freertos/task.h"
14+
#include "freertos/semphr.h"
15+
#include "esp_lcd_panel_io.h"
16+
#include "esp_lcd_panel_ops.h"
17+
#include "esp_lcd_panel_rgb.h"
18+
#include "esp_lvgl_port.h"
19+
20+
static const char *TAG = "LV_RGB";
21+
22+
#if CONFIG_IDF_TARGET_ESP32S3
23+
24+
typedef struct {
25+
esp_lcd_panel_handle_t rgb_handle;
26+
uint32_t rgb_ref_period;
27+
} lv_manual_refresh;
28+
29+
static TaskHandle_t lcd_task_handle = NULL;
30+
31+
IRAM_ATTR static bool lvgl_port_rgb_on_vsync_callback(esp_lcd_panel_handle_t panel_handle, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx)
32+
{
33+
BaseType_t need_yield = pdFALSE;
34+
35+
lv_disp_drv_t *disp_drv = (lv_disp_drv_t *)user_ctx;
36+
assert(disp_drv != NULL);
37+
lvgl_port_display_ctx_t *disp_ctx = disp_drv->user_data;
38+
39+
if (disp_ctx->lcd_manual_mode) {
40+
xTaskNotifyFromISR(lcd_task_handle, ULONG_MAX, eNoAction, &need_yield);
41+
}
42+
43+
if (disp_ctx->lcd_transdone_cb) {
44+
need_yield = disp_ctx->lcd_transdone_cb(panel_handle, user_ctx);
45+
}
46+
47+
return (need_yield == pdTRUE);
48+
}
49+
50+
esp_err_t lvgl_rgb_register_event_callbacks(lvgl_port_display_ctx_t *disp_ctx, const lvgl_port_display_cfg_t *disp_cfg)
51+
{
52+
esp_err_t ret;
53+
/* Register done callback */
54+
const esp_lcd_rgb_panel_event_callbacks_t vsync_cbs = {
55+
.on_vsync = lvgl_port_rgb_on_vsync_callback,
56+
};
57+
58+
const esp_lcd_rgb_panel_event_callbacks_t bb_cbs = {
59+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 2) && CONFIG_BSP_LCD_RGB_BOUNCE_BUFFER_MODE
60+
.on_bounce_frame_finish = lvgl_port_rgb_on_vsync_callback,
61+
#endif
62+
};
63+
64+
if (disp_cfg->trans_mode.bb_mode && (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 2))) {
65+
esp_lcd_rgb_panel_register_event_callbacks(disp_ctx->panel_handle, &bb_cbs, &disp_ctx->disp_drv);
66+
} else {
67+
esp_lcd_rgb_panel_register_event_callbacks(disp_ctx->panel_handle, &vsync_cbs, &disp_ctx->disp_drv);
68+
}
69+
70+
return ESP_OK;
71+
}
72+
73+
static void lvgl_rgb_manual_task(void *arg)
74+
{
75+
TickType_t tick;
76+
lv_manual_refresh *refresh = (lv_manual_refresh *)arg;
77+
78+
ESP_LOGI(TAG, "Starting LCD refresh task");
79+
80+
for (;;) {
81+
esp_lcd_rgb_panel_refresh(refresh->rgb_handle);
82+
tick = xTaskGetTickCount();
83+
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
84+
vTaskDelayUntil(&tick, pdMS_TO_TICKS(refresh->rgb_ref_period));
85+
}
86+
}
87+
88+
esp_err_t lvgl_rgb_create_manual_task(const lvgl_port_display_cfg_t *disp_cfg)
89+
{
90+
static lv_manual_refresh refresh;
91+
92+
refresh.rgb_handle = disp_cfg->panel_handle;
93+
refresh.rgb_ref_period = disp_cfg->trans_mode.flags.ref_period;
94+
95+
BaseType_t ret = xTaskCreate(lvgl_rgb_manual_task, "LCD", 2048, &refresh, disp_cfg->trans_mode.flags.ref_priority, &lcd_task_handle);
96+
if (ret != pdPASS) {
97+
ESP_LOGE(TAG, "Failed to create LCD task");
98+
return ESP_FAIL;
99+
}
100+
101+
return ESP_OK;
102+
}
103+
104+
#else
105+
106+
esp_err_t lvgl_rgb_register_event_callbacks(lvgl_port_display_ctx_t *disp_ctx, const lvgl_port_display_cfg_t *disp_cfg)
107+
{
108+
ESP_LOGE(TAG, "RGB mode not supported!");
109+
}
110+
111+
esp_err_t lvgl_rgb_create_manual_task(const lvgl_port_display_cfg_t *disp_cfg)
112+
{
113+
ESP_LOGE(TAG, "RGB mode not supported!");
114+
}
115+
116+
#endif
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/**
8+
* @file
9+
* @brief ESP LVGL port
10+
*/
11+
12+
#pragma once
13+
14+
#include "esp_err.h"
15+
16+
#ifdef __cplusplus
17+
extern "C" {
18+
#endif
19+
20+
esp_err_t lvgl_rgb_create_manual_task(const lvgl_port_display_cfg_t *disp_cfg);
21+
22+
esp_err_t lvgl_rgb_register_event_callbacks(lvgl_port_display_ctx_t *disp_ctx, const lvgl_port_display_cfg_t *disp_cfg);
23+
24+
#ifdef __cplusplus
25+
}
26+
#endif

0 commit comments

Comments
 (0)