diff --git a/components/esp_lcd/include/esp_lcd_panel_ops.h b/components/esp_lcd/include/esp_lcd_panel_ops.h index b2d45b021fd..70561f21357 100644 --- a/components/esp_lcd/include/esp_lcd_panel_ops.h +++ b/components/esp_lcd/include/esp_lcd_panel_ops.h @@ -157,6 +157,17 @@ esp_err_t esp_lcd_panel_disp_on_off(esp_lcd_panel_handle_t panel, bool on_off); */ esp_err_t esp_lcd_panel_disp_sleep(esp_lcd_panel_handle_t panel, bool sleep); +/** + * @brief Set the brightness of the display + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] brightness Brightness value (range depends on panel implementation, typically 0-255, 0-1023, or 0-100) + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ +esp_err_t esp_lcd_panel_set_brightness(esp_lcd_panel_handle_t panel, int brightness); + #ifdef __cplusplus } #endif diff --git a/components/esp_lcd/interface/esp_lcd_panel_interface.h b/components/esp_lcd/interface/esp_lcd_panel_interface.h index 208633109e8..7814694c72b 100644 --- a/components/esp_lcd/interface/esp_lcd_panel_interface.h +++ b/components/esp_lcd/interface/esp_lcd_panel_interface.h @@ -152,6 +152,17 @@ struct esp_lcd_panel_t { */ esp_err_t (*disp_sleep)(esp_lcd_panel_t *panel, bool sleep); + /** + * @brief Set the brightness of the display + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] brightness Brightness value (range depends on panel implementation, typically 0-255, 0-1023, or 0-100) + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ + esp_err_t (*set_brightness)(esp_lcd_panel_t *panel, int brightness); + void *user_data; /*!< User data, used to store externally customized data */ }; diff --git a/components/esp_lcd/src/esp_lcd_panel_ops.c b/components/esp_lcd/src/esp_lcd_panel_ops.c index bf1b823e67d..3f3fff1624e 100644 --- a/components/esp_lcd/src/esp_lcd_panel_ops.c +++ b/components/esp_lcd/src/esp_lcd_panel_ops.c @@ -88,3 +88,10 @@ esp_err_t esp_lcd_panel_disp_sleep(esp_lcd_panel_handle_t panel, bool sleep) ESP_RETURN_ON_FALSE(panel->disp_sleep, ESP_ERR_NOT_SUPPORTED, TAG, "sleep is not supported by this panel"); return panel->disp_sleep(panel, sleep); } + +esp_err_t esp_lcd_panel_set_brightness(esp_lcd_panel_handle_t panel, int brightness) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + ESP_RETURN_ON_FALSE(panel->set_brightness, ESP_ERR_NOT_SUPPORTED, TAG, "set_brightness is not supported by this panel"); + return panel->set_brightness(panel, brightness); +} diff --git a/components/esp_lcd/src/esp_lcd_panel_st7789.c b/components/esp_lcd/src/esp_lcd_panel_st7789.c index 90eb3ec1a3c..635bec47246 100644 --- a/components/esp_lcd/src/esp_lcd_panel_st7789.c +++ b/components/esp_lcd/src/esp_lcd_panel_st7789.c @@ -40,6 +40,7 @@ static esp_err_t panel_st7789_invert_color(esp_lcd_panel_t *panel, bool invert_c static esp_err_t panel_st7789_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y); static esp_err_t panel_st7789_swap_xy(esp_lcd_panel_t *panel, bool swap_axes); static esp_err_t panel_st7789_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap); +static esp_err_t panel_st7789_set_brightness(esp_lcd_panel_t *panel, int brightness); static esp_err_t panel_st7789_disp_on_off(esp_lcd_panel_t *panel, bool off); static esp_err_t panel_st7789_sleep(esp_lcd_panel_t *panel, bool sleep); @@ -125,6 +126,7 @@ esp_lcd_new_panel_st7789(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel st7789->base.draw_bitmap = panel_st7789_draw_bitmap; st7789->base.invert_color = panel_st7789_invert_color; st7789->base.set_gap = panel_st7789_set_gap; + st7789->base.set_brightness = panel_st7789_set_brightness; st7789->base.mirror = panel_st7789_mirror; st7789->base.swap_xy = panel_st7789_swap_xy; st7789->base.disp_on_off = panel_st7789_disp_on_off; @@ -287,6 +289,18 @@ static esp_err_t panel_st7789_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_g return ESP_OK; } +static esp_err_t panel_st7789_set_brightness(esp_lcd_panel_t *panel, int brightness) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + esp_lcd_panel_io_handle_t io = st7789->io; + ESP_RETURN_ON_FALSE(brightness >= 0 && brightness <= 0xFF, ESP_ERR_INVALID_ARG, TAG, + "brightness out of range"); + uint8_t brightness_value = (uint8_t)brightness; + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_WRDISBV, &brightness_value, 1), TAG, + "io tx param failed"); + return ESP_OK; +} + static esp_err_t panel_st7789_disp_on_off(esp_lcd_panel_t *panel, bool on_off) { st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base);