175 lines
6.9 KiB
C
175 lines
6.9 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: CC0-1.0
|
|
*/
|
|
#pragma once
|
|
|
|
#include "sdkconfig.h"
|
|
#ifdef CONFIG_ARDUINO_RUNNING_CORE
|
|
#include <Arduino.h>
|
|
#endif
|
|
#include "esp_display_panel.hpp"
|
|
#include "lvgl.h"
|
|
|
|
// *INDENT-OFF*
|
|
|
|
/**
|
|
* LVGL related parameters, can be adjusted by users
|
|
*/
|
|
#define LVGL_PORT_TICK_PERIOD_MS (2) // The period of the LVGL tick task, in milliseconds
|
|
|
|
/**
|
|
*
|
|
* LVGL buffer related parameters, can be adjusted by users:
|
|
*
|
|
* (These parameters will be useless if the avoid tearing function is enabled)
|
|
*
|
|
* - Memory type for buffer allocation:
|
|
* - MALLOC_CAP_SPIRAM: Allocate LVGL buffer in PSRAM
|
|
* - MALLOC_CAP_INTERNAL: Allocate LVGL buffer in SRAM
|
|
*
|
|
* (The SRAM is faster than PSRAM, but the PSRAM has a larger capacity)
|
|
* (For SPI/QSPI LCD, it is recommended to allocate the buffer in SRAM, because the SPI DMA does not directly support PSRAM now)
|
|
*
|
|
* - The size (in bytes) and number of buffers:
|
|
* - Lager buffer size can improve FPS, but it will occupy more memory. Maximum buffer size is `width * height`.
|
|
* - The number of buffers should be 1 or 2.
|
|
*/
|
|
#define LVGL_PORT_BUFFER_MALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) // Allocate LVGL buffer in SRAM
|
|
// #define LVGL_PORT_BUFFER_MALLOC_CAPS (MALLOC_CAP_SPIRAM) // Allocate LVGL buffer in PSRAM
|
|
#define LVGL_PORT_BUFFER_SIZE_HEIGHT (20)
|
|
#define LVGL_PORT_BUFFER_NUM (2)
|
|
|
|
/**
|
|
* LVGL timer handle task related parameters, can be adjusted by users
|
|
*/
|
|
#define LVGL_PORT_TASK_MAX_DELAY_MS (500) // The maximum delay of the LVGL timer task, in milliseconds
|
|
#define LVGL_PORT_TASK_MIN_DELAY_MS (2) // The minimum delay of the LVGL timer task, in milliseconds
|
|
#define LVGL_PORT_TASK_STACK_SIZE (6 * 1024) // The stack size of the LVGL timer task, in bytes
|
|
#define LVGL_PORT_TASK_PRIORITY (2) // The priority of the LVGL timer task
|
|
#ifdef ARDUINO_RUNNING_CORE
|
|
#define LVGL_PORT_TASK_CORE (ARDUINO_RUNNING_CORE) // Valid if using Arduino
|
|
#else
|
|
#define LVGL_PORT_TASK_CORE (1) // Valid if using ESP-IDF
|
|
#endif
|
|
// The core of the LVGL timer task, `-1` means the don't specify the core
|
|
// Default is the same as the main core
|
|
// This can be set to `1` only if the SoCs support dual-core,
|
|
// otherwise it should be set to `-1` or `0`
|
|
|
|
/**
|
|
* Avoid tering related configurations, can be adjusted by users.
|
|
*
|
|
* (Currently, This function only supports RGB LCD and the version of LVGL must be >= 8.3.9)
|
|
*/
|
|
/**
|
|
* Set the avoid tearing mode:
|
|
* - 0: Disable avoid tearing function
|
|
* - 1: LCD double-buffer & LVGL full-refresh
|
|
* - 2: LCD triple-buffer & LVGL full-refresh
|
|
* - 3: LCD double-buffer & LVGL direct-mode (recommended)
|
|
*/
|
|
#ifdef CONFIG_LVGL_PORT_AVOID_TEARING_MODE
|
|
#define LVGL_PORT_AVOID_TEARING_MODE (CONFIG_LVGL_PORT_AVOID_TEARING_MODE)
|
|
// Valid if using ESP-IDF
|
|
#else
|
|
#define LVGL_PORT_AVOID_TEARING_MODE (3) // Valid if using Arduino
|
|
#endif
|
|
|
|
#if LVGL_PORT_AVOID_TEARING_MODE != 0
|
|
/**
|
|
* When avoid tearing is enabled, the LVGL software rotation `lv_disp_set_rotation()` is not supported.
|
|
* But users can set the rotation degree(0/90/180/270) here, but this function will reduce FPS.
|
|
*
|
|
* Set the rotation degree:
|
|
* - 0: 0 degree
|
|
* - 90: 90 degree
|
|
* - 180: 180 degree
|
|
* - 270: 270 degree
|
|
*/
|
|
#ifdef CONFIG_LVGL_PORT_ROTATION_DEGREE
|
|
#define LVGL_PORT_ROTATION_DEGREE (CONFIG_LVGL_PORT_ROTATION_DEGREE)
|
|
// Valid if using ESP-IDF
|
|
#else
|
|
#define LVGL_PORT_ROTATION_DEGREE (0) // Valid if using Arduino
|
|
#endif
|
|
|
|
/**
|
|
* Here, some important configurations will be set based on different anti-tearing modes and rotation angles.
|
|
* No modification is required here.
|
|
*
|
|
* Users should use `lcd_bus->configRgbFrameBufferNumber(LVGL_PORT_DISP_BUFFER_NUM);` to set the buffer number before. If screen drifting occurs, please refer to the Troubleshooting section in the README.
|
|
* initializing the LCD bus
|
|
*/
|
|
#define LVGL_PORT_AVOID_TEAR (1)
|
|
// Set the buffer number and refresh mode according to the different modes
|
|
#if LVGL_PORT_AVOID_TEARING_MODE == 1
|
|
#define LVGL_PORT_DISP_BUFFER_NUM (2)
|
|
#define LVGL_PORT_FULL_REFRESH (1)
|
|
#elif LVGL_PORT_AVOID_TEARING_MODE == 2
|
|
#define LVGL_PORT_DISP_BUFFER_NUM (3)
|
|
#define LVGL_PORT_FULL_REFRESH (1)
|
|
#elif LVGL_PORT_AVOID_TEARING_MODE == 3
|
|
#define LVGL_PORT_DISP_BUFFER_NUM (2)
|
|
#define LVGL_PORT_DIRECT_MODE (1)
|
|
#else
|
|
#error "Invalid avoid tearing mode, please set macro `LVGL_PORT_AVOID_TEARING_MODE` to one of `LVGL_PORT_AVOID_TEARING_MODE_*`"
|
|
#endif
|
|
// Check rotation
|
|
#if (LVGL_PORT_ROTATION_DEGREE != 0) && (LVGL_PORT_ROTATION_DEGREE != 90) && (LVGL_PORT_ROTATION_DEGREE != 180) && \
|
|
(LVGL_PORT_ROTATION_DEGREE != 270)
|
|
#error "Invalid rotation degree, please set to 0, 90, 180 or 270"
|
|
#elif LVGL_PORT_ROTATION_DEGREE != 0
|
|
#ifdef LVGL_PORT_DISP_BUFFER_NUM
|
|
#undef LVGL_PORT_DISP_BUFFER_NUM
|
|
#define LVGL_PORT_DISP_BUFFER_NUM (3)
|
|
#endif
|
|
#endif
|
|
#endif /* LVGL_PORT_AVOID_TEARING_MODE */
|
|
|
|
// *INDENT-ON*
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Porting LVGL with LCD and touch panel. This function should be called after the initialization of the LCD and touch panel.
|
|
*
|
|
* @param lcd The pointer to the LCD panel device, mustn't be nullptr
|
|
* @param tp The pointer to the touch panel device, set to nullptr if is not used
|
|
*
|
|
* @return true if success, otherwise false
|
|
*/
|
|
bool lvgl_port_init(esp_panel::drivers::LCD *lcd, esp_panel::drivers::Touch *tp);
|
|
|
|
/**
|
|
* @brief Deinitialize the LVGL porting.
|
|
*
|
|
* @return true if success, otherwise false
|
|
*/
|
|
bool lvgl_port_deinit(void);
|
|
|
|
/**
|
|
* @brief Lock the LVGL mutex. This function should be called before calling any LVGL APIs when not in LVGL task,
|
|
* and the `lvgl_port_unlock()` function should be called later.
|
|
*
|
|
* @param timeout_ms The timeout of the mutex lock, in milliseconds. If the timeout is set to `-1`, it will wait indefinitely.
|
|
*
|
|
* @return true if success, otherwise false
|
|
*/
|
|
bool lvgl_port_lock(int timeout_ms);
|
|
|
|
/**
|
|
* @brief Unlock the LVGL mutex. This function should be called after using LVGL APIs when not in LVGL task, and the
|
|
* `lvgl_port_lock()` function should be called before.
|
|
*
|
|
* @return true if success, otherwise false
|
|
*/
|
|
bool lvgl_port_unlock(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|