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; 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 = { const ledc_timer_config_t timer_config = {
.speed_mode = LEDC_LOW_SPEED_MODE, .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, .channel = LCD_DIRECT_BACKLIGHT_PWM_CHANNEL,
.intr_type = LEDC_INTR_DISABLE, .intr_type = LEDC_INTR_DISABLE,
.timer_sel = LCD_DIRECT_BACKLIGHT_PWM_TIMER, .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, .hpoint = 0,
}; };
ESP_RETURN_ON_ERROR(ledc_channel_config(&channel_config), TAG, "backlight PWM channel config failed"); 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", "Backlight PWM initialized gpio=%d frequency=%uHz brightness=%d%% active_high=%d",
CONFIG_TQ_SCREEN_BACKLIGHT_GPIO, CONFIG_TQ_SCREEN_BACKLIGHT_GPIO,
(unsigned)LCD_DIRECT_BACKLIGHT_PWM_FREQUENCY_HZ, (unsigned)LCD_DIRECT_BACKLIGHT_PWM_FREQUENCY_HZ,
CONFIG_TQ_SCREEN_BACKLIGHT_BRIGHTNESS_PERCENT, initial_brightness_percent,
CONFIG_TQ_SCREEN_BACKLIGHT_ACTIVE_HIGH ? 1 : 0); CONFIG_TQ_SCREEN_BACKLIGHT_ACTIVE_HIGH ? 1 : 0);
return ESP_OK; return ESP_OK;
} }
@@ -574,7 +574,7 @@ static esp_err_t lcd_direct_gpio_init(void)
if (CONFIG_TQ_SCREEN_RESET_PIN >= 0) { if (CONFIG_TQ_SCREEN_RESET_PIN >= 0) {
gpio_set_level(CONFIG_TQ_SCREEN_RESET_PIN, 1); 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) 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; 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) static uint16_t lcd_direct_color_for_row(uint16_t row, const lcd_direct_request_t *request)
{ {
uint16_t band = row / 40U; 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_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_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; s_initialized = true;
ESP_LOGI(TAG, ESP_LOGI(TAG,