feat: support ESP32-S3 new board bring-up

This commit is contained in:
2026-08-03 14:06:06 +08:00
parent 404389f1ea
commit d5409ea4e3
16 changed files with 297 additions and 150 deletions
+60 -11
View File
@@ -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,