feat: support ESP32-S3 new board bring-up
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Direct ST7789 LCD backend.
|
||||
* Direct ST7789P3 LCD backend.
|
||||
*
|
||||
* This backend owns the low-level panel initialization, a serialized render
|
||||
* loop, and a minimal presentation queue.
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "driver/gpio.h"
|
||||
#include "driver/spi_master.h"
|
||||
#include "esp_attr.h"
|
||||
#include "esp_check.h"
|
||||
#include "esp_lcd_panel_io.h"
|
||||
#include "esp_lcd_panel_ops.h"
|
||||
@@ -29,11 +30,19 @@
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#define LCD_DIRECT_SPI_HOST SPI2_HOST
|
||||
#define LCD_DIRECT_WIDTH 320U
|
||||
#define LCD_DIRECT_HEIGHT 240U
|
||||
#define LCD_DIRECT_NATIVE_WIDTH 240U
|
||||
#define LCD_DIRECT_NATIVE_HEIGHT 320U
|
||||
#if CONFIG_TQ_SCREEN_SWAP_XY
|
||||
#define LCD_DIRECT_WIDTH LCD_DIRECT_NATIVE_HEIGHT
|
||||
#define LCD_DIRECT_HEIGHT LCD_DIRECT_NATIVE_WIDTH
|
||||
#else
|
||||
#define LCD_DIRECT_WIDTH LCD_DIRECT_NATIVE_WIDTH
|
||||
#define LCD_DIRECT_HEIGHT LCD_DIRECT_NATIVE_HEIGHT
|
||||
#endif
|
||||
#define LCD_DIRECT_ROWS_PER_TRANSFER 8U
|
||||
#define LCD_DIRECT_PIXELS_PER_TRANSFER (LCD_DIRECT_WIDTH * LCD_DIRECT_ROWS_PER_TRANSFER)
|
||||
#define LCD_DIRECT_PRESENTATION_WAIT_POLL_MS 20U
|
||||
#define LCD_DIRECT_TRANSFER_TIMEOUT_MS 100U
|
||||
|
||||
#define LCD_CMD_MADCTL 0x36
|
||||
#define LCD_CMD_RAMCTRL 0xB0
|
||||
@@ -88,6 +97,7 @@ static esp_lcd_panel_io_handle_t s_panel_io;
|
||||
static esp_lcd_panel_handle_t s_panel;
|
||||
static SemaphoreHandle_t s_lock;
|
||||
static SemaphoreHandle_t s_completion_sem;
|
||||
static SemaphoreHandle_t s_transfer_done_sem;
|
||||
static TaskHandle_t s_render_task;
|
||||
static bool s_initialized;
|
||||
static bool s_render_loop_running;
|
||||
@@ -101,6 +111,21 @@ static lcd_direct_rle_run_t s_rle_file_chunk[128];
|
||||
|
||||
static void lcd_direct_signal_completion(void);
|
||||
|
||||
static bool IRAM_ATTR lcd_direct_on_color_trans_done(esp_lcd_panel_io_handle_t panel_io,
|
||||
esp_lcd_panel_io_event_data_t *event_data,
|
||||
void *user_ctx)
|
||||
{
|
||||
(void)panel_io;
|
||||
(void)event_data;
|
||||
(void)user_ctx;
|
||||
|
||||
BaseType_t higher_priority_task_woken = pdFALSE;
|
||||
if (s_transfer_done_sem != NULL) {
|
||||
(void)xSemaphoreGiveFromISR(s_transfer_done_sem, &higher_priority_task_woken);
|
||||
}
|
||||
return higher_priority_task_woken == pdTRUE;
|
||||
}
|
||||
|
||||
static uint16_t lcd_direct_swap_color(uint16_t color)
|
||||
{
|
||||
#if CONFIG_TQ_SCREEN_SWAP_COLOR_BYTES
|
||||
@@ -113,12 +138,26 @@ static uint16_t lcd_direct_swap_color(uint16_t color)
|
||||
static esp_err_t lcd_direct_draw_rows(uint16_t row_start, uint16_t row_count)
|
||||
{
|
||||
ESP_RETURN_ON_FALSE(s_panel != NULL, ESP_ERR_INVALID_STATE, TAG, "panel is not ready");
|
||||
return esp_lcd_panel_draw_bitmap(s_panel,
|
||||
0,
|
||||
row_start,
|
||||
LCD_DIRECT_WIDTH,
|
||||
row_start + row_count,
|
||||
s_line_buffer);
|
||||
ESP_RETURN_ON_FALSE(s_transfer_done_sem != NULL,
|
||||
ESP_ERR_INVALID_STATE,
|
||||
TAG,
|
||||
"transfer semaphore is not ready");
|
||||
|
||||
(void)xSemaphoreTake(s_transfer_done_sem, 0);
|
||||
ESP_RETURN_ON_ERROR(esp_lcd_panel_draw_bitmap(s_panel,
|
||||
0,
|
||||
row_start,
|
||||
LCD_DIRECT_WIDTH,
|
||||
row_start + row_count,
|
||||
s_line_buffer),
|
||||
TAG,
|
||||
"panel draw failed");
|
||||
ESP_RETURN_ON_FALSE(xSemaphoreTake(s_transfer_done_sem,
|
||||
pdMS_TO_TICKS(LCD_DIRECT_TRANSFER_TIMEOUT_MS)) == pdTRUE,
|
||||
ESP_ERR_TIMEOUT,
|
||||
TAG,
|
||||
"panel transfer timed out");
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static esp_err_t lcd_direct_gpio_init(void)
|
||||
@@ -168,7 +207,8 @@ static esp_err_t lcd_direct_panel_init(void)
|
||||
.lcd_cmd_bits = 8,
|
||||
.lcd_param_bits = 8,
|
||||
.spi_mode = 0,
|
||||
.trans_queue_depth = 10,
|
||||
.trans_queue_depth = 1,
|
||||
.on_color_trans_done = lcd_direct_on_color_trans_done,
|
||||
};
|
||||
ESP_RETURN_ON_ERROR(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_DIRECT_SPI_HOST,
|
||||
&io_config,
|
||||
@@ -871,13 +911,22 @@ esp_err_t lcd_direct_init_device(void)
|
||||
ESP_RETURN_ON_FALSE(s_lock != NULL, ESP_ERR_NO_MEM, TAG, "lock create failed");
|
||||
s_completion_sem = xSemaphoreCreateBinary();
|
||||
ESP_RETURN_ON_FALSE(s_completion_sem != NULL, ESP_ERR_NO_MEM, TAG, "completion sem create failed");
|
||||
s_transfer_done_sem = xSemaphoreCreateBinary();
|
||||
ESP_RETURN_ON_FALSE(s_transfer_done_sem != NULL,
|
||||
ESP_ERR_NO_MEM,
|
||||
TAG,
|
||||
"transfer sem create failed");
|
||||
|
||||
ESP_RETURN_ON_ERROR(lcd_direct_gpio_init(), TAG, "gpio init failed");
|
||||
ESP_RETURN_ON_ERROR(lcd_direct_panel_init(), TAG, "esp_lcd panel init failed");
|
||||
|
||||
s_initialized = true;
|
||||
ESP_LOGI(TAG,
|
||||
"Direct LCD initialized (MOSI=%d SCLK=%d CS=%d DC=%d RST=%d BL=%d clock=%d)",
|
||||
"Direct ST7789P3 LCD initialized (native=%ux%u logical=%ux%u MOSI=%d SCLK=%d CS=%d DC=%d RST=%d BL=%d clock=%d)",
|
||||
(unsigned)LCD_DIRECT_NATIVE_WIDTH,
|
||||
(unsigned)LCD_DIRECT_NATIVE_HEIGHT,
|
||||
(unsigned)LCD_DIRECT_WIDTH,
|
||||
(unsigned)LCD_DIRECT_HEIGHT,
|
||||
CONFIG_TQ_SCREEN_SPI_MOSI_GPIO,
|
||||
CONFIG_TQ_SCREEN_SPI_CLK_GPIO,
|
||||
CONFIG_TQ_SCREEN_SPI_CS_GPIO,
|
||||
|
||||
Reference in New Issue
Block a user