123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /*
- * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
- *
- * SPDX-License-Identifier: Apache-2.0
- */
- #pragma once
- #include <stdint.h>
- #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
|