fix(platform): prevent LCD artifacts during startup

This commit is contained in:
chenjintao
2026-09-01 14:20:45 +08:00
parent b498873294
commit 3912843869
+32 -4
View File
@@ -523,7 +523,7 @@ static uint32_t lcd_direct_backlight_duty(uint8_t brightness_percent)
return duty;
}
static esp_err_t lcd_direct_backlight_init(void)
static esp_err_t lcd_direct_backlight_init(uint8_t initial_brightness_percent)
{
const ledc_timer_config_t timer_config = {
.speed_mode = LEDC_LOW_SPEED_MODE,
@@ -540,7 +540,7 @@ static esp_err_t lcd_direct_backlight_init(void)
.channel = LCD_DIRECT_BACKLIGHT_PWM_CHANNEL,
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = LCD_DIRECT_BACKLIGHT_PWM_TIMER,
.duty = lcd_direct_backlight_duty(CONFIG_TQ_SCREEN_BACKLIGHT_BRIGHTNESS_PERCENT),
.duty = lcd_direct_backlight_duty(initial_brightness_percent),
.hpoint = 0,
};
ESP_RETURN_ON_ERROR(ledc_channel_config(&channel_config), TAG, "backlight PWM channel config failed");
@@ -549,7 +549,7 @@ static esp_err_t lcd_direct_backlight_init(void)
"Backlight PWM initialized gpio=%d frequency=%uHz brightness=%d%% active_high=%d",
CONFIG_TQ_SCREEN_BACKLIGHT_GPIO,
(unsigned)LCD_DIRECT_BACKLIGHT_PWM_FREQUENCY_HZ,
CONFIG_TQ_SCREEN_BACKLIGHT_BRIGHTNESS_PERCENT,
initial_brightness_percent,
CONFIG_TQ_SCREEN_BACKLIGHT_ACTIVE_HIGH ? 1 : 0);
return ESP_OK;
}
@@ -574,7 +574,7 @@ static esp_err_t lcd_direct_gpio_init(void)
if (CONFIG_TQ_SCREEN_RESET_PIN >= 0) {
gpio_set_level(CONFIG_TQ_SCREEN_RESET_PIN, 1);
}
return lcd_direct_backlight_init();
return lcd_direct_backlight_init(0U);
}
static esp_err_t lcd_direct_panel_init(void)
@@ -671,6 +671,22 @@ static esp_err_t lcd_direct_panel_init(void)
return ESP_OK;
}
static esp_err_t lcd_direct_clear_panel(void)
{
memset(s_line_buffer, 0, sizeof(s_line_buffer));
for (uint16_t row_start = 0; row_start < LCD_DIRECT_HEIGHT;
row_start += LCD_DIRECT_ROWS_PER_TRANSFER) {
uint16_t row_count = LCD_DIRECT_HEIGHT - row_start;
if (row_count > LCD_DIRECT_ROWS_PER_TRANSFER) {
row_count = LCD_DIRECT_ROWS_PER_TRANSFER;
}
ESP_RETURN_ON_ERROR(lcd_direct_draw_rows(row_start, row_count),
TAG,
"initial panel clear failed");
}
return ESP_OK;
}
static uint16_t lcd_direct_color_for_row(uint16_t row, const lcd_direct_request_t *request)
{
uint16_t band = row / 40U;
@@ -1633,6 +1649,18 @@ esp_err_t lcd_direct_init_device(void)
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");
ESP_RETURN_ON_ERROR(lcd_direct_clear_panel(), TAG, "panel clear failed");
ESP_RETURN_ON_ERROR(ledc_set_duty(LEDC_LOW_SPEED_MODE,
LCD_DIRECT_BACKLIGHT_PWM_CHANNEL,
lcd_direct_backlight_duty(
CONFIG_TQ_SCREEN_BACKLIGHT_BRIGHTNESS_PERCENT)),
TAG,
"backlight brightness set failed");
ESP_RETURN_ON_ERROR(ledc_update_duty(LEDC_LOW_SPEED_MODE,
LCD_DIRECT_BACKLIGHT_PWM_CHANNEL),
TAG,
"backlight brightness update failed");
s_initialized = true;
ESP_LOGI(TAG,