lvgl_port.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #pragma once
  7. #include <stdint.h>
  8. #include "esp_err.h"
  9. #include "esp_lcd_types.h"
  10. #include "esp_lcd_touch.h"
  11. #include "lvgl.h"
  12. #ifdef __cplusplus
  13. extern "C"
  14. {
  15. #endif
  16. /**
  17. * LVGL 相关参数,用户可以根据需求调整
  18. *
  19. */
  20. #define LVGL_PORT_H_RES (480) // 水平分辨率
  21. #define LVGL_PORT_V_RES (480) // 垂直分辨率
  22. #define LVGL_PORT_TICK_PERIOD_MS (2) // LVGL 定时器周期,单位毫秒
  23. // 对齐内存访问
  24. #define LVGL_PORT_MEM_ALIGNMENT 32
  25. #define LVGL_PORT_DMA_BURST_SIZE 32
  26. /**
  27. * LVGL 定时器任务相关参数,用户可以根据需求调整
  28. *
  29. */
  30. #define LVGL_PORT_TASK_MAX_DELAY_MS (500) // LVGL 定时器任务的最大延迟,单位毫秒
  31. #define LVGL_PORT_TASK_MIN_DELAY_MS (10) // LVGL 定时器任务的最小延迟,单位毫秒
  32. #define LVGL_PORT_TASK_STACK_SIZE (8 * 2048) // LVGL 定时器任务的栈大小,单位字节
  33. #define LVGL_PORT_TASK_PRIORITY (2) // LVGL 定时器任务的优先级
  34. #define LVGL_PORT_TASK_CORE (-1) // LVGL 定时器任务的核心编号,-1 表示不指定核心
  35. /**
  36. * LVGL 缓冲区相关参数,用户可以根据需求调整:
  37. * (如果启用了避免撕裂功能,这些参数将无效)
  38. *
  39. * - 缓冲区分配的内存类型:
  40. * - MALLOC_CAP_SPIRAM: 在 PSRAM 中分配 LVGL 缓冲区
  41. * - MALLOC_CAP_INTERNAL: 在 SRAM 中分配 LVGL 缓冲区
  42. * (SRAM 比 PSRAM 快,但 PSRAM 容量更大)
  43. *
  44. */
  45. //#if CONFIG_EXAMPLE_LVGL_PORT_BUF_PSRAM
  46. //#define LVGL_PORT_BUFFER_MALLOC_CAPS (MALLOC_CAP_SPIRAM)
  47. //#elif CONFIG_EXAMPLE_LVGL_PORT_BUF_INTERNAL
  48. #define LVGL_PORT_BUFFER_MALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
  49. //#endif
  50. #define LVGL_PORT_BUFFER_HEIGHT (400) // 缓冲区高度
  51. /**
  52. * 避免撕裂相关配置,用户可以根据需求调整。
  53. *
  54. */
  55. #define LVGL_PORT_AVOID_TEAR_ENABLE (CONFIG_EXAMPLE_LVGL_PORT_AVOID_TEAR_ENABLE) // 启用避免撕裂功能,设置为 1 启用
  56. #if LVGL_PORT_AVOID_TEAR_ENABLE
  57. /**
  58. * 设置避免撕裂模式:
  59. * - 0: 禁用避免撕裂功能
  60. * - 1: LCD 双缓冲 & LVGL 全刷新
  61. * - 2: LCD 三缓冲 & LVGL 全刷新
  62. * - 3: LCD 双缓冲 & LVGL 直接模式(推荐)
  63. *
  64. */
  65. #define LVGL_PORT_AVOID_TEAR_MODE (CONFIG_EXAMPLE_LVGL_PORT_AVOID_TEAR_MODE)
  66. /**
  67. * 设置启用避免撕裂功能时 LCD 面板的旋转角度:
  68. * - 0: 0 度
  69. * - 90: 90 度
  70. * - 180: 180 度
  71. * - 270: 270 度
  72. *
  73. */
  74. #define EXAMPLE_LVGL_PORT_ROTATION_DEGREE (CONFIG_EXAMPLE_LVGL_PORT_ROTATION_DEGREE)
  75. /**
  76. * 以下配置根据上述配置自动设置,用户不需要修改它们。
  77. *
  78. */
  79. #if LVGL_PORT_AVOID_TEAR_MODE == 1
  80. #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (2) // LCD 缓冲区数量
  81. #define LVGL_PORT_FULL_REFRESH (1) // 是否启用全刷新
  82. #elif LVGL_PORT_AVOID_TEAR_MODE == 2
  83. #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (3) // LCD 缓冲区数量
  84. #define LVGL_PORT_FULL_REFRESH (1) // 是否启用全刷新
  85. #elif LVGL_PORT_AVOID_TEAR_MODE == 3
  86. #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (2) // LCD 缓冲区数量
  87. #define LVGL_PORT_DIRECT_MODE (1) // 是否启用直接模式
  88. #endif /* LVGL_PORT_AVOID_TEAR_MODE */
  89. #if EXAMPLE_LVGL_PORT_ROTATION_DEGREE == 0
  90. #define EXAMPLE_LVGL_PORT_ROTATION_0 (1) // 0 度旋转
  91. #else
  92. #if EXAMPLE_LVGL_PORT_ROTATION_DEGREE == 90
  93. #define EXAMPLE_LVGL_PORT_ROTATION_90 (1) // 90 度旋转
  94. #elif EXAMPLE_LVGL_PORT_ROTATION_DEGREE == 180
  95. #define EXAMPLE_LVGL_PORT_ROTATION_180 (1) // 180 度旋转
  96. #elif EXAMPLE_LVGL_PORT_ROTATION_DEGREE == 270
  97. #define EXAMPLE_LVGL_PORT_ROTATION_270 (1) // 270 度旋转
  98. #endif
  99. #ifdef LVGL_PORT_LCD_RGB_BUFFER_NUMS
  100. #undef LVGL_PORT_LCD_RGB_BUFFER_NUMS
  101. #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (3) // 重新定义 LCD 缓冲区数量
  102. #endif
  103. #endif /* EXAMPLE_LVGL_PORT_ROTATION_DEGREE */
  104. #else
  105. #define LVGL_PORT_LCD_RGB_BUFFER_NUMS (1) // LCD 缓冲区数量
  106. #define LVGL_PORT_FULL_REFRESH (0) // 是否启用全刷新
  107. #define LVGL_PORT_DIRECT_MODE (0) // 是否启用直接模式
  108. #endif /* LVGL_PORT_AVOID_TEAR_ENABLE */
  109. /**
  110. * @brief 初始化 LVGL 端口
  111. *
  112. * @param[in] lcd_handle: LCD 面板句柄
  113. * @param[in] tp_handle: 触摸屏句柄
  114. *
  115. * @return
  116. * - ESP_OK: 成功
  117. * - ESP_ERR_INVALID_ARG: 参数无效
  118. * - 其他: 失败
  119. */
  120. esp_err_t lvgl_port_init(esp_lcd_panel_handle_t lcd_handle, esp_lcd_touch_handle_t tp_handle);
  121. /**
  122. * @brief 获取 LVGL 互斥锁
  123. *
  124. * @param[in] timeout_ms: 超时时间,单位毫秒。0 表示无限期等待。
  125. *
  126. * @return
  127. * - true: 成功获取互斥锁
  128. * - false: 未能获取互斥锁
  129. */
  130. bool lvgl_port_lock(int timeout_ms);
  131. /**
  132. * @brief 释放 LVGL 互斥锁
  133. *
  134. */
  135. void lvgl_port_unlock(void);
  136. /**
  137. * @brief 当 RGB 帧缓冲区传输完成时通知 LVGL 任务
  138. *
  139. * @return
  140. * - true: 需要重新调度任务
  141. * - false: 不需要重新调度任务
  142. */
  143. bool lvgl_port_notify_rgb_vsync(void);
  144. #ifdef __cplusplus
  145. }
  146. #endif