From a17a77b923a0fdd2e14711a5b2177b1873f43e91 Mon Sep 17 00:00:00 2001 From: Rajssss Date: Sun, 20 Jun 2021 20:20:27 +0530 Subject: [PATCH 1/3] st7735s: Added brightness control though LED pin -> Uses LED(Backlight) Pin as PWM to control the brightness Signed-off-by: Rajssss --- lvgl_tft/st7735s.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ lvgl_tft/st7735s.h | 3 +++ 2 files changed, 49 insertions(+) diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index 2507118..c8d1f7a 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -10,6 +10,7 @@ #include "disp_spi.h" #include "driver/i2c.h" #include "driver/gpio.h" +#include "driver/ledc.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -172,6 +173,51 @@ void st7735s_sleep_out() st7735s_send_cmd(0x11); } +void st7735s_brightness_control_enable(void) +{ + /* + Configure LED (Backlight) pin as PWM for Brightness control. + */ + ledc_channel_config_t LCD_backlight_channel = { + .gpio_num = ST7735S_BCKL, + .speed_mode = LEDC_LOW_SPEED_MODE, + .channel = LEDC_CHANNEL_0, + .intr_type = LEDC_INTR_DISABLE, + .timer_sel = LEDC_TIMER_0, + .duty = 0, + .hpoint = 0, + .flags.output_invert = 0 + }; + ledc_timer_config_t LCD_backlight_timer = { + .speed_mode = LEDC_LOW_SPEED_MODE, + .bit_num = LEDC_TIMER_10_BIT, + .timer_num = LEDC_TIMER_0, + .freq_hz = 5000, + .clk_cfg = LEDC_AUTO_CLK + }; + + ESP_ERROR_CHECK( ledc_timer_config(&LCD_backlight_timer) ); + ESP_ERROR_CHECK( ledc_channel_config(&LCD_backlight_channel) ); + +} + +void st7735s_set_brightness(uint16_t brightness) +{ + /* + Set brightness. + 0 -> Display off + 100 -> Full brightness + NOTE: brightness value must be between 0 - 100 + */ + if(brightness > 100) + { + ESP_LOGE(TAG, "Brightness value must be between 0 - 100"); + return; + } + ESP_ERROR_CHECK( ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, brightness*10) ); + ESP_ERROR_CHECK( ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0) ); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/lvgl_tft/st7735s.h b/lvgl_tft/st7735s.h index 71924bf..0f1b4c3 100644 --- a/lvgl_tft/st7735s.h +++ b/lvgl_tft/st7735s.h @@ -26,6 +26,7 @@ extern "C" { #define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) #define ST7735S_DC CONFIG_LV_DISP_PIN_DC +#define ST7735S_BCKL CONFIG_LV_DISP_PIN_BCKL #define ST7735S_RST CONFIG_LV_DISP_PIN_RST #define ST7735S_USE_RST CONFIG_LV_DISP_USE_RST @@ -137,6 +138,8 @@ void st7735s_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col void st7735s_enable_backlight(bool backlight); void st7735s_sleep_in(void); void st7735s_sleep_out(void); +void st7735s_brightness_control_enable(void); +void st7735s_set_brightness(uint16_t brightness); /********************** * MACROS From 5d4334a5b9eaca15b7f9deaa0b734b23ba9ca811 Mon Sep 17 00:00:00 2001 From: Rajssss Date: Sat, 26 Jun 2021 12:10:41 +0530 Subject: [PATCH 2/3] Created separate component for backlight control -> Uses Timer 0, Channel 0 as PWM to control backlight via LED pin Signed-off-by: Rajssss --- CMakeLists.txt | 2 +- lvgl_helpers.h | 1 + lvgl_tft/esp_lcd_backlight.c | 58 ++++++++++++++++++++++++++++++++++++ lvgl_tft/esp_lcd_backlight.h | 36 ++++++++++++++++++++++ lvgl_tft/st7735s.c | 46 ---------------------------- lvgl_tft/st7735s.h | 3 -- 6 files changed, 96 insertions(+), 50 deletions(-) create mode 100644 lvgl_tft/esp_lcd_backlight.c create mode 100644 lvgl_tft/esp_lcd_backlight.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5832233..0165b1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ if(ESP_PLATFORM) file(GLOB SOURCES *.c) set(LVGL_INCLUDE_DIRS . lvgl_tft) -list(APPEND SOURCES "lvgl_tft/disp_driver.c") +list(APPEND SOURCES "lvgl_tft/disp_driver.c" "lvgl_tft/esp_lcd_backlight.c") #@todo add SimleInclude macro here diff --git a/lvgl_helpers.h b/lvgl_helpers.h index 081a843..cfa45b5 100644 --- a/lvgl_helpers.h +++ b/lvgl_helpers.h @@ -16,6 +16,7 @@ extern "C" { #include "lvgl_spi_conf.h" #include "lvgl_tft/disp_driver.h" +#include "lvgl_tft/esp_lcd_backlight.h" #include "lvgl_touch/touch_driver.h" /********************* diff --git a/lvgl_tft/esp_lcd_backlight.c b/lvgl_tft/esp_lcd_backlight.c new file mode 100644 index 0000000..e4bf930 --- /dev/null +++ b/lvgl_tft/esp_lcd_backlight.c @@ -0,0 +1,58 @@ +/** + * @file esp_lcd_backlight.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "esp_lcd_backlight.h" +#include "driver/ledc.h" +#include "esp_log.h" + +static const char *TAG = "disp_brightness"; + +void disp_brightness_control_enable(void) +{ + /* + Configure LED (Backlight) pin as PWM for Brightness control. + */ + ledc_channel_config_t LCD_backlight_channel = { + .gpio_num = DISP_PIN_BCKL, + .speed_mode = LEDC_LOW_SPEED_MODE, + .channel = LEDC_CHANNEL_0, + .intr_type = LEDC_INTR_DISABLE, + .timer_sel = LEDC_TIMER_0, + .duty = 0, + .hpoint = 0, + .flags.output_invert = 0 + }; + ledc_timer_config_t LCD_backlight_timer = { + .speed_mode = LEDC_LOW_SPEED_MODE, + .bit_num = LEDC_TIMER_10_BIT, + .timer_num = LEDC_TIMER_0, + .freq_hz = 5000, + .clk_cfg = LEDC_AUTO_CLK + }; + + ESP_ERROR_CHECK( ledc_timer_config(&LCD_backlight_timer) ); + ESP_ERROR_CHECK( ledc_channel_config(&LCD_backlight_channel) ); + +} + +void disp_set_brightness(uint16_t brightness) +{ + /* + Set brightness. + 0 -> Display off + 100 -> Full brightness + NOTE: brightness value must be between 0 - 100 + */ + if(brightness > 100) + { + ESP_LOGE(TAG, "Brightness value must be between 0 - 100"); + return; + } + ESP_ERROR_CHECK( ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, brightness*10) ); + ESP_ERROR_CHECK( ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0) ); +} diff --git a/lvgl_tft/esp_lcd_backlight.h b/lvgl_tft/esp_lcd_backlight.h new file mode 100644 index 0000000..9f4eba9 --- /dev/null +++ b/lvgl_tft/esp_lcd_backlight.h @@ -0,0 +1,36 @@ +/** + * @file esp_lcd_backlight.h + */ + +#ifndef ESP_LCD_BACKLIGHT_H +#define ESP_LCD_BACKLIGHT_H + +/********************* + * INCLUDES + *********************/ +#include +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + + +/********************* + * DEFINES + *********************/ +#define DISP_PIN_BCKL CONFIG_LV_DISP_PIN_BCKL + + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void disp_brightness_control_enable(void); +void disp_set_brightness(uint16_t brightness); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*ESP_LCD_BACKLIGHT_H*/ \ No newline at end of file diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index c8d1f7a..2507118 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -10,7 +10,6 @@ #include "disp_spi.h" #include "driver/i2c.h" #include "driver/gpio.h" -#include "driver/ledc.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -173,51 +172,6 @@ void st7735s_sleep_out() st7735s_send_cmd(0x11); } -void st7735s_brightness_control_enable(void) -{ - /* - Configure LED (Backlight) pin as PWM for Brightness control. - */ - ledc_channel_config_t LCD_backlight_channel = { - .gpio_num = ST7735S_BCKL, - .speed_mode = LEDC_LOW_SPEED_MODE, - .channel = LEDC_CHANNEL_0, - .intr_type = LEDC_INTR_DISABLE, - .timer_sel = LEDC_TIMER_0, - .duty = 0, - .hpoint = 0, - .flags.output_invert = 0 - }; - ledc_timer_config_t LCD_backlight_timer = { - .speed_mode = LEDC_LOW_SPEED_MODE, - .bit_num = LEDC_TIMER_10_BIT, - .timer_num = LEDC_TIMER_0, - .freq_hz = 5000, - .clk_cfg = LEDC_AUTO_CLK - }; - - ESP_ERROR_CHECK( ledc_timer_config(&LCD_backlight_timer) ); - ESP_ERROR_CHECK( ledc_channel_config(&LCD_backlight_channel) ); - -} - -void st7735s_set_brightness(uint16_t brightness) -{ - /* - Set brightness. - 0 -> Display off - 100 -> Full brightness - NOTE: brightness value must be between 0 - 100 - */ - if(brightness > 100) - { - ESP_LOGE(TAG, "Brightness value must be between 0 - 100"); - return; - } - ESP_ERROR_CHECK( ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, brightness*10) ); - ESP_ERROR_CHECK( ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0) ); -} - /********************** * STATIC FUNCTIONS **********************/ diff --git a/lvgl_tft/st7735s.h b/lvgl_tft/st7735s.h index 0f1b4c3..71924bf 100644 --- a/lvgl_tft/st7735s.h +++ b/lvgl_tft/st7735s.h @@ -26,7 +26,6 @@ extern "C" { #define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) #define ST7735S_DC CONFIG_LV_DISP_PIN_DC -#define ST7735S_BCKL CONFIG_LV_DISP_PIN_BCKL #define ST7735S_RST CONFIG_LV_DISP_PIN_RST #define ST7735S_USE_RST CONFIG_LV_DISP_USE_RST @@ -138,8 +137,6 @@ void st7735s_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col void st7735s_enable_backlight(bool backlight); void st7735s_sleep_in(void); void st7735s_sleep_out(void); -void st7735s_brightness_control_enable(void); -void st7735s_set_brightness(uint16_t brightness); /********************** * MACROS From 35a005a47c324c9d4896515663507e54b2ad9720 Mon Sep 17 00:00:00 2001 From: Rajssss Date: Sat, 26 Jun 2021 13:30:26 +0530 Subject: [PATCH 3/3] esp_lcd_backlight: do not build if not enabled Signed-off-by: Rajssss --- CMakeLists.txt | 7 ++++++- lvgl_tft/esp_lcd_backlight.h | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0165b1a..730a38e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ if(ESP_PLATFORM) file(GLOB SOURCES *.c) set(LVGL_INCLUDE_DIRS . lvgl_tft) -list(APPEND SOURCES "lvgl_tft/disp_driver.c" "lvgl_tft/esp_lcd_backlight.c") +list(APPEND SOURCES "lvgl_tft/disp_driver.c") #@todo add SimleInclude macro here @@ -79,6 +79,11 @@ if(CONFIG_LV_TOUCH_CONTROLLER) endif() endif() +# Add backlight control to compilation only if it is selected in menuconfig +if(CONFIG_LV_ENABLE_BACKLIGHT_CONTROL) + list(APPEND SOURCES "lvgl_tft/esp_lcd_backlight.c") +endif() + idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS ${LVGL_INCLUDE_DIRS} REQUIRES lvgl) diff --git a/lvgl_tft/esp_lcd_backlight.h b/lvgl_tft/esp_lcd_backlight.h index 9f4eba9..b22bf9d 100644 --- a/lvgl_tft/esp_lcd_backlight.h +++ b/lvgl_tft/esp_lcd_backlight.h @@ -19,8 +19,9 @@ /********************* * DEFINES *********************/ +#if CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define DISP_PIN_BCKL CONFIG_LV_DISP_PIN_BCKL - +#endif /********************** * GLOBAL PROTOTYPES