/* * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include #include "esp_err.h" #include "esp_lcd_types.h" #include "esp_lcd_touch.h" #include "lvgl.h" #ifdef __cplusplus extern "C" { #endif /** * LVGL 相关参数,用户可以根据需求调整 * */ #define LVGL_PORT_H_RES (480) // 水平分辨率 #define LVGL_PORT_V_RES (480) // 垂直分辨率 #define LVGL_PORT_TICK_PERIOD_MS (2) // LVGL 定时器周期,单位毫秒 // 对齐内存访问 #define LVGL_PORT_MEM_ALIGNMENT 32 #define LVGL_PORT_DMA_BURST_SIZE 32 /** * LVGL 定时器任务相关参数,用户可以根据需求调整 * */ #define LVGL_PORT_TASK_MAX_DELAY_MS (500) // LVGL 定时器任务的最大延迟,单位毫秒 #define LVGL_PORT_TASK_MIN_DELAY_MS (10) // LVGL 定时器任务的最小延迟,单位毫秒 #define LVGL_PORT_TASK_STACK_SIZE (8 * 2048) // LVGL 定时器任务的栈大小,单位字节 #define LVGL_PORT_TASK_PRIORITY (2) // LVGL 定时器任务的优先级 #define LVGL_PORT_TASK_CORE (-1) // LVGL 定时器任务的核心编号,-1 表示不指定核心 /** * LVGL 缓冲区相关参数,用户可以根据需求调整: * (如果启用了避免撕裂功能,这些参数将无效) * * - 缓冲区分配的内存类型: * - MALLOC_CAP_SPIRAM: 在 PSRAM 中分配 LVGL 缓冲区 * - MALLOC_CAP_INTERNAL: 在 SRAM 中分配 LVGL 缓冲区 * (SRAM 比 PSRAM 快,但 PSRAM 容量更大) * */ //#if CONFIG_EXAMPLE_LVGL_PORT_BUF_PSRAM //#define LVGL_PORT_BUFFER_MALLOC_CAPS (MALLOC_CAP_SPIRAM) //#elif CONFIG_EXAMPLE_LVGL_PORT_BUF_INTERNAL #define LVGL_PORT_BUFFER_MALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) //#endif #define LVGL_PORT_BUFFER_HEIGHT (480) // 缓冲区高度 /** * 避免撕裂相关配置,用户可以根据需求调整。 * */ #define LVGL_PORT_AVOID_TEAR_ENABLE (CONFIG_EXAMPLE_LVGL_PORT_AVOID_TEAR_ENABLE) // 启用避免撕裂功能,设置为 1 启用 #if LVGL_PORT_AVOID_TEAR_ENABLE /** * 设置避免撕裂模式: * - 0: 禁用避免撕裂功能 * - 1: LCD 双缓冲 & LVGL 全刷新 * - 2: LCD 三缓冲 & LVGL 全刷新 * - 3: LCD 双缓冲 & LVGL 直接模式(推荐) * */ #define LVGL_PORT_AVOID_TEAR_MODE (CONFIG_EXAMPLE_LVGL_PORT_AVOID_TEAR_MODE) /** * 设置启用避免撕裂功能时 LCD 面板的旋转角度: * - 0: 0 度 * - 90: 90 度 * - 180: 180 度 * - 270: 270 度 * */ #define EXAMPLE_LVGL_PORT_ROTATION_DEGREE (CONFIG_EXAMPLE_LVGL_PORT_ROTATION_DEGREE) /** * 以下配置根据上述配置自动设置,用户不需要修改它们。 * */ #if LVGL_PORT_AVOID_TEAR_MODE == 1 #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (2) // LCD 缓冲区数量 #define LVGL_PORT_FULL_REFRESH (1) // 是否启用全刷新 #elif LVGL_PORT_AVOID_TEAR_MODE == 2 #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (3) // LCD 缓冲区数量 #define LVGL_PORT_FULL_REFRESH (1) // 是否启用全刷新 #elif LVGL_PORT_AVOID_TEAR_MODE == 3 #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (2) // LCD 缓冲区数量 #define LVGL_PORT_DIRECT_MODE (1) // 是否启用直接模式 #endif /* LVGL_PORT_AVOID_TEAR_MODE */ #if EXAMPLE_LVGL_PORT_ROTATION_DEGREE == 0 #define EXAMPLE_LVGL_PORT_ROTATION_0 (1) // 0 度旋转 #else #if EXAMPLE_LVGL_PORT_ROTATION_DEGREE == 90 #define EXAMPLE_LVGL_PORT_ROTATION_90 (1) // 90 度旋转 #elif EXAMPLE_LVGL_PORT_ROTATION_DEGREE == 180 #define EXAMPLE_LVGL_PORT_ROTATION_180 (1) // 180 度旋转 #elif EXAMPLE_LVGL_PORT_ROTATION_DEGREE == 270 #define EXAMPLE_LVGL_PORT_ROTATION_270 (1) // 270 度旋转 #endif #ifdef LVGL_PORT_LCD_RGB_BUFFER_NUMS #undef LVGL_PORT_LCD_RGB_BUFFER_NUMS #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (3) // 重新定义 LCD 缓冲区数量 #endif #endif /* EXAMPLE_LVGL_PORT_ROTATION_DEGREE */ #else #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (1) // LCD 缓冲区数量 #define LVGL_PORT_FULL_REFRESH (0) // 是否启用全刷新 #define LVGL_PORT_DIRECT_MODE (0) // 是否启用直接模式 #endif /* LVGL_PORT_AVOID_TEAR_ENABLE */ /** * @brief 初始化 LVGL 端口 * * @param[in] lcd_handle: LCD 面板句柄 * @param[in] tp_handle: 触摸屏句柄 * * @return * - ESP_OK: 成功 * - ESP_ERR_INVALID_ARG: 参数无效 * - 其他: 失败 */ esp_err_t lvgl_port_init(esp_lcd_panel_handle_t lcd_handle, esp_lcd_touch_handle_t tp_handle); /** * @brief 获取 LVGL 互斥锁 * * @param[in] timeout_ms: 超时时间,单位毫秒。0 表示无限期等待。 * * @return * - true: 成功获取互斥锁 * - false: 未能获取互斥锁 */ bool lvgl_port_lock(int timeout_ms); /** * @brief 释放 LVGL 互斥锁 * */ void lvgl_port_unlock(void); /** * @brief 当 RGB 帧缓冲区传输完成时通知 LVGL 任务 * * @return * - true: 需要重新调度任务 * - false: 不需要重新调度任务 */ bool lvgl_port_notify_rgb_vsync(void); #ifdef __cplusplus } #endif