diff --git a/.gitignore b/.gitignore index 38eeab7..3c4910f 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,7 @@ dkms.conf # ESP-IDF build dir build + +# Kconfig files +sdkconfig +sdkconfig.old \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 028726b..a842e93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,8 +3,7 @@ if(ESP_PLATFORM) file(GLOB SOURCES *.c) set(LVGL_INCLUDE_DIRS . lvgl_tft lvgl_touch/L58/include) list(APPEND SOURCES "lvgl_tft/disp_driver.c") - -#@todo add SimleInclude macro here +list(APPEND SOURCES "lvgl_tft/esp_lcd_backlight.c") # Include only the source file of the selected # display controller. @@ -45,6 +44,8 @@ elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01) list(APPEND SOURCES "lvgl_tft/GC9A01.c") elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C) list(APPEND SOURCES "lvgl_tft/ili9163c.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544) + list(APPEND SOURCES "lvgl_tft/pcd8544.c") else() message(WARNING "LVGL ESP32 drivers: Display controller not defined.") endif() @@ -81,15 +82,17 @@ if(CONFIG_LV_TOUCH_CONTROLLER) if(CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) list(APPEND SOURCES "lvgl_touch/tp_spi.c") - elseif(CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) - list(APPEND SOURCES "lvgl_touch/tp_i2c.c") endif() endif() +if(CONFIG_LV_I2C) + list(APPEND SOURCES "lvgl_i2c/i2c_manager.c") +endif() + idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS ${LVGL_INCLUDE_DIRS} REQUIRES lvgl) - + target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_LVGL_H_INCLUDE_SIMPLE") else() diff --git a/Kconfig b/Kconfig index ae11925..36b4526 100644 --- a/Kconfig +++ b/Kconfig @@ -1,2 +1,14 @@ -rsource "lvgl_tft/Kconfig" -rsource "lvgl_touch/Kconfig" +menu "LVGL ESP Drivers" + + rsource "lvgl_tft/Kconfig" + + rsource "lvgl_touch/Kconfig" + +endmenu + +menu "I2C Port Settings" + depends on LV_I2C && !HAVE_I2C_MANAGER + + rsource "lvgl_i2c/Kconfig" + +endmenu diff --git a/README.md b/README.md index 7f4abad..11a8ce0 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ For a ready to use ESP32 project take look at the [lv_port_esp32](https://github - [Supported display controllers](#supported-display-controllers) - [Supported indev controllers](#supported-indev-controllers) - [Support for predefined development kits](#support-for-predefined-development-kits) +- [Thread-safe I2C with I2C Manager](#thread-safe-i2c-with-i2c-manager) +- [Backlight control](#backlight-control) **NOTE:** You need to set the display horizontal and vertical size, color depth and swap of RGB565 color on the LVGL configuration menuconfig (it's not handled automatically). @@ -28,6 +30,7 @@ swap of RGB565 color on the LVGL configuration menuconfig (it's not handled auto | RA8875 | TFT | SPI | 16: RGB565 | Yes | | SH1107 | Monochrome | SPI | 1: 1byte per pixel | No | | SSD1306 | Monochrome | I2C | 1: 1byte per pixel | No | +| PCD8544 | Monochrome | SPI | 1: 1byte per pixel | No | | IL3820 | e-Paper | SPI | 1: 1byte per pixel | No | | UC8151D/ GoodDisplay GDEW0154M10 DES | e-Paper | SPI | 1: 1byte per pixel | No | | FitiPower JD79653A/ GoodDisplay GDEW0154M09 | e-Paper | SPI | 1: 1byte per pixel | No | @@ -41,8 +44,8 @@ To use an EPDiy supported epaper you need to add it [as a component using git su ## Supported indev controllers - XPT2046 -- FT3236 -- other FT6X36 or the FT6206 controllers should work as well (not tested) +- FT3236, FT6X36 +- FT6206 controllers should work as well (not tested) - STMPE610 - FT81x (Single, Dual, and Quad SPI) - L58 touch component hook (Used in Lilygo EPD47 parallel with EPDiy driver) @@ -59,7 +62,7 @@ and sets the gpio numbers for the interface. |---------------------------|-----------------------|-----------|-----------|-----------| | ESP Wrover Kit v4.1 | ILI9341 | SPI | 240 | 320 | | M5Stack | ILI9341 | SPI | 240 | 320 | -| M5Core2 | ILI9341 | SPI | 240 | 320 | +| M5Stack Core2 | ILI9341 | SPI | 240 | 320 | | M5Stick | SH1107 | SPI | - | - | | M5StickC | ST7735S | SPI | 80 | 160 | | Adafruit 3.5 Featherwing | HX8357 | SPI | 480 | 320 | @@ -72,3 +75,27 @@ and sets the gpio numbers for the interface. **NOTE:** See [Supported display controllers](#supported-display-controllers) for more information on display configuration. **NOTE:** See [Supported indev controllers](#supported-indev-controllers) for more information about indev configuration. + + +## Thread-safe I2C with I2C Manager + +LVGL can use I2C to read from a touch sensor or write to a display, possibly +many times a second. Meanwhile, other tasks may also want to read from i2c +devices on the same bus. I2C using the ESP-IDF is not thread-safe. + +I2C Manager (`i2c_manager`) is a component that will let code in multiple threads +talk to devices on the I2C ports without getting in each other's way. These drivers +use a built-in copy of I2C Manager to talk to the I2C port, but you can also use +the I2C Manager component itself and have others play nice with LVGL and vice-versa. +[Click here](i2c_manager/README.md) for details. + + +## Backlight control + +Control of LCD's backlight is provided by separate module that is independent from the display driver. +Configuration of the backlight controller can be found in menuconfig `LVGL ESP Drivers -> LVGL TFT Display controller`. + +There are three modes of operation: +1. Off - No backlight control +2. Switch - Allows ON/OFF control +3. PWM - Allows brightness control (by Pulse-Width-Modulated signal) diff --git a/component.mk b/component.mk index dbd1105..0017d0b 100644 --- a/component.mk +++ b/component.mk @@ -1,7 +1,7 @@ # LVGL ESP32 drivers # Define sources and include dirs -COMPONENT_SRCDIRS := . lvgl_tft lvgl_touch +COMPONENT_SRCDIRS := . lvgl_tft lvgl_touch lvgl_i2c COMPONENT_ADD_INCLUDEDIRS := . # LVGL is supposed to be used as a ESP-IDF component @@ -44,4 +44,6 @@ $(call compile_only_if,$(and $(CONFIG_LV_TOUCH_CONTROLLER),$(CONFIG_LV_TOUCH_CON $(call compile_only_if,$(and $(CONFIG_LV_TOUCH_CONTROLLER),$(CONFIG_LV_TOUCH_CONTROLLER_RA8875)), lvgl_touch/ra8875_touch.o) $(call compile_only_if,$(and $(CONFIG_LV_TOUCH_CONTROLLER),$(CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI)), lvgl_touch/tp_spi.o) -$(call compile_only_if,$(and $(CONFIG_LV_TOUCH_CONTROLLER),$(CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C)), lvgl_touch/tp_i2c.o) + +# I2C Manager +$(call compile_only_if,$(CONFIG_LV_I2C), lvgl_i2c/i2c_manager.o) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index 440bb1d..1478059 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -114,6 +114,8 @@ void lvgl_driver_init(void) ESP_LOGI(TAG, "Initializing Parallel driver for display"); // Check how not to initialize SPI. disp_driver_init() call is needed: disp_driver_init(); +#elif defined (CONFIG_LV_I2C_DISPLAY) + disp_driver_init(); #else #error "No protocol defined for display controller" #endif @@ -191,4 +193,4 @@ bool lvgl_spi_driver_init(int host, assert(ret == ESP_OK); return ESP_OK != ret; -} \ No newline at end of file +} diff --git a/lvgl_helpers.h b/lvgl_helpers.h index b5a3ec0..f9b3ba8 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" /********************* @@ -81,6 +82,8 @@ extern "C" { #define DISP_BUF_SIZE ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8) // 2888 bytes #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C #define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544) +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * (LV_VER_RES_MAX / 8)) #else #error "No display controller selected" #endif @@ -94,14 +97,14 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ +void lvgl_i2c_locking(void* leader); + /* Initialize detected SPI and I2C bus and devices */ void lvgl_driver_init(void); /* Initialize SPI master */ bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin, int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin); -/* Initialize I2C master */ -bool lvgl_i2c_driver_init(int port, int sda_pin, int scl_pin, int speed); /********************** * MACROS diff --git a/lvgl_i2c_conf.h b/lvgl_i2c_conf.h deleted file mode 100644 index cf8ac45..0000000 --- a/lvgl_i2c_conf.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * @file lvgl_i2c_config.h - */ - -#ifndef LVGL_I2C_CONF_H -#define LVGL_I2C_CONF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_LVGL_H_INCLUDE_SIMPLE -#include "lvgl.h" -#else -#include "lvgl/lvgl.h" -#endif - -/********************* - * DEFINES - *********************/ - -/* TODO: Define the I2C bus clock based on the selected display or touch - * controllers. */ - -/* Do both display and touch controllers uses I2C? */ -#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) && \ - defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) - -#if defined (CONFIG_LV_DISPLAY_I2C_PORT_0) && \ - defined (CONFIG_LV_TOUCH_I2C_PORT_0) -#define SHARED_I2C_PORT -#define DISP_I2C_PORT I2C_NUM_0 -#endif - -#if defined (CONFIG_LV_DISPLAY_I2C_PORT_1) && \ - defined (CONFIG_LV_TOUCH_I2C_PORT_1) -#define SHARED_I2C_PORT -#define DISP_I2C_PORT I2C_NUM_1 -#endif - -#if !defined (SHARED_I2C_PORT) -#endif -#endif - -#if defined (SHARED_I2C_PORT) -/* If the port is shared the display and touch controllers must use the same - * SCL and SDA pins, otherwise let the user know with an error. */ -#if (CONFIG_LV_DISP_PIN_SDA != CONFIG_LV_TOUCH_I2C_SDA) || \ - (CONFIG_LV_DISP_PIN_SCL != CONFIG_LV_TOUCH_I2C_SCL) -#error "To share I2C port you need to choose the same SDA and SCL pins on both display and touch configurations" -#endif - -#define DISP_I2C_SDA CONFIG_LV_DISP_PIN_SDA -#define DISP_I2C_SCL CONFIG_LV_DISP_PIN_SCL -#define DISP_I2C_ORIENTATION TFT_ORIENTATION_LANDSCAPE - -/* Setting the I2C speed to the slowest one */ -#if DISP_I2C_SPEED_HZ < TOUCH_I2C_SPEED_HZ -#define DISP_I2C_SPEED_HZ 400000 /* DISP_I2C_SPEED_HZ */ -#else -#define DISP_I2C_SPEED_HZ 400000 /* DISP_I2C_SPEED_HZ */ -#endif - -#else - -/* lets check if the touch controller uses I2C... */ -#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) -#if defined (CONFIG_LV_TOUCH_I2C_PORT_0) -#define TOUCH_I2C_PORT I2C_NUM_0 -#else -#define TOUCH_I2C_PORT I2C_NUM_1 -#endif -#define TOUCH_I2C_SDA CONFIG_LV_TOUCH_I2C_SDA -#define TOUCH_I2C_SCL CONFIG_LV_TOUCH_I2C_SCL -#define TOUCH_I2C_SPEED_HZ 400000 -#endif - -/* lets check if the display controller uses I2C... */ -#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) -#if defined (CONFIG_LV_DISPLAY_I2C_PORT_0) -#define DISP_I2C_PORT I2C_NUM_0 -#else -#define DISP_I2C_PORT I2C_NUM_1 -#endif - -#define DISP_I2C_SDA CONFIG_LV_DISP_PIN_SDA -#define DISP_I2C_SCL CONFIG_LV_DISP_PIN_SCL -#define DISP_I2C_ORIENTATION TFT_ORIENTATION_LANDSCAPE -#define DISP_I2C_SPEED_HZ 400000 -#endif - -#endif - -/********************** - * TYPEDEFS - **********************/ - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - - -/********************** - * MACROS - **********************/ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LVGL_I2C_CONF_H*/ diff --git a/lvgl_spi_conf.h b/lvgl_spi_conf.h index 240090d..662be98 100644 --- a/lvgl_spi_conf.h +++ b/lvgl_spi_conf.h @@ -64,16 +64,10 @@ extern "C" { #define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH -#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HSPI) -#if defined (CONFIG_IDF_TARGET_ESP32C3) -#define TFT_SPI_HOST SPI2_HOST -#else -#define TFT_SPI_HOST HSPI_HOST -#endif -#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_VSPI) -#define TFT_SPI_HOST VSPI_HOST -#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_FSPI) -#define TFT_SPI_HOST FSPI_HOST +#if defined (CONFIG_LV_TFT_DISPLAY_SPI2_HOST) +#define TFT_SPI_HOST SPI2_HOST +#elif defined (CONFIG_LV_TFT_DISPLAY_SPI3_HOST) +#define TFT_SPI_HOST SPI3_HOST #endif #if defined (CONFIG_LV_TFT_DISPLAY_SPI_HALF_DUPLEX) @@ -90,12 +84,10 @@ extern "C" { #define DISP_SPI_TRANS_MODE_SIO #endif -#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_HSPI) -#define TOUCH_SPI_HOST HSPI_HOST -#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_VSPI) -#define TOUCH_SPI_HOST VSPI_HOST -#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_FSPI) -#define TOUCH_SPI_HOST FSPI_HOST +#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI2_HOST) +#define TOUCH_SPI_HOST SPI2_HOST +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI3_HOST) +#define TOUCH_SPI_HOST SPI3_HOST #endif /* Handle the FT81X Special case */ @@ -111,7 +103,7 @@ extern "C" { // Detect the use of a shared SPI Bus and verify the user specified the same SPI bus for both touch and tft #if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) && TP_SPI_MOSI == DISP_SPI_MOSI && TP_SPI_CLK == DISP_SPI_CLK #if TFT_SPI_HOST != TOUCH_SPI_HOST -#error You must specify the same SPI host (HSPI, VSPI or FSPI) for both display and touch driver +#error You must specify the same SPI host (SPIx_HOST) for both display and touch driver #endif #define SHARED_SPI_BUS @@ -166,6 +158,8 @@ extern "C" { #define SPI_TFT_CLOCK_SPEED_HZ (40 * 1000 * 1000) #elif defined(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) #define SPI_TFT_CLOCK_SPEED_HZ (32*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544) +#define SPI_TFT_CLOCK_SPEED_HZ (4*1000*1000) #else #define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) #endif diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index 6f32051..c807233 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -111,31 +111,14 @@ void GC9A01_init(void) }; -#if GC9A01_BCKL == 15 - gpio_config_t io_conf; - io_conf.intr_type = GPIO_PIN_INTR_DISABLE; - io_conf.mode = GPIO_MODE_OUTPUT; - io_conf.pin_bit_mask = GPIO_SEL_15; - io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; - io_conf.pull_up_en = GPIO_PULLUP_DISABLE; - gpio_config(&io_conf); -#endif - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(GC9A01_DC); + gpio_pad_select_gpio(GC9A01_DC); gpio_set_direction(GC9A01_DC, GPIO_MODE_OUTPUT); #if GC9A01_USE_RST - gpio_pad_select_gpio(GC9A01_RST); + gpio_pad_select_gpio(GC9A01_RST); gpio_set_direction(GC9A01_RST, GPIO_MODE_OUTPUT); -#endif -#if GC9A01_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(GC9A01_BCKL); - gpio_set_direction(GC9A01_BCKL, GPIO_MODE_OUTPUT); -#endif - -#if GC9A01_USE_RST //Reset the display gpio_set_level(GC9A01_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); @@ -156,8 +139,6 @@ void GC9A01_init(void) cmd++; } - GC9A01_enable_backlight(true); - GC9A01_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); #if GC9A01_INVERT_COLORS == 1 @@ -197,22 +178,6 @@ void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo GC9A01_send_color((void*)color_map, size * 2); } -void GC9A01_enable_backlight(bool backlight) -{ -#if GC9A01_ENABLE_BACKLIGHT_CONTROL - ESP_LOGI(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (GC9A01_BCKL_ACTIVE_LVL==1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(GC9A01_BCKL, tmp); -#endif -} - void GC9A01_sleep_in() { uint8_t data[] = {0x08}; diff --git a/lvgl_tft/GC9A01.h b/lvgl_tft/GC9A01.h index 2995811..e39c14d 100644 --- a/lvgl_tft/GC9A01.h +++ b/lvgl_tft/GC9A01.h @@ -25,19 +25,9 @@ extern "C" { /********************* * DEFINES *********************/ -#define GC9A01_DC CONFIG_LV_DISP_PIN_DC -#define GC9A01_RST CONFIG_LV_DISP_PIN_RST -#define GC9A01_USE_RST CONFIG_LV_DISP_USE_RST -#define GC9A01_BCKL CONFIG_LV_DISP_PIN_BCKL - -#define GC9A01_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL - -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL - #define GC9A01_BCKL_ACTIVE_LVL 1 -#else - #define GC9A01_BCKL_ACTIVE_LVL 0 -#endif - +#define GC9A01_DC CONFIG_LV_DISP_PIN_DC +#define GC9A01_RST CONFIG_LV_DISP_PIN_RST +#define GC9A01_USE_RST CONFIG_LV_DISP_USE_RST #define GC9A01_INVERT_COLORS CONFIG_LV_INVERT_COLORS /********************** @@ -50,7 +40,6 @@ extern "C" { void GC9A01_init(void); void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void GC9A01_enable_backlight(bool backlight); void GC9A01_sleep_in(void); void GC9A01_sleep_out(void); diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index b2e6799..7f1c8a6 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -22,7 +22,7 @@ menu "LVGL TFT/Epaper Display controller" select LV_TFT_DISPLAY_CONTROLLER_ILI9341 select LV_TFT_DISPLAY_PROTOCOL_SPI config LV_PREDEFINED_DISPLAY_M5CORE2 - bool "M5Core2" + bool "M5Core2" select LV_TFT_DISPLAY_CONTROLLER_ILI9341 select LV_TFT_DISPLAY_PROTOCOL_SPI config LV_PREDEFINED_DISPLAY_M5STICK @@ -50,7 +50,7 @@ menu "LVGL TFT/Epaper Display controller" config LV_PREDEFINED_DISPLAY_WEMOS_LOLIN bool "Wemos Lolin OLED" select LV_TFT_DISPLAY_CONTROLLER_SSD1306 - select LV_TFT_DISPLAY_PROTOCOL_I2C + select LV_I2C_DISPLAY select LV_TFT_DISPLAY_MONOCHROME select LV_THEME_MONO config LV_PREDEFINED_DISPLAY_ATAG @@ -179,6 +179,10 @@ menu "LVGL TFT/Epaper Display controller" help ILI9163C display controller. + config LV_TFT_DISPLAY_CONTROLLER_PCD8544 + bool + help + PCD8544 display controller (Nokia 3110/5110) # Display controller communication protocol # # This symbols define the communication protocol used by the @@ -197,7 +201,7 @@ menu "LVGL TFT/Epaper Display controller" help Display controller protocol SPI - config LV_TFT_DISPLAY_PROTOCOL_I2C + config LV_I2C_DISPLAY bool help Display controller protocol I2C @@ -205,24 +209,24 @@ menu "LVGL TFT/Epaper Display controller" # Used in display init function to send display orientation commands choice DISPLAY_ORIENTATION prompt "Display orientation" - default DISPLAY_ORIENTATION_PORTRAIT if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 - default DISPLAY_ORIENTATION_LANDSCAPE if LV_TFT_DISPLAY_CONTROLLER_SSD1306 - config DISPLAY_ORIENTATION_PORTRAIT + default LV_DISPLAY_ORIENTATION_PORTRAIT if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 + default LV_DISPLAY_ORIENTATION_LANDSCAPE if LV_TFT_DISPLAY_CONTROLLER_SSD1306 + config LV_DISPLAY_ORIENTATION_PORTRAIT bool "Portrait" if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 - config DISPLAY_ORIENTATION_PORTRAIT_INVERTED + config LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED bool "Portrait inverted" if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 - config DISPLAY_ORIENTATION_LANDSCAPE + config LV_DISPLAY_ORIENTATION_LANDSCAPE bool "Landscape" - config DISPLAY_ORIENTATION_LANDSCAPE_INVERTED + config LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED bool "Landscape inverted" endchoice config LV_DISPLAY_ORIENTATION int - default 0 if DISPLAY_ORIENTATION_PORTRAIT - default 1 if DISPLAY_ORIENTATION_PORTRAIT_INVERTED - default 2 if DISPLAY_ORIENTATION_LANDSCAPE - default 3 if DISPLAY_ORIENTATION_LANDSCAPE_INVERTED + default 0 if LV_DISPLAY_ORIENTATION_PORTRAIT + default 1 if LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED + default 2 if LV_DISPLAY_ORIENTATION_LANDSCAPE + default 3 if LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED config LV_TFT_DISPLAY_OFFSETS bool @@ -231,14 +235,14 @@ menu "LVGL TFT/Epaper Display controller" config LV_TFT_DISPLAY_X_OFFSET depends on LV_TFT_DISPLAY_OFFSETS - int + int "X offset" default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) default 0 config LV_TFT_DISPLAY_Y_OFFSET depends on LV_TFT_DISPLAY_OFFSETS - int + int "Y offset" default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) default 0 @@ -324,7 +328,7 @@ menu "LVGL TFT/Epaper Display controller" config LV_TFT_DISPLAY_USER_CONTROLLER_SSD1306 bool "SSD1306" select LV_TFT_DISPLAY_CONTROLLER_SSD1306 - select LV_TFT_DISPLAY_PROTOCOL_I2C + select LV_I2C_DISPLAY select LV_TFT_DISPLAY_MONOCHROME config LV_TFT_DISPLAY_USER_CONTROLLER_FT81X bool "FT81X" @@ -353,6 +357,11 @@ menu "LVGL TFT/Epaper Display controller" bool "ILI9163C" select LV_TFT_DISPLAY_CONTROLLER_ILI9163C select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_PCD8544 + bool "PCD8544" + select LV_TFT_DISPLAY_CONTROLLER_PCD8544 + select LV_TFT_DISPLAY_PROTOCOL_SPI + select LV_TFT_DISPLAY_MONOCHROME endchoice config CUSTOM_DISPLAY_BUFFER_SIZE @@ -472,20 +481,15 @@ menu "LVGL TFT/Epaper Display controller" endchoice choice - prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI && \ - !LV_PREDEFINED_DISPLAY_TTGO - default LV_TFT_DISPLAY_SPI_VSPI if LV_PREDEFINED_DISPLAY_TTGO && \ - !IDF_TARGET_ESP32S2 - default LV_TFT_DISPLAY_SPI_FSPI if IDF_TARGET_ESP32S2 + prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI + default LV_TFT_DISPLAY_SPI2_HOST help Select the SPI Bus the TFT Display is attached to. - config LV_TFT_DISPLAY_SPI_HSPI - bool "HSPI" - config LV_TFT_DISPLAY_SPI_VSPI - bool "VSPI" if !IDF_TARGET_ESP32S2 - config LV_TFT_DISPLAY_SPI_FSPI - bool "FSPI" if IDF_TARGET_ESP32S2 + config LV_TFT_DISPLAY_SPI2_HOST + bool "SPI2_HOST" + config LV_TFT_DISPLAY_SPI3_HOST + bool "SPI3_HOST" endchoice choice @@ -516,18 +520,6 @@ menu "LVGL TFT/Epaper Display controller" depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_SIO endchoice - choice - prompt "Display I2C port" if LV_TFT_DISPLAY_PROTOCOL_I2C - default LV_DISPLAY_I2C_PORT_0 - help - Select the I2C port used by the display controller. - - config LV_DISPLAY_I2C_PORT_0 - bool "I2C PORT 0" - config LV_DISPLAY_I2C_PORT_1 - bool "I2C PORT 1" - endchoice - config LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER bool "Use custom SPI clock frequency." if LV_TFT_DISPLAY_PROTOCOL_SPI default n @@ -605,6 +597,16 @@ menu "LVGL TFT/Epaper Display controller" default 80 if LV_TFT_SPI_CLK_DIVIDER_80 default 2 + config LV_M5STICKC_HANDLE_AXP192 + bool "Handle Backlight and TFT power for M5StickC using AXP192." if LV_PREDEFINED_DISPLAY_M5STICKC || LV_TFT_DISPLAY_CONTROLLER_ST7735S + default y if LV_PREDEFINED_DISPLAY_M5STICKC + select LV_I2C_DISPLAY + help + Display and TFT power supply on M5StickC is controlled using an + AXP192 Power Mangerment IC. Select yes if you want to enable TFT IC + (LDO3) and backlight power using AXP192 by LVGL, or select no if you + want to take care of power management in your own code. + config LV_INVERT_DISPLAY bool "IN DEPRECATION - Invert display." if LV_TFT_DISPLAY_CONTROLLER_RA8875 default n @@ -618,31 +620,6 @@ menu "LVGL TFT/Epaper Display controller" If the colors look inverted on your display, try enabling this. If it didn't help try LVGL configuration -> Swap the 2 bytes of RGB565 color. - config LV_M5STICKC_HANDLE_AXP192 - bool "Handle Backlight and TFT power for M5StickC using AXP192." if LV_PREDEFINED_DISPLAY_M5STICKC || LV_TFT_DISPLAY_CONTROLLER_ST7735S - default y if LV_PREDEFINED_DISPLAY_M5STICKC - help - Display and TFT power supply on M5StickC is controlled using an AXP192 Power Mangerment IC. - Select yes if you want to enable TFT IC (LDO3) and backlight power using AXP192 by LVGL, or select no if you want to take care of - power management in your own code. - - config LV_AXP192_PIN_SDA - int "GPIO for AXP192 I2C SDA" - depends on LV_M5STICKC_HANDLE_AXP192 - range 0 39 - default 21 if LV_PREDEFINED_DISPLAY_M5STICKC - default 21 - help - Configure the AXP192 I2C SDA pin here. - - config LV_AXP192_PIN_SCL - int "GPIO for AXP192 I2C SCL" - depends on LV_M5STICKC_HANDLE_AXP192 - range 0 39 - default 22 if LV_PREDEFINED_DISPLAY_M5STICKC - default 22 - help - Configure the AXP192 I2C SDA pin here. # menu will be visible only when LV_PREDEFINED_DISPLAY_NONE is y menu "Display RA8875 Configuration" @@ -783,10 +760,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_SPI_MOSI int "GPIO for MOSI (Master Out Slave In)" if LV_TFT_DISPLAY_PROTOCOL_SPI - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 23 if LV_PREDEFINED_DISPLAY_WROVER4 default 23 if LV_PREDEFINED_DISPLAY_ATAG default 23 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK @@ -798,7 +771,6 @@ menu "LVGL TFT/Epaper Display controller" default 19 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS default 13 if LV_PREDEFINED_DISPLAY_WT32_SC01 default 13 - help Configure the display MOSI pin here. @@ -813,10 +785,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_SPI_MISO int "GPIO for MISO (Master In Slave Out)" if LV_TFT_DISPLAY_PROTOCOL_SPI depends on LV_DISPLAY_USE_SPI_MISO - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 19 if LV_PREDEFINED_PINS_TKOALA default 38 if LV_PREDEFINED_DISPLAY_M5CORE2 default 0 @@ -836,10 +804,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_SPI_IO2 int "GPIO for Quad SPI IO2/WP" if LV_TFT_DISPLAY_PROTOCOL_SPI depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO - range -1 39 if IDF_TARGET_ESP32 - range -1 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 22 if LV_PREDEFINED_PINS_TKOALA && LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO default -1 help @@ -848,10 +812,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_SPI_IO3 int "GPIO for Quad SPI IO3/HD" if LV_TFT_DISPLAY_PROTOCOL_SPI depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO - range -1 39 if IDF_TARGET_ESP32 - range -1 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 21 if LV_PREDEFINED_PINS_TKOALA && LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO default -1 help @@ -859,10 +819,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_SPI_CLK int "GPIO for CLK (SCK / Serial Clock)" if LV_TFT_DISPLAY_PROTOCOL_SPI - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 18 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK default 18 if LV_PREDEFINED_DISPLAY_M5CORE2 default 13 if LV_PREDEFINED_DISPLAY_M5STICKC @@ -888,10 +844,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_SPI_CS int "GPIO for CS (Slave Select)" if LV_TFT_DISPLAY_PROTOCOL_SPI depends on LV_DISPLAY_USE_SPI_CS - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 5 if LV_PREDEFINED_PINS_38V1 default 14 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK default 5 if LV_PREDEFINED_DISPLAY_M5CORE2 @@ -917,10 +869,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_PIN_DC int "GPIO for DC (Data / Command)" if LV_TFT_DISPLAY_PROTOCOL_SPI - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - depends on LV_DISPLAY_USE_DC default 19 if LV_PREDEFINED_PINS_38V1 default 17 if LV_PREDEFINED_PINS_38V4 @@ -955,10 +903,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_PIN_RST int "GPIO for Reset" if LV_TFT_DISPLAY_PROTOCOL_SPI && !LV_DISP_ST7789_SOFT_RESET depends on LV_DISP_USE_RST - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 18 if LV_PREDEFINED_PINS_38V1 default 25 if LV_PREDEFINED_PINS_38V4 default 33 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK @@ -977,10 +921,6 @@ menu "LVGL TFT/Epaper Display controller" config LV_DISP_PIN_BUSY int "GPIO for Busy" if LV_TFT_DISPLAY_CONTROLLER_IL3820 || LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 35 if LV_TFT_DISPLAY_CONTROLLER_IL3820 || LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D default 35 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 default 21 if IDF_TARGET_ESP32C3 @@ -988,79 +928,96 @@ menu "LVGL TFT/Epaper Display controller" help Configure the display Busy pin here. - config LV_ENABLE_BACKLIGHT_CONTROL - bool "Enable control of the display backlight by using an GPIO." if \ - ( LV_PREDEFINED_DISPLAY_NONE && ! ( LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 ) ) \ - || LV_PREDEFINED_DISPLAY_RPI_MPI3501 - default y if LV_PREDEFINED_DISPLAY_M5STACK - default n if LV_PREDEFINED_DISPLAY_M5CORE2 - default y if LV_PREDEFINED_DISPLAY_WROVER4 - default y if LV_PREDEFINED_DISPLAY_ERTFT0356 - default y if LV_PREDEFINED_DISPLAY_TTGO - default y if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS - default y if LV_PREDEFINED_DISPLAY_WT32_SC01 - help - Enable controlling the display backlight using an GPIO - - config LV_BACKLIGHT_ACTIVE_LVL - bool "Is backlight turn on with a HIGH (1) logic level?" - depends on LV_ENABLE_BACKLIGHT_CONTROL - default y if LV_PREDEFINED_DISPLAY_M5STACK - default y if LV_PREDEFINED_DISPLAY_ERTFT0356 - default y if LV_PREDEFINED_DISPLAY_TTGO - default y if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS - default y if LV_PREDEFINED_DISPLAY_WT32_SC01 - help - Some backlights are turned on with a high signal, others held low. - If enabled, a value of 1 will be sent to the display to enable the backlight, - otherwise a 0 will be expected to enable it. - - config LV_DISP_PIN_BCKL - int "GPIO for Backlight Control" - depends on LV_ENABLE_BACKLIGHT_CONTROL - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - - default 23 if LV_PREDEFINED_PINS_38V1 - default 26 if LV_PREDEFINED_PINS_38V4 - default 32 if LV_PREDEFINED_DISPLAY_M5STACK - default 5 if LV_PREDEFINED_DISPLAY_WROVER4 - default 2 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING - default 27 if LV_PREDEFINED_DISPLAY_ERTFT0356 - default 0 if LV_PREDEFINED_PINS_TKOALA - default 4 if LV_PREDEFINED_DISPLAY_TTGO - default 2 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS - default 23 if LV_PREDEFINED_DISPLAY_WT32_SC01 - default 27 - - help - Configure the display BCLK (LED) pin here. - - config LV_DISP_PIN_SDA - int "GPIO for I2C SDA" if LV_TFT_DISPLAY_PROTOCOL_I2C - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - - default 5 if LV_PREDEFINED_DISPLAY_WEMOS_LOLIN - default 5 - - help - Configure the I2C SDA pin here. - - config LV_DISP_PIN_SCL - int "GPIO for I2C SCL" if LV_TFT_DISPLAY_PROTOCOL_I2C - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - - default 4 if LV_PREDEFINED_DISPLAY_WEMOS_LOLIN - default 4 - - help - Configure the I2C SCL pin here. - endmenu + choice + prompt "Select an I2C port for the display" + default LV_I2C_DISPLAY_PORT_0 + depends on LV_I2C_DISPLAY + + config LV_I2C_DISPLAY_PORT_0 + bool + prompt "I2C port 0" + help + I2C is shared peripheral managed by I2C Manager. In order to configure I2C Manager (pinout, etc.) see menu + Component config->I2C Port Settings. + + config LV_I2C_DISPLAY_PORT_1 + bool + prompt "I2C port 1" + help + I2C is shared peripheral managed by I2C Manager. In order to configure I2C Manager (pinout, etc.) see menu + Component config->I2C Port Settings. + + endchoice + + choice + default LV_DISP_BACKLIGHT_SWITCH + prompt "Backlight Control" if \ + (! ( LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 ) ) + + config LV_DISP_BACKLIGHT_OFF + bool + prompt "Not Used" + help + Display backlight is not controlled by this driver, must be hardwired in hardware. + + config LV_DISP_BACKLIGHT_SWITCH + bool + prompt "Switch control" + help + Display backlight can be switched on or off. + + config LV_DISP_BACKLIGHT_PWM + bool + prompt "PWM control" + help + Display backlight is controlled by pulse-width modulation, allowing brightness settings. + + endchoice + + config LV_BACKLIGHT_ACTIVE_LVL + bool "Is backlight turn on with a HIGH (1) logic level?" if \ + ( LV_PREDEFINED_DISPLAY_NONE && ! ( LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 ) ) \ + || LV_PREDEFINED_DISPLAY_RPI_MPI3501 + depends on !LV_DISP_BACKLIGHT_OFF + default y if LV_PREDEFINED_DISPLAY_M5STACK + default y if LV_PREDEFINED_DISPLAY_ERTFT0356 + default y if LV_PREDEFINED_DISPLAY_TTGO + default y if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default y if LV_PREDEFINED_DISPLAY_WT32_SC01 + help + Some backlights are turned on with a high signal, others held low. + If enabled, a value of 1 will be sent to the display to enable the backlight, + otherwise a 0 will be expected to enable it. + + config LV_DISP_PIN_BCKL + int "GPIO for Backlight Control" if \ + ( LV_PREDEFINED_DISPLAY_NONE && ! ( LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 ) ) \ + || LV_PREDEFINED_DISPLAY_RPI_MPI3501 + depends on !LV_DISP_BACKLIGHT_OFF + default 23 if LV_PREDEFINED_PINS_38V1 + default 26 if LV_PREDEFINED_PINS_38V4 + default 32 if LV_PREDEFINED_DISPLAY_M5STACK + default 5 if LV_PREDEFINED_DISPLAY_WROVER4 + default 2 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 27 if LV_PREDEFINED_DISPLAY_ERTFT0356 + default 0 if LV_PREDEFINED_PINS_TKOALA + default 4 if LV_PREDEFINED_DISPLAY_TTGO + default 2 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 23 if LV_PREDEFINED_DISPLAY_WT32_SC01 + default -1 + + help + Configure the display BCLK (LED) pin here. + + config LV_I2C + bool + default y if LV_I2C_DISPLAY + + config LV_I2C_DISPLAY_PORT + int + default 1 if LV_I2C_DISPLAY_PORT_1 + default 0 + endmenu diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index b2e8583..a2d5f12 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -4,7 +4,8 @@ #include "disp_driver.h" #include "disp_spi.h" - +#include "esp_lcd_backlight.h" +#include "sdkconfig.h" void *disp_driver_init(void) { diff --git a/lvgl_tft/disp_spi.c b/lvgl_tft/disp_spi.c index 0e4e548..9b70806 100644 --- a/lvgl_tft/disp_spi.c +++ b/lvgl_tft/disp_spi.c @@ -310,7 +310,12 @@ static void IRAM_ATTR spi_ready(spi_transaction_t *trans) disp = lv_refr_get_disp_refreshing(); #endif +#if LVGL_VERSION_MAJOR < 8 lv_disp_flush_ready(&disp->driver); +#else + lv_disp_flush_ready(disp->driver); +#endif + } if (chained_post_cb) { diff --git a/lvgl_tft/esp_lcd_backlight.c b/lvgl_tft/esp_lcd_backlight.c new file mode 100644 index 0000000..f4395bd --- /dev/null +++ b/lvgl_tft/esp_lcd_backlight.c @@ -0,0 +1,107 @@ +/** + * @file esp_lcd_backlight.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "esp_lcd_backlight.h" +#include "driver/ledc.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "soc/ledc_periph.h" // to invert LEDC output on IDF version < v4.3 + +typedef struct { + bool pwm_control; // true: LEDC is used, false: GPIO is used + int index; // Either GPIO or LEDC channel +} disp_backlight_t; + +static const char *TAG = "disp_backlight"; + +disp_backlight_h disp_backlight_new(const disp_backlight_config_t *config) +{ + // Check input parameters + if (config == NULL) + return NULL; + if (!GPIO_IS_VALID_OUTPUT_GPIO(config->gpio_num)) { + ESP_LOGW(TAG, "Invalid GPIO number"); + return NULL; + } + disp_backlight_t *bckl_dev = calloc(1, sizeof(disp_backlight_t)); + if (bckl_dev == NULL){ + ESP_LOGW(TAG, "Not enough memory"); + return NULL; + } + + if (config->pwm_control){ + // Configure LED (Backlight) pin as PWM for Brightness control. + bckl_dev->pwm_control = true; + bckl_dev->index = config->channel_idx; + const ledc_channel_config_t LCD_backlight_channel = { + .gpio_num = config->gpio_num, + .speed_mode = LEDC_LOW_SPEED_MODE, + .channel = config->channel_idx, + .intr_type = LEDC_INTR_DISABLE, + .timer_sel = config->timer_idx, + .duty = 0, + .hpoint = 0 + }; + const ledc_timer_config_t LCD_backlight_timer = { + .speed_mode = LEDC_LOW_SPEED_MODE, + .bit_num = LEDC_TIMER_10_BIT, + .timer_num = config->timer_idx, + .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)); + gpio_matrix_out(config->gpio_num, ledc_periph_signal[LEDC_LOW_SPEED_MODE].sig_out0_idx + config->channel_idx, config->output_invert, 0); + } + else + { + // Configure GPIO for output + bckl_dev->index = config->gpio_num; + gpio_pad_select_gpio(config->gpio_num); + ESP_ERROR_CHECK(gpio_set_direction(config->gpio_num, GPIO_MODE_OUTPUT)); + gpio_matrix_out(config->gpio_num, SIG_GPIO_OUT_IDX, config->output_invert, false); + } + + return (disp_backlight_h)bckl_dev; +} + +void disp_backlight_set(disp_backlight_h bckl, int brightness_percent) +{ + // Check input paramters + if (bckl == NULL) + return; + if (brightness_percent > 100) + brightness_percent = 100; + if (brightness_percent < 0) + brightness_percent = 0; + + disp_backlight_t *bckl_dev = (disp_backlight_t *) bckl; + ESP_LOGI(TAG, "Setting LCD backlight: %d%%", brightness_percent); + + if (bckl_dev->pwm_control) { + uint32_t duty_cycle = (1023 * brightness_percent) / 100; // LEDC resolution set to 10bits, thus: 100% = 1023 + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, bckl_dev->index, duty_cycle)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, bckl_dev->index)); + } else { + ESP_ERROR_CHECK(gpio_set_level(bckl_dev->index, brightness_percent)); + } +} + +void disp_backlight_delete(disp_backlight_h bckl) +{ + if (bckl == NULL) + return; + + disp_backlight_t *bckl_dev = (disp_backlight_t *) bckl; + if (bckl_dev->pwm_control) { + ledc_stop(LEDC_LOW_SPEED_MODE, bckl_dev->index, 0); + } else { + gpio_reset_pin(bckl_dev->index); + } + free (bckl); +} diff --git a/lvgl_tft/esp_lcd_backlight.h b/lvgl_tft/esp_lcd_backlight.h new file mode 100644 index 0000000..8deda9f --- /dev/null +++ b/lvgl_tft/esp_lcd_backlight.h @@ -0,0 +1,67 @@ +/** + * @file esp_lcd_backlight.h + */ + +#ifndef ESP_LCD_BACKLIGHT_H +#define ESP_LCD_BACKLIGHT_H + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef __cplusplus +extern "C" { /* extern "C" */ +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Display backlight controller handle + * + */ +typedef void * disp_backlight_h; + +/** + * @brief Configuration structure of backlight controller + * + * Must be passed to disp_backlight_new() for correct configuration + */ +typedef struct { + bool pwm_control; + bool output_invert; + int gpio_num; // see gpio_num_t + + // Relevant only for PWM controlled backlight + // Ignored for switch (ON/OFF) backlight control + int timer_idx; // ledc_timer_t + int channel_idx; // ledc_channel_t +} disp_backlight_config_t; + +/** + * @brief Create new backlight controller + * + * @param[in] config Configuration structure of backlight controller + * @return Display backlight controller handle + */ +disp_backlight_h disp_backlight_new(const disp_backlight_config_t *config); + +/** + * @brief Set backlight + * + * Brightness parameter can be 0-100 for PWM controlled backlight. + * GPIO controlled backlight (ON/OFF) is turned off witch value 0 and turned on with any positive value. + * + * @param bckl Backlight controller handle + * @param[in] brightness_percent Brightness in [%] + */ +void disp_backlight_set(disp_backlight_h bckl, int brightness_percent); +void disp_backlight_delete(disp_backlight_h bckl); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*ESP_LCD_BACKLIGHT_H*/ diff --git a/lvgl_tft/hx8357.c b/lvgl_tft/hx8357.c index 6b6cd34..bb9ea58 100644 --- a/lvgl_tft/hx8357.c +++ b/lvgl_tft/hx8357.c @@ -160,20 +160,13 @@ static uint8_t displayType = HX8357D; void hx8357_init(void) { //Initialize non-SPI GPIOs - gpio_pad_select_gpio(HX8357_DC); + gpio_pad_select_gpio(HX8357_DC); gpio_set_direction(HX8357_DC, GPIO_MODE_OUTPUT); #if HX8357_USE_RST - gpio_pad_select_gpio(HX8357_RST); + gpio_pad_select_gpio(HX8357_RST); gpio_set_direction(HX8357_RST, GPIO_MODE_OUTPUT); -#endif -#if HX8357_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(HX8357_BCKL); - gpio_set_direction(HX8357_BCKL, GPIO_MODE_OUTPUT); -#endif - -#if HX8357_USE_RST //Reset the display gpio_set_level(HX8357_RST, 0); vTaskDelay(10 / portTICK_RATE_MS); @@ -210,8 +203,6 @@ void hx8357_init(void) #else hx8357_send_cmd(HX8357_INVOFF); #endif - - hx8357_enable_backlight(true); } @@ -248,23 +239,6 @@ void hx8357_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo hx8357_send_color((void*)color_map, size * 2); } -void hx8357_enable_backlight(bool backlight) -{ -#if HX8357_ENABLE_BACKLIGHT_CONTROL - ESP_LOGD(TAG, "%s backlight.\n", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (HX8357_BCKL_ACTIVE_LVL==1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(HX8357_BCKL, tmp); -#endif -} - - void hx8357_set_rotation(uint8_t r) { r = r & 3; // can't be higher than 3 diff --git a/lvgl_tft/hx8357.h b/lvgl_tft/hx8357.h index 1e54627..34cbaf9 100644 --- a/lvgl_tft/hx8357.h +++ b/lvgl_tft/hx8357.h @@ -35,19 +35,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define HX8357_DC CONFIG_LV_DISP_PIN_DC -#define HX8357_RST CONFIG_LV_DISP_PIN_RST -#define HX8357_USE_RST CONFIG_LV_DISP_USE_RST -#define HX8357_BCKL CONFIG_LV_DISP_PIN_BCKL - -#define HX8357_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL -#define HX8357_INVERT_COLORS CONFIG_LV_INVERT_COLORS - -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL - #define HX8357_BCKL_ACTIVE_LVL 1 -#else - #define HX8357_BCKL_ACTIVE_LVL 0 -#endif +#define HX8357_DC CONFIG_LV_DISP_PIN_DC +#define HX8357_RST CONFIG_LV_DISP_PIN_RST +#define HX8357_USE_RST CONFIG_LV_DISP_USE_RST +#define HX8357_INVERT_COLORS CONFIG_LV_INVERT_COLORS /******************* @@ -136,7 +127,6 @@ extern "C" { void hx8357_init(void); void hx8357_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void hx8357_enable_backlight(bool backlight); void hx8357_set_rotation(uint8_t r); /********************** diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index f1806e6..76432dc 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -199,15 +199,13 @@ void il3820_init(void) gpio_pad_select_gpio(IL3820_DC_PIN); gpio_set_direction(IL3820_DC_PIN, GPIO_MODE_OUTPUT); -#if IL3820_USE_RST - gpio_pad_select_gpio(IL3820_RST_PIN); - gpio_set_direction(IL3820_RST_PIN, GPIO_MODE_OUTPUT); -#endif - gpio_pad_select_gpio(IL3820_BUSY_PIN); gpio_set_direction(IL3820_BUSY_PIN, GPIO_MODE_INPUT); #if IL3820_USE_RST + gpio_pad_select_gpio(IL3820_RST_PIN); + gpio_set_direction(IL3820_RST_PIN, GPIO_MODE_OUTPUT); + /* Harware reset */ gpio_set_level( IL3820_RST_PIN, 0); vTaskDelay(IL3820_RESET_DELAY / portTICK_RATE_MS); diff --git a/lvgl_tft/ili9163c.c b/lvgl_tft/ili9163c.c index 77346e4..059d076 100644 --- a/lvgl_tft/ili9163c.c +++ b/lvgl_tft/ili9163c.c @@ -143,10 +143,6 @@ void ili9163c_init(void) gpio_pad_select_gpio(ILI9163C_RST); gpio_set_direction(ILI9163C_RST, GPIO_MODE_OUTPUT); -#if ILI9163C_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(ILI9163C_BCKL); - gpio_set_direction(ILI9163C_BCKL, GPIO_MODE_OUTPUT); -#endif //Reset the display gpio_set_level(ILI9163C_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); @@ -166,8 +162,6 @@ void ili9163c_init(void) cmd++; } - ili9163c_enable_backlight(true); - ili9163c_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); } @@ -199,22 +193,6 @@ void ili9163c_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color ili9163c_send_color((void *)color_map, size * 2); } -void ili9163c_enable_backlight(bool backlight) -{ -#if ILI9163C_ENABLE_BACKLIGHT_CONTROL - ESP_LOGD(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (ILI9163C_BCKL_ACTIVE_LVL == 1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(ILI9163C_BCKL, tmp); -#endif -} - void ili9163c_sleep_in() { uint8_t data[] = {0x08}; diff --git a/lvgl_tft/ili9163c.h b/lvgl_tft/ili9163c.h index f164ba8..d6edf57 100644 --- a/lvgl_tft/ili9163c.h +++ b/lvgl_tft/ili9163c.h @@ -26,35 +26,24 @@ extern "C" /********************* * DEFINES *********************/ -#define ILI9163C_DC CONFIG_LV_DISP_PIN_DC -#define ILI9163C_RST CONFIG_LV_DISP_PIN_RST -#define ILI9163C_BCKL CONFIG_LV_DISP_PIN_BCKL - -#define ILI9163C_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL - -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL -#define ILI9163C_BCKL_ACTIVE_LVL 1 -#else -#define ILI9163C_BCKL_ACTIVE_LVL 0 -#endif - +#define ILI9163C_DC CONFIG_LV_DISP_PIN_DC +#define ILI9163C_RST CONFIG_LV_DISP_PIN_RST #define ILI9163C_INVERT_COLORS CONFIG_LV_INVERT_COLORS - /********************** +/********************** * TYPEDEFS **********************/ - /********************** +/********************** * GLOBAL PROTOTYPES **********************/ - void ili9163c_init(void); - void ili9163c_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); - void ili9163c_enable_backlight(bool backlight); - void ili9163c_sleep_in(void); - void ili9163c_sleep_out(void); +void ili9163c_init(void); +void ili9163c_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); +void ili9163c_sleep_in(void); +void ili9163c_sleep_out(void); - /********************** +/********************** * MACROS **********************/ diff --git a/lvgl_tft/ili9341.c b/lvgl_tft/ili9341.c index 23aba09..e91680f 100644 --- a/lvgl_tft/ili9341.c +++ b/lvgl_tft/ili9341.c @@ -80,30 +80,14 @@ void ili9341_init(void) {0, {0}, 0xff}, }; -#if ILI9341_BCKL == 15 - gpio_config_t io_conf; - io_conf.intr_type = GPIO_PIN_INTR_DISABLE; - io_conf.mode = GPIO_MODE_OUTPUT; - io_conf.pin_bit_mask = GPIO_SEL_15; - io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; - io_conf.pull_up_en = GPIO_PULLUP_DISABLE; - gpio_config(&io_conf); -#endif - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ILI9341_DC); + gpio_pad_select_gpio(ILI9341_DC); gpio_set_direction(ILI9341_DC, GPIO_MODE_OUTPUT); + #if ILI9341_USE_RST - gpio_pad_select_gpio(ILI9341_RST); + gpio_pad_select_gpio(ILI9341_RST); gpio_set_direction(ILI9341_RST, GPIO_MODE_OUTPUT); -#endif -#if ILI9341_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(ILI9341_BCKL); - gpio_set_direction(ILI9341_BCKL, GPIO_MODE_OUTPUT); -#endif - -#if ILI9341_USE_RST //Reset the display gpio_set_level(ILI9341_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); @@ -124,9 +108,7 @@ void ili9341_init(void) cmd++; } - ili9341_enable_backlight(true); - - ili9341_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); + ili9341_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); #if ILI9341_INVERT_COLORS == 1 ili9341_send_cmd(0x21); @@ -158,29 +140,10 @@ void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col /*Memory write*/ ili9341_send_cmd(0x2C); - - uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); - ili9341_send_color((void*)color_map, size * 2); } -void ili9341_enable_backlight(bool backlight) -{ -#if ILI9341_ENABLE_BACKLIGHT_CONTROL - ESP_LOGI(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (ILI9341_BCKL_ACTIVE_LVL==1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(ILI9341_BCKL, tmp); -#endif -} - void ili9341_sleep_in() { uint8_t data[] = {0x08}; diff --git a/lvgl_tft/ili9341.h b/lvgl_tft/ili9341.h index 5768fbe..62317e8 100644 --- a/lvgl_tft/ili9341.h +++ b/lvgl_tft/ili9341.h @@ -20,7 +20,8 @@ extern "C" { #else #include "lvgl/lvgl.h" #endif -#include "../lvgl_helpers.h" + +#include "sdkconfig.h" /********************* * DEFINES @@ -28,16 +29,6 @@ extern "C" { #define ILI9341_DC CONFIG_LV_DISP_PIN_DC #define ILI9341_USE_RST CONFIG_LV_DISP_USE_RST #define ILI9341_RST CONFIG_LV_DISP_PIN_RST -#define ILI9341_BCKL CONFIG_LV_DISP_PIN_BCKL - -#define ILI9341_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL - -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL - #define ILI9341_BCKL_ACTIVE_LVL 1 -#else - #define ILI9341_BCKL_ACTIVE_LVL 0 -#endif - #define ILI9341_INVERT_COLORS CONFIG_LV_INVERT_COLORS /********************** @@ -50,7 +41,6 @@ extern "C" { void ili9341_init(void); void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void ili9341_enable_backlight(bool backlight); void ili9341_sleep_in(void); void ili9341_sleep_out(void); diff --git a/lvgl_tft/ili9481.c b/lvgl_tft/ili9481.c index f80c810..74bda98 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -80,14 +80,7 @@ void ili9481_init(void) #if ILI9481_USE_RST gpio_pad_select_gpio(ILI9481_RST); gpio_set_direction(ILI9481_RST, GPIO_MODE_OUTPUT); -#endif -#if ILI9481_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(ILI9481_BCKL); - gpio_set_direction(ILI9481_BCKL, GPIO_MODE_OUTPUT); -#endif - -#if ILI9481_USE_RST //Reset the display gpio_set_level(ILI9481_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); @@ -112,8 +105,6 @@ void ili9481_init(void) cmd++; } - ili9481_enable_backlight(true); - ili9481_set_orientation(ILI9481_DISPLAY_ORIENTATION); } @@ -173,22 +164,6 @@ void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col heap_caps_free(mybuf); } -void ili9481_enable_backlight(bool backlight) -{ -#if ILI9481_ENABLE_BACKLIGHT_CONTROL - ESP_LOGI(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (ILI9481_BCKL_ACTIVE_LVL==1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(ILI9481_BCKL, tmp); -#endif -} - /********************** * STATIC FUNCTIONS **********************/ diff --git a/lvgl_tft/ili9481.h b/lvgl_tft/ili9481.h index c0d07fe..1562398 100644 --- a/lvgl_tft/ili9481.h +++ b/lvgl_tft/ili9481.h @@ -25,20 +25,12 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9481_DC CONFIG_LV_DISP_PIN_DC -#define ILI9481_RST CONFIG_LV_DISP_PIN_RST -#define ILI9481_USE_RST CONFIG_LV_DISP_USE_RST -#define ILI9481_BCKL CONFIG_LV_DISP_PIN_BCKL - -#define ILI9481_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL -#define ILI9481_INVERT_COLORS CONFIG_LV_INVERT_COLORS +#define ILI9481_DC CONFIG_LV_DISP_PIN_DC +#define ILI9481_RST CONFIG_LV_DISP_PIN_RST +#define ILI9481_USE_RST CONFIG_LV_DISP_USE_RST +#define ILI9481_INVERT_COLORS CONFIG_LV_INVERT_COLORS #define ILI9481_DISPLAY_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL - #define ILI9481_BCKL_ACTIVE_LVL 1 -#else - #define ILI9481_BCKL_ACTIVE_LVL 0 -#endif /******************* * ILI9481 REGS @@ -118,7 +110,6 @@ extern "C" { void ili9481_init(void); void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void ili9481_enable_backlight(bool backlight); /********************** * MACROS diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index 166bef8..829f0bd 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -65,31 +65,14 @@ void ili9486_init(void) {0x00, {0}, 0xff}, }; -#if ILI9486_BCKL == 15 - gpio_config_t io_conf; - io_conf.intr_type = GPIO_PIN_INTR_DISABLE; - io_conf.mode = GPIO_MODE_OUTPUT; - io_conf.pin_bit_mask = GPIO_SEL_15; - io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; - io_conf.pull_up_en = GPIO_PULLUP_DISABLE; - gpio_config(&io_conf); -#endif - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ILI9486_DC); + gpio_pad_select_gpio(ILI9486_DC); gpio_set_direction(ILI9486_DC, GPIO_MODE_OUTPUT); #if ILI9486_USE_RST - gpio_pad_select_gpio(ILI9486_RST); + gpio_pad_select_gpio(ILI9486_RST); gpio_set_direction(ILI9486_RST, GPIO_MODE_OUTPUT); -#endif -#if ILI9486_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(ILI9486_BCKL); - gpio_set_direction(ILI9486_BCKL, GPIO_MODE_OUTPUT); -#endif - -#if ILI9486_USE_RST //Reset the display gpio_set_level(ILI9486_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); @@ -110,9 +93,7 @@ void ili9486_init(void) cmd++; } - ili9486_enable_backlight(true); - - ili9486_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); + ili9486_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); } void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) @@ -144,22 +125,6 @@ void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col ili9486_send_color((void*) color_map, size * 2); } -void ili9486_enable_backlight(bool backlight) -{ -#if ILI9486_ENABLE_BACKLIGHT_CONTROL - ESP_LOGI(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (ILI9486_BCKL_ACTIVE_LVL==1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(ILI9486_BCKL, tmp); -#endif -} - /********************** * STATIC FUNCTIONS **********************/ diff --git a/lvgl_tft/ili9486.h b/lvgl_tft/ili9486.h index 08e002f..0b3f4fb 100644 --- a/lvgl_tft/ili9486.h +++ b/lvgl_tft/ili9486.h @@ -28,15 +28,7 @@ extern "C" { #define ILI9486_DC CONFIG_LV_DISP_PIN_DC #define ILI9486_RST CONFIG_LV_DISP_PIN_RST #define ILI9486_USE_RST CONFIG_LV_DISP_USE_RST -#define ILI9486_BCKL CONFIG_LV_DISP_PIN_BCKL -#define ILI9486_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL - -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL - #define ILI9486_BCKL_ACTIVE_LVL 1 -#else - #define ILI9486_BCKL_ACTIVE_LVL 0 -#endif /********************** * TYPEDEFS @@ -48,7 +40,6 @@ extern "C" { void ili9486_init(void); void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void ili9486_enable_backlight(bool backlight); /********************** * MACROS diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index ce8bba0..feb9fba 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -76,20 +76,13 @@ void ili9488_init(void) }; //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ILI9488_DC); + gpio_pad_select_gpio(ILI9488_DC); gpio_set_direction(ILI9488_DC, GPIO_MODE_OUTPUT); #if ILI9488_USE_RST - gpio_pad_select_gpio(ILI9488_RST); + gpio_pad_select_gpio(ILI9488_RST); gpio_set_direction(ILI9488_RST, GPIO_MODE_OUTPUT); -#endif -#if ILI9488_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(ILI9488_BCKL); - gpio_set_direction(ILI9488_BCKL, GPIO_MODE_OUTPUT); -#endif - -#if ILI9488_USE_RST //Reset the display gpio_set_level(ILI9488_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); @@ -114,9 +107,7 @@ void ili9488_init(void) cmd++; } - ili9488_enable_backlight(true); - - ili9488_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); + ili9488_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); } // Flush function based on mvturnho repo @@ -175,22 +166,6 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col heap_caps_free(mybuf); } -void ili9488_enable_backlight(bool backlight) -{ -#if ILI9488_ENABLE_BACKLIGHT_CONTROL - ESP_LOGI(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (ILI9488_BCKL_ACTIVE_LVL==1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(ILI9488_BCKL, tmp); -#endif -} - /********************** * STATIC FUNCTIONS **********************/ diff --git a/lvgl_tft/ili9488.h b/lvgl_tft/ili9488.h index 2ecfd44..1c6c6f9 100644 --- a/lvgl_tft/ili9488.h +++ b/lvgl_tft/ili9488.h @@ -27,16 +27,7 @@ extern "C" { *********************/ #define ILI9488_DC CONFIG_LV_DISP_PIN_DC #define ILI9488_RST CONFIG_LV_DISP_PIN_RST -#define ILI9488_USE_RST CONFIG_LV_DISP_USE_RST -#define ILI9488_BCKL CONFIG_LV_DISP_PIN_BCKL - -#define ILI9488_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL - -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL - #define ILI9488_BCKL_ACTIVE_LVL 1 -#else - #define ILI9488_BCKL_ACTIVE_LVL 0 -#endif +#define ILI9488_USE_RST CONFIG_LV_DISP_USE_RSTS /******************* * ILI9488 REGS @@ -155,7 +146,6 @@ typedef struct { void ili9488_init(void); void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void ili9488_enable_backlight(bool backlight); /********************** * MACROS diff --git a/lvgl_tft/pcd8544.c b/lvgl_tft/pcd8544.c new file mode 100644 index 0000000..49d067e --- /dev/null +++ b/lvgl_tft/pcd8544.c @@ -0,0 +1,148 @@ +/** + * @file pcd8544.c + * + * Roughly based on: + * https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library + * https://github.com/olikraus/u8g2 + */ + +#include "disp_spi.h" +#include "driver/gpio.h" + +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include "pcd8544.h" + +#define TAG "lv_pcd8544" + +/********************** + * MACROS + **********************/ + +#define BIT_SET(a,b) ((a) |= (1U<<(b))) +#define BIT_CLEAR(a,b) ((a) &= ~(1U<<(b))) + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void pcd8544_send_cmd(uint8_t cmd) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(PCD8544_DC, 0); /*Command mode*/ + disp_spi_send_data(&cmd, 1); +} + +static void pcd8544_send_data(void * data, uint16_t length) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(PCD8544_DC, 1); /*Data mode*/ + disp_spi_send_data(data, length); +} + +static void pcd8544_send_colors(void * data, uint16_t length) +{ + gpio_set_level(PCD8544_DC, 1); /*Data mode*/ + disp_spi_send_colors(data, length); +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void pcd8544_init(void){ + + // TODO: orientation + + // Initialize non-SPI GPIOs + gpio_pad_select_gpio(PCD8544_DC); + gpio_set_direction(PCD8544_DC, GPIO_MODE_OUTPUT); + gpio_pad_select_gpio(PCD8544_RST); + gpio_set_direction(PCD8544_RST, GPIO_MODE_OUTPUT); + + // Reset the display + gpio_set_level(PCD8544_RST, 0); + vTaskDelay(100 / portTICK_RATE_MS); + gpio_set_level(PCD8544_RST, 1); + vTaskDelay(100 / portTICK_RATE_MS); + + pcd8544_send_cmd(0x21); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */ + pcd8544_send_cmd(0x06); /* temp. control: b10 = 2 */ + pcd8544_send_cmd(0x13); /* bias system 1:48 */ + pcd8544_send_cmd(0xc0); /* medium Vop = Contrast 0x40 = 64 */ + + pcd8544_send_cmd(0x20); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=0) */ + pcd8544_send_cmd(0x0c); /* display mode normal */ +} + +void pcd8544_set_contrast (uint8_t contrast){ + if (contrast > 0x7f){ + contrast = 0x7f; + } + pcd8544_send_cmd(0x21); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */ + pcd8544_send_cmd(0x80 | contrast); /* medium Vop = Contrast */ +} + +void pcd8544_rounder(lv_disp_drv_t * disp_drv, lv_area_t *area){ + uint8_t hor_max = disp_drv->hor_res; + uint8_t ver_max = disp_drv->ver_res; + + area->x1 = 0; + area->y1 = 0; + area->x2 = hor_max - 1; + area->y2 = ver_max - 1; +} + +void pcd8544_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa){ + + uint8_t set = (color.full == 0) && (LV_OPA_TRANSP != opa); + + uint16_t byte_index = x + (( y>>3 ) * buf_w); + uint8_t bit_index = y & 0x7; + + if (set) { + BIT_SET(buf[byte_index], bit_index); + } else { + BIT_CLEAR(buf[byte_index], bit_index); + } +} + +void pcd8544_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_map){ + + pcd8544_send_cmd(0x20); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=0) */ + + uint8_t * buf = (uint8_t *) color_map; + + // Check if the whole frame buffer can be sent in a single SPI transaction + + if ((area->x1 == 0) && (area->y1 == 0) && (area->x2 == (disp_drv->hor_res - 1)) && (area->y2 == (disp_drv->ver_res - 1))){ + + // send complete frame buffer at once. + // NOTE: disp_spi_send_colors triggers lv_disp_flush_ready + + pcd8544_send_cmd(0x40); /* set Y address */ + pcd8544_send_cmd(0x80); /* set X address */ + pcd8544_send_colors(buf, disp_drv->hor_res * disp_drv->ver_res / 8); + + } else { + + // send horizontal tiles + + uint16_t bank_start = area->y1 / 8; + uint16_t bank_end = area->y2 / 8; + + uint16_t bank; + uint16_t cols_to_update = area->x2 - area->x1 + 1; + for (bank = bank_start ; bank <= bank_end ; bank++ ){ + pcd8544_send_cmd(0x40 | bank ); /* set Y address */ + pcd8544_send_cmd(0x80 | area->x1 ); /* set X address */ + uint16_t offset = bank * disp_drv->hor_res + area->x1; + pcd8544_send_data(&buf[offset], cols_to_update); + } + + lv_disp_flush_ready(disp_drv); + } +} diff --git a/lvgl_tft/pcd8544.h b/lvgl_tft/pcd8544.h new file mode 100644 index 0000000..24fcc71 --- /dev/null +++ b/lvgl_tft/pcd8544.h @@ -0,0 +1,57 @@ + +/** + * @file pcd8544.h + * + */ + +#ifndef PCD8544_H +#define PCD8544_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/********************* + * DEFINES + *********************/ + +#define PCD8544_DC CONFIG_LV_DISP_PIN_DC +#define PCD8544_RST CONFIG_LV_DISP_PIN_RST +#define PCD8544_BCKL CONFIG_LV_DISP_PIN_BCKL + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void pcd8544_init(void); +void pcd8544_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void pcd8544_rounder(lv_disp_drv_t * disp_drv, lv_area_t *area); +void pcd8544_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); +void pcd8544_set_contrast(uint8_t contrast); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*PCD8544_H*/ diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index c08ff88..b4f8e2a 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -148,29 +148,12 @@ void ra8875_init(void) ESP_LOGI(TAG, "Initializing RA8875..."); -#if (CONFIG_LV_DISP_PIN_BCKL == 15) - gpio_config_t io_conf; - io_conf.intr_type = GPIO_PIN_INTR_DISABLE; - io_conf.mode = GPIO_MODE_OUTPUT; - io_conf.pin_bit_mask = GPIO_SEL_15; - io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; - io_conf.pull_up_en = GPIO_PULLUP_DISABLE; - gpio_config(&io_conf); -#endif - // Initialize non-SPI GPIOs #if RA8875_USE_RST gpio_pad_select_gpio(RA8875_RST); gpio_set_direction(RA8875_RST, GPIO_MODE_OUTPUT); -#endif -#ifdef CONFIG_LV_DISP_PIN_BCKL - gpio_pad_select_gpio(CONFIG_LV_DISP_PIN_BCKL); - gpio_set_direction(CONFIG_LV_DISP_PIN_BCKL, GPIO_MODE_OUTPUT); -#endif - -#if RA8875_USE_RST // Reset the RA8875 gpio_set_level(RA8875_RST, 0); vTaskDelay(DIV_ROUND_UP(100, portTICK_RATE_MS)); @@ -200,28 +183,8 @@ void ra8875_init(void) ESP_LOGW(TAG, "WARNING: Memory clear timed out; RA8875 may be unresponsive."); } - // Enable the display and backlight + // Enable the display ra8875_enable_display(true); - ra8875_enable_backlight(true); -} - -void ra8875_enable_backlight(bool backlight) -{ -#if CONFIG_LV_ENABLE_BACKLIGHT_CONTROL - ESP_LOGI(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - - #if CONFIG_LV_BACKLIGHT_ACTIVE_LVL - tmp = backlight ? 1 : 0; - #else - tmp = backlight ? 0 : 1; - #endif - -#ifdef CONFIG_LV_DISP_PIN_BCKL - gpio_set_level(CONFIG_LV_DISP_PIN_BCKL, tmp); -#endif - -#endif } void ra8875_enable_display(bool enable) diff --git a/lvgl_tft/ra8875.h b/lvgl_tft/ra8875.h index 6942c3e..28c77f9 100644 --- a/lvgl_tft/ra8875.h +++ b/lvgl_tft/ra8875.h @@ -97,7 +97,6 @@ extern "C" { **********************/ void ra8875_init(void); -void ra8875_enable_backlight(bool backlight); void ra8875_enable_display(bool enable); void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); diff --git a/lvgl_tft/ssd1306.c b/lvgl_tft/ssd1306.c index 43e5966..c845eac 100644 --- a/lvgl_tft/ssd1306.c +++ b/lvgl_tft/ssd1306.c @@ -13,10 +13,9 @@ /********************* * INCLUDES *********************/ -#include "driver/i2c.h" #include "assert.h" -#include "lvgl_i2c_conf.h" +#include "lvgl_i2c/i2c_manager.h" #include "ssd1306.h" @@ -25,6 +24,7 @@ *********************/ #define TAG "SSD1306" +#define OLED_I2C_PORT (CONFIG_LV_I2C_DISPLAY_PORT) // SLA (0x3C) + WRITE_MODE (0x00) = 0x78 (0b01111000) #define OLED_I2C_ADDRESS 0x3C #define OLED_WIDTH 128 @@ -70,8 +70,6 @@ // Charge Pump (pg.62) #define OLED_CMD_SET_CHARGE_PUMP 0x8D // follow with 0x14 -#define OLED_IIC_FREQ_HZ 400000 // I2C colock frequency - /********************** * TYPEDEFS **********************/ @@ -101,10 +99,10 @@ void ssd1306_init(void) uint8_t orientation_1 = 0; uint8_t orientation_2 = 0; -#if defined (CONFIG_DISPLAY_ORIENTATION_LANDSCAPE) +#if defined (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE) orientation_1 = OLED_CMD_SET_SEGMENT_REMAP; orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_REMAP; -#elif defined (CONFIG_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) +#elif defined (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) orientation_1 = 0xA0; orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_NORMAL; #else @@ -213,44 +211,15 @@ void ssd1306_sleep_out(void) static uint8_t send_data(lv_disp_drv_t *disp_drv, void *bytes, size_t bytes_len) { (void) disp_drv; - esp_err_t err; uint8_t *data = (uint8_t *) bytes; - i2c_cmd_handle_t cmd = i2c_cmd_link_create(); - - i2c_master_start(cmd); - i2c_master_write_byte(cmd, (OLED_I2C_ADDRESS << 1) | I2C_MASTER_WRITE, true); - - for (size_t idx = 0; idx < bytes_len; idx++) { - i2c_master_write_byte(cmd, data[idx], true); - } - - i2c_master_stop(cmd); - - /* Send queued commands */ - err = i2c_master_cmd_begin(DISP_I2C_PORT, cmd, 10 / portTICK_PERIOD_MS); - i2c_cmd_link_delete(cmd); - - return ESP_OK == err ? 0 : 1; + return lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, data[0], data + 1, bytes_len - 1 ); } static uint8_t send_pixels(lv_disp_drv_t *disp_drv, void *color_buffer, size_t buffer_len) { (void) disp_drv; - esp_err_t err; - i2c_cmd_handle_t cmd = i2c_cmd_link_create(); - i2c_master_start(cmd); - i2c_master_write_byte(cmd, (OLED_I2C_ADDRESS << 1) | I2C_MASTER_WRITE, true); - - i2c_master_write_byte(cmd, OLED_CONTROL_BYTE_DATA_STREAM, true); - i2c_master_write(cmd, (uint8_t *) color_buffer, buffer_len, true); - i2c_master_stop(cmd); - - /* Send queued commands */ - err = i2c_master_cmd_begin(DISP_I2C_PORT, cmd, 10 / portTICK_PERIOD_MS); - i2c_cmd_link_delete(cmd); - - return ESP_OK == err ? 0 : 1; + return lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, OLED_CONTROL_BYTE_DATA_STREAM, color_buffer, buffer_len); } diff --git a/lvgl_tft/ssd1306.h b/lvgl_tft/ssd1306.h index 2145493..62bd0e6 100644 --- a/lvgl_tft/ssd1306.h +++ b/lvgl_tft/ssd1306.h @@ -25,8 +25,6 @@ extern "C" { /********************* * DEFINES *********************/ -#define SSD1306_SDA CONFIG_LV_DISP_PIN_SDA -#define SSD1306_SCL CONFIG_LV_DISP_PIN_SCL #define SSD1306_DISPLAY_ORIENTATION TFT_ORIENTATION_LANDSCAPE /********************** diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index 2507118..8be725b 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -8,12 +8,15 @@ *********************/ #include "st7735s.h" #include "disp_spi.h" -#include "driver/i2c.h" #include "driver/gpio.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 + #include "lvgl_i2c/i2c_manager.h" +#endif + /********************* * DEFINES *********************/ @@ -38,7 +41,6 @@ static void st7735s_send_cmd(uint8_t cmd); static void st7735s_send_data(void * data, uint16_t length); static void st7735s_send_color(void * data, uint16_t length); static void st7735s_set_orientation(uint8_t orientation); -static void i2c_master_init(); static void axp192_write_byte(uint8_t addr, uint8_t data); static void axp192_init(); static void axp192_sleep_in(); @@ -60,7 +62,6 @@ uint8_t st7735s_portrait_mode = 0; void st7735s_init(void) { #ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 - i2c_master_init(); axp192_init(); #endif @@ -163,12 +164,16 @@ void st7735s_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col void st7735s_sleep_in() { st7735s_send_cmd(0x10); - axp192_sleep_in(); + #ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 + axp192_sleep_in(); + #endif } void st7735s_sleep_out() { - axp192_sleep_out(); + #ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 + axp192_sleep_out(); + #endif st7735s_send_cmd(0x11); } @@ -218,55 +223,35 @@ static void st7735s_set_orientation(uint8_t orientation) st7735s_send_data((void *) &data[orientation], 1); } -static void i2c_master_init() -{ - i2c_config_t i2c_config = { - .mode = I2C_MODE_MASTER, - .sda_io_num = AXP192_SDA, - .scl_io_num = AXP192_SCL, - .sda_pullup_en = GPIO_PULLUP_ENABLE, - .scl_pullup_en = GPIO_PULLUP_ENABLE, - .master.clk_speed = 400000 - }; - i2c_param_config(I2C_NUM_0, &i2c_config); - i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0); -} +#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 -static void axp192_write_byte(uint8_t addr, uint8_t data) -{ - esp_err_t ret; - i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + static void axp192_write_byte(uint8_t addr, uint8_t data) + { + err = lvgl_i2c_write(CONFIG_LV_I2C_DISPLAY_PORT, AXP192_I2C_ADDRESS, addr, &data, 1); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "AXP192 send failed. code: 0x%.2X", ret); + } + } - i2c_master_start(cmd); - i2c_master_write_byte(cmd, (AXP192_I2C_ADDRESS << 1) | I2C_MASTER_WRITE, true); - i2c_master_write_byte(cmd, addr, true); - i2c_master_write_byte(cmd, data, true); - i2c_master_stop(cmd); + static void axp192_init() + { + // information on how to init and use AXP192 ifor M5StickC taken from + // https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely - ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 10/portTICK_PERIOD_MS); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "AXP192 send failed. code: 0x%.2X", ret); - } - i2c_cmd_link_delete(cmd); -} + axp192_write_byte(0x10, 0xFF); // OLED_VPP Enable + axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V + axp192_sleep_out(); + ESP_LOGI(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3"); + } -static void axp192_init() -{ - // information on how to init and use AXP192 ifor M5StickC taken from - // https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely + static void axp192_sleep_in() + { + axp192_write_byte(0x12, 0x4b); + } - axp192_write_byte(0x10, 0xFF); // OLED_VPP Enable - axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V - axp192_sleep_out(); - ESP_LOGI(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3"); -} + static void axp192_sleep_out() + { + axp192_write_byte(0x12, 0x4d); + } -static void axp192_sleep_in() -{ - axp192_write_byte(0x12, 0x4b); -} - -static void axp192_sleep_out() -{ - axp192_write_byte(0x12, 0x4d); -} +#endif diff --git a/lvgl_tft/st7735s.h b/lvgl_tft/st7735s.h index 71924bf..2d02ed0 100644 --- a/lvgl_tft/st7735s.h +++ b/lvgl_tft/st7735s.h @@ -29,9 +29,6 @@ extern "C" { #define ST7735S_RST CONFIG_LV_DISP_PIN_RST #define ST7735S_USE_RST CONFIG_LV_DISP_USE_RST -#define AXP192_SDA CONFIG_LV_AXP192_PIN_SDA -#define AXP192_SCL CONFIG_LV_AXP192_PIN_SCL - #define ST7735S_INVERT_COLORS CONFIG_LV_INVERT_COLORS // Defines are taken from @@ -134,7 +131,6 @@ extern "C" { void st7735s_init(void); void st7735s_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void st7735s_enable_backlight(bool backlight); void st7735s_sleep_in(void); void st7735s_sleep_out(void); diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 9a79022..de7b35a 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -35,7 +35,7 @@ typedef struct { **********************/ static void st7789_set_orientation(uint8_t orientation); -static void st7789_send_color(void *data, uint16_t length); +static void st7789_send_color(void *data, size_t length); /********************** * STATIC VARIABLES @@ -94,11 +94,6 @@ void st7789_init(void) gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT); #endif -#if ST7789_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(ST7789_BCKL); - gpio_set_direction(ST7789_BCKL, GPIO_MODE_OUTPUT); -#endif - //Reset the display #if !defined(ST7789_SOFT_RST) gpio_set_level(ST7789_RST, 0); @@ -122,30 +117,12 @@ void st7789_init(void) cmd++; } - st7789_enable_backlight(true); - st7789_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); } -void st7789_enable_backlight(bool backlight) -{ -#if ST7789_ENABLE_BACKLIGHT_CONTROL - printf("%s backlight.\n", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (ST7789_BCKL_ACTIVE_LVL==1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(ST7789_BCKL, tmp); -#endif -} - -/* The ST7789 display controller can drive 320*240 displays, when using a 240*240 - * display there's a gap of 80px, we need to edit the coordinates to take into - * account that gap, this is not necessary in all orientations. */ +/* The ST7789 display controller can drive up to 320*240 displays, when using a 240*240 or 240*135 + * displays there's a gap of 80px or 40/52/53px respectively. 52px or 53x offset depends on display orientation. + * We need to edit the coordinates to take into account those gaps, this is not necessary in all orientations. */ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { uint8_t data[4] = {0}; @@ -162,13 +139,29 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo offsety2 += CONFIG_LV_TFT_DISPLAY_Y_OFFSET; #elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240) -#if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) - offsetx1 += 80; - offsetx2 += 80; -#elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) - offsety1 += 80; - offsety2 += 80; -#endif + #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) + offsetx1 += 80; + offsetx2 += 80; + #elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + offsety1 += 80; + offsety2 += 80; + #endif +#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 135) + #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) || \ + (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + offsetx1 += 40; + offsetx2 += 40; + offsety1 += 53; + offsety2 += 53; + #endif +#elif (LV_HOR_RES_MAX == 135) && (LV_VER_RES_MAX == 240) + #if (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE) || \ + (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + offsetx1 += 52; + offsetx2 += 52; + offsety1 += 40; + offsety2 += 40; + #endif #endif /*Column addresses*/ @@ -190,7 +183,7 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo /*Memory write*/ st7789_send_cmd(ST7789_RAMWR); - uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); + size_t size = (size_t)lv_area_get_width(area) * (size_t)lv_area_get_height(area); st7789_send_color((void*)color_map, size * 2); @@ -213,7 +206,7 @@ void st7789_send_data(void * data, uint16_t length) disp_spi_send_data(data, length); } -static void st7789_send_color(void * data, uint16_t length) +static void st7789_send_color(void * data, size_t length) { disp_wait_for_pending_transactions(); gpio_set_level(ST7789_DC, 1); diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index 64ac3f1..cacb31b 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -23,7 +23,6 @@ extern "C" #define ST7789_DC CONFIG_LV_DISP_PIN_DC #define ST7789_RST CONFIG_LV_DISP_PIN_RST -#define ST7789_BCKL CONFIG_LV_DISP_PIN_BCKL #if CONFIG_LV_DISP_USE_RST #if CONFIG_LV_DISP_ST7789_SOFT_RESET @@ -33,16 +32,8 @@ extern "C" #define ST7789_SOFT_RST #endif - -#define ST7789_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define ST7789_INVERT_COLORS CONFIG_LV_INVERT_COLORS -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL - #define ST7789_BCKL_ACTIVE_LVL 1 -#else - #define ST7789_BCKL_ACTIVE_LVL 0 -#endif - /* ST7789 commands */ #define ST7789_NOP 0x00 #define ST7789_SWRESET 0x01 @@ -121,7 +112,6 @@ extern "C" void st7789_init(void); void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); -void st7789_enable_backlight(bool backlight); void st7789_send_cmd(uint8_t cmd); void st7789_send_data(void *data, uint16_t length); diff --git a/lvgl_tft/st7796s.c b/lvgl_tft/st7796s.c index 44959f8..7de92ef 100644 --- a/lvgl_tft/st7796s.c +++ b/lvgl_tft/st7796s.c @@ -81,16 +81,6 @@ void st7796s_init(void) {0, {0}, 0xff}, }; -#if ST7796S_BCKL == 15 - gpio_config_t io_conf; - io_conf.intr_type = GPIO_PIN_INTR_DISABLE; - io_conf.mode = GPIO_MODE_OUTPUT; - io_conf.pin_bit_mask = GPIO_SEL_15; - io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; - io_conf.pull_up_en = GPIO_PULLUP_DISABLE; - gpio_config(&io_conf); -#endif - //Initialize non-SPI GPIOs gpio_pad_select_gpio(ST7796S_DC); gpio_set_direction(ST7796S_DC, GPIO_MODE_OUTPUT); @@ -98,14 +88,7 @@ void st7796s_init(void) #if ST7796S_USE_RST gpio_pad_select_gpio(ST7796S_RST); gpio_set_direction(ST7796S_RST, GPIO_MODE_OUTPUT); -#endif -#if ST7796S_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(ST7796S_BCKL); - gpio_set_direction(ST7796S_BCKL, GPIO_MODE_OUTPUT); -#endif - -#if ST7796S_USE_RST //Reset the display gpio_set_level(ST7796S_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); @@ -128,8 +111,6 @@ void st7796s_init(void) cmd++; } - st7796s_enable_backlight(true); - st7796s_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); #if ST7796S_INVERT_COLORS == 1 @@ -167,22 +148,6 @@ void st7796s_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_ st7796s_send_color((void *)color_map, size * 2); } -void st7796s_enable_backlight(bool backlight) -{ -#if ST7796S_ENABLE_BACKLIGHT_CONTROL - ESP_LOGI(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); - uint32_t tmp = 0; - -#if (ST7796S_BCKL_ACTIVE_LVL == 1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - gpio_set_level(ST7796S_BCKL, tmp); -#endif -} - void st7796s_sleep_in() { uint8_t data[] = {0x08}; diff --git a/lvgl_tft/st7796s.h b/lvgl_tft/st7796s.h index 48e566d..95c6d4f 100644 --- a/lvgl_tft/st7796s.h +++ b/lvgl_tft/st7796s.h @@ -26,20 +26,12 @@ extern "C" /********************* * DEFINES *********************/ -#define ST7796S_DC CONFIG_LV_DISP_PIN_DC -#define ST7796S_RST CONFIG_LV_DISP_PIN_RST -#define ST7796S_USE_RST CONFIG_LV_DISP_USE_RST -#define ST7796S_BCKL CONFIG_LV_DISP_PIN_BCKL - -#define ST7796S_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL -#define ST7796S_INVERT_COLORS CONFIG_LV_INVERT_COLORS +#define ST7796S_DC CONFIG_LV_DISP_PIN_DC +#define ST7796S_RST CONFIG_LV_DISP_PIN_RST +#define ST7796S_USE_RST CONFIG_LV_DISP_USE_RST +#define ST7796S_INVERT_COLORS CONFIG_LV_INVERT_COLORS #define ST7796S_DISPLAY_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION -#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL -#define ST7796S_BCKL_ACTIVE_LVL 1 -#else -#define ST7796S_BCKL_ACTIVE_LVL 0 -#endif /******************* * ST7796S REGS @@ -119,7 +111,6 @@ extern "C" void st7796s_init(void); void st7796s_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); - void st7796s_enable_backlight(bool backlight); /********************** * MACROS diff --git a/lvgl_touch/Kconfig b/lvgl_touch/Kconfig index bf17e04..859ea18 100644 --- a/lvgl_touch/Kconfig +++ b/lvgl_touch/Kconfig @@ -1,29 +1,29 @@ menu "LVGL Touch controller" config LV_TOUCH_CONTROLLER - int - default 0 if LV_TOUCH_CONTROLLER_NONE - default 1 if LV_TOUCH_CONTROLLER_XPT2046 - default 2 if LV_TOUCH_CONTROLLER_FT6X06 - default 3 if LV_TOUCH_CONTROLLER_STMPE610 - default 4 if LV_TOUCH_CONTROLLER_ADCRAW - default 5 if LV_TOUCH_CONTROLLER_FT81X - default 6 if LV_TOUCH_CONTROLLER_RA8875 - default 7 if LV_TOUCH_CONTROLLER_GT911 - default 8 if LV_TOUCH_CONTROLLER_L58 + int + default 0 if LV_TOUCH_CONTROLLER_NONE + default 1 if LV_TOUCH_CONTROLLER_XPT2046 + default 2 if LV_TOUCH_CONTROLLER_FT6X06 + default 3 if LV_TOUCH_CONTROLLER_STMPE610 + default 4 if LV_TOUCH_CONTROLLER_ADCRAW + default 5 if LV_TOUCH_CONTROLLER_FT81X + default 6 if LV_TOUCH_CONTROLLER_RA8875 + default 7 if LV_TOUCH_CONTROLLER_GT911 + default 8 if LV_TOUCH_CONTROLLER_L58 choice - prompt "Select a touch panel controller model." - default LV_TOUCH_CONTROLLER_NONE - help - Select the controller for your touch panel. + prompt "Select a touch panel controller model." + default LV_TOUCH_CONTROLLER_NONE + help + Select the controller for your touch panel. - config LV_TOUCH_CONTROLLER_NONE - bool "None" - config LV_TOUCH_CONTROLLER_XPT2046 + config LV_TOUCH_CONTROLLER_NONE + bool "None" + config LV_TOUCH_CONTROLLER_XPT2046 select LV_TOUCH_DRIVER_PROTOCOL_SPI bool "XPT2046" - config LV_TOUCH_CONTROLLER_FT6X06 - select LV_TOUCH_DRIVER_PROTOCOL_I2C + config LV_TOUCH_CONTROLLER_FT6X06 + select LV_I2C_TOUCH bool "FT6X06" config LV_TOUCH_CONTROLLER_L58 @@ -44,16 +44,16 @@ menu "LVGL Touch controller" select LV_TOUCH_DRIVER_DISPLAY bool "RA8875" config LV_TOUCH_CONTROLLER_GT911 - select LV_TOUCH_DRIVER_PROTOCOL_I2C + select LV_I2C_TOUCH bool "GT911" endchoice - + config LV_TOUCH_DRIVER_PROTOCOL_SPI bool help Touch controller protocol SPI - config LV_TOUCH_DRIVER_PROTOCOL_I2C + config LV_I2C_TOUCH bool help Touch controller protocol I2C @@ -67,37 +67,20 @@ menu "LVGL Touch controller" bool help Touch controller uses same interface/device as display - (Note: Display must be initialized before touch) - - choice - prompt "Touch I2C port" - depends on LV_TOUCH_DRIVER_PROTOCOL_I2C - - default LV_TOUCH_I2C_PORT_0 - help - Select the I2C port used by the touch controller. + (Note: Display must be initialized before touch) - config LV_TOUCH_I2C_PORT_0 - bool "I2C PORT 0" - config LV_TOUCH_I2C_PORT_1 - bool "I2C PORT 1" - endchoice - choice prompt "Touch Controller SPI Bus." depends on LV_TOUCH_DRIVER_PROTOCOL_SPI - - default LV_TOUCH_CONTROLLER_SPI_VSPI if !IDF_TARGET_ESP32S2 - default LV_TOUCH_CONTROLLER_SPI_FSPI if IDF_TARGET_ESP32S2 + + default LV_TOUCH_CONTROLLER_SPI2_HOST help - Select the SPI Bus the TFT Display is attached to. - - config LV_TOUCH_CONTROLLER_SPI_HSPI - bool "HSPI" - config LV_TOUCH_CONTROLLER_SPI_VSPI - bool "VSPI" if !IDF_TARGET_ESP32S2 - config LV_TOUCH_CONTROLLER_SPI_FSPI - bool "FSPI" if IDF_TARGET_ESP32S2 + Select the SPI Bus the touch controller is attached to. + + config LV_TOUCH_CONTROLLER_SPI2_HOST + bool "SPI2_HOST" + config LV_TOUCH_CONTROLLER_SPI3_HOST + bool "SPI3_HOST" endchoice menu "Touchpanel (L58) Lilygo Pin Assignments" @@ -137,10 +120,7 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_MISO int prompt "GPIO for MISO (Master In Slave Out)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - + default 35 if LV_PREDEFINED_PINS_38V1 default 19 help @@ -149,9 +129,6 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_MOSI int prompt "GPIO for MOSI (Master Out Slave In)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 default 32 if LV_PREDEFINED_PINS_38V1 default 23 @@ -160,10 +137,7 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_CLK int "GPIO for CLK (SCK / Serial Clock)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - + default 26 if LV_PREDEFINED_PINS_38V1 default 18 help @@ -171,9 +145,7 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_CS int "GPIO for CS (Slave Select)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - + default 33 if LV_PREDEFINED_PINS_38V1 default 5 help @@ -181,16 +153,13 @@ menu "LVGL Touch controller" config LV_TOUCH_PIN_IRQ int "GPIO for IRQ (Interrupt Request)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - + default 27 if LV_PREDEFINED_PINS_38V4 default 25 help Configure the touchpanel IRQ pin here. endmenu - + menu "Touchpanel Configuration (XPT2046)" depends on LV_TOUCH_CONTROLLER_XPT2046 @@ -217,11 +186,11 @@ menu "LVGL Touch controller" prompt "Maximum Y coordinate value." default 4095 if LV_PREDEFINED_PINS_38V4 default 1900 - - config LV_TOUCH_XY_SWAP - bool - prompt "Swap XY." - default y + + config LV_TOUCH_XY_SWAP + bool + prompt "Swap XY." + default y config LV_TOUCH_INVERT_X bool @@ -248,38 +217,13 @@ menu "LVGL Touch controller" endchoice endmenu - menu "Touchpanel (FT6X06) Pin Assignments" - depends on LV_TOUCH_CONTROLLER_FT6X06 - - config LV_TOUCH_I2C_SDA - int - prompt "GPIO for SDA (I2C)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - - default 21 - help - Configure the I2C touchpanel SDA pin here. - - config LV_TOUCH_I2C_SCL - int "GPIO for clock signal SCL (I2C)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - - default 22 - help - Configure the I2C touchpanel SCL pin here. - endmenu - menu "Touchpanel Configuration (FT6X06)" depends on LV_TOUCH_CONTROLLER_FT6X06 - config LV_FT6X36_SWAPXY - bool - prompt "Swap X with Y coordinate." - default y + config LV_FT6X36_SWAPXY + bool + prompt "Swap X with Y coordinate." + default n config LV_FT6X36_INVERT_X bool @@ -289,20 +233,24 @@ menu "LVGL Touch controller" config LV_FT6X36_INVERT_Y bool prompt "Invert Y coordinate value." - default y + default n + + config LV_FT6X36_COORDINATES_QUEUE + bool + prompt "Send coordinates to FreeRTOS queue." + default n + help + Receive from the FreeRTOS queue using the handle 'ft6x36_touch_queue_handle'. endmenu - + menu "Touchpanel (STMPE610) Pin Assignments" depends on LV_TOUCH_CONTROLLER_STMPE610 config LV_TOUCH_SPI_MISO int prompt "GPIO for MISO (Master In Slave Out)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - + default 35 if LV_PREDEFINED_PINS_38V1 default 19 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING default 19 @@ -314,9 +262,6 @@ menu "LVGL Touch controller" # TODO Fix default for ESP32C3 int prompt "GPIO for MOSI (Master Out Slave In)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 default 32 if LV_PREDEFINED_PINS_38V1 default 18 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING @@ -327,9 +272,6 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_CLK int "GPIO for CLK (SCK / Serial Clock)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 default 26 if LV_PREDEFINED_PINS_38V1 default 5 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING @@ -339,10 +281,6 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_CS int "GPIO for CS (Slave Select)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - default 33 if LV_PREDEFINED_PINS_38V1 default 32 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING default 5 @@ -372,11 +310,11 @@ menu "LVGL Touch controller" int prompt "Maximum Y coordinate value." default 3800 - + config LV_TOUCH_XY_SWAP - bool - prompt "Swap XY." - default n + bool + prompt "Swap XY." + default n config LV_TOUCH_INVERT_X bool @@ -388,7 +326,7 @@ menu "LVGL Touch controller" prompt "Invert Y coordinate value." default y endmenu - + menu "Touchpanel (ADCRAW) Pin Assignments" depends on LV_TOUCH_CONTROLLER_ADCRAW @@ -409,7 +347,7 @@ menu "LVGL Touch controller" help Configure the touchpanel Y- pin. Must be ADC input. - + config LV_TOUCHSCREEN_RESISTIVE_PIN_XL int prompt "GPIO X-" @@ -475,25 +413,25 @@ menu "LVGL Touch controller" config LV_TOUCH_X_MIN int prompt "Minimum X coordinate ADC value" - range 0 1023 + range 0 1023 default 0 config LV_TOUCH_Y_MIN int prompt "Minimum Y coordinate ADC value" - range 0 1023 + range 0 1023 default 0 config LV_TOUCH_X_MAX int prompt "Maximum X coordinate ADC value" - range 0 1023 + range 0 1023 default 1023 config LV_TOUCH_Y_MAX int prompt "Maximum Y coordinate ADC value" - range 0 1023 + range 0 1023 default 1023 config LV_TOUCH_XY_SWAP @@ -514,13 +452,13 @@ menu "LVGL Touch controller" config LV_TOUCH_RA8875_SAMPLE_TIME int prompt "TP Sample Time Adjusting" - range 0 7 + range 0 7 default 0 config LV_TOUCH_RA8875_ADC_CLOCK int prompt "ADC Clock Setting" - range 0 7 + range 0 7 default 0 config LV_TOUCH_RA8875_WAKEUP_ENABLE @@ -539,39 +477,14 @@ menu "LVGL Touch controller" default y endmenu - - menu "Touchpanel (GT911) Pin Assignments" - depends on LV_TOUCH_CONTROLLER_GT911 - - config LV_TOUCH_I2C_SDA - int - prompt "GPIO for SDA (I2C)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - - default 2 - help - Configure the I2C touchpanel SDA pin here. - - config LV_TOUCH_I2C_SCL - int "GPIO for clock signal SCL (I2C)" - range 0 39 if IDF_TARGET_ESP32 - range 0 43 if IDF_TARGET_ESP32S2 - range 0 21 if IDF_TARGET_ESP32C3 - - default 3 - help - Configure the I2C touchpanel SCL pin here. - endmenu menu "Touchpanel Configuration (GT911)" depends on LV_TOUCH_CONTROLLER_GT911 - config LV_GT911_SWAPXY - bool - prompt "Swap X with Y coordinate." - default y + config LV_GT911_SWAPXY + bool + prompt "Swap X with Y coordinate." + default y config LV_GT911_INVERT_X bool @@ -585,4 +498,37 @@ menu "LVGL Touch controller" endmenu + choice + prompt "Select an I2C port for the touch panel" + default LV_I2C_TOUCH_PORT_0 + depends on LV_I2C_TOUCH + + config LV_I2C_TOUCH_PORT_0 + bool + prompt "I2C port 0" + help + I2C is shared peripheral managed by I2C Manager. In order to configure I2C Manager (pinout, etc.) see menu + Component config->I2C Port Settings. + + config LV_I2C_TOUCH_PORT_1 + bool + prompt "I2C port 1" + help + I2C is shared peripheral managed by I2C Manager. In order to configure I2C Manager (pinout, etc.) see menu + Component config->I2C Port Settings. + + endchoice + + config LV_I2C + bool + default y if LV_I2C_TOUCH + + config LV_I2C_TOUCH_PORT + int + default 1 if LV_I2C_TOUCH_PORT_1 + default 0 + endmenu + + + diff --git a/lvgl_touch/ft6x36.c b/lvgl_touch/ft6x36.c index 6e67d29..dae736c 100644 --- a/lvgl_touch/ft6x36.c +++ b/lvgl_touch/ft6x36.c @@ -1,55 +1,45 @@ /* * Copyright © 2020 Wolfgang Christl -* Permission is hereby granted, free of charge, to any person obtaining a copy of this -* software and associated documentation files (the “Software”), to deal in the Software -* without restriction, including without limitation the rights to use, copy, modify, merge, -* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the “Software”), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons * to whom the Software is furnished to do so, subject to the following conditions: * -* The above copyright notice and this permission notice shall be included in all copies or +* The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* +* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include -#include #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include #else #include #endif #include "ft6x36.h" -#include "tp_i2c.h" -#include "../lvgl_i2c_conf.h" +#include "lvgl_i2c/i2c_manager.h" #define TAG "FT6X36" +#define FT6X36_TOUCH_QUEUE_ELEMENTS 1 -ft6x36_status_t ft6x36_status; -uint8_t current_dev_addr; // set during init +static ft6x36_status_t ft6x36_status; +static uint8_t current_dev_addr; // set during init +static ft6x36_touch_t touch_inputs = { -1, -1, LV_INDEV_STATE_REL }; // -1 coordinates to designate it was never touched +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE +QueueHandle_t ft6x36_touch_queue_handle; +#endif -esp_err_t ft6x06_i2c_read8(uint8_t slave_addr, uint8_t register_addr, uint8_t *data_buf) { - i2c_cmd_handle_t i2c_cmd = i2c_cmd_link_create(); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (slave_addr << 1) | I2C_MASTER_WRITE, true); - i2c_master_write_byte(i2c_cmd, register_addr, I2C_MASTER_ACK); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (slave_addr << 1) | I2C_MASTER_READ, true); - - i2c_master_read_byte(i2c_cmd, data_buf, I2C_MASTER_NACK); - i2c_master_stop(i2c_cmd); - esp_err_t ret = i2c_master_cmd_begin(TOUCH_I2C_PORT, i2c_cmd, 1000 / portTICK_RATE_MS); - i2c_cmd_link_delete(i2c_cmd); - return ret; +static esp_err_t ft6x06_i2c_read8(uint8_t slave_addr, uint8_t register_addr, uint8_t *data_buf) { + return lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr, data_buf, 1); } /** @@ -75,42 +65,38 @@ uint8_t ft6x36_get_gesture_id() { * @retval None */ void ft6x06_init(uint16_t dev_addr) { - if (!ft6x36_status.inited) { -/* I2C master is initialized before calling this function */ -#if 0 - esp_err_t code = i2c_master_init(); -#else - esp_err_t code = ESP_OK; -#endif + ft6x36_status.inited = true; + current_dev_addr = dev_addr; + uint8_t data_buf; + esp_err_t ret; + ESP_LOGI(TAG, "Found touch panel controller"); + if ((ret = ft6x06_i2c_read8(dev_addr, FT6X36_PANEL_ID_REG, &data_buf) != ESP_OK)) + ESP_LOGE(TAG, "Error reading from device: %s", + esp_err_to_name(ret)); // Only show error the first time + ESP_LOGI(TAG, "\tDevice ID: 0x%02x", data_buf); - if (code != ESP_OK) { - ft6x36_status.inited = false; - ESP_LOGE(TAG, "Error during I2C init %s", esp_err_to_name(code)); - } else { - ft6x36_status.inited = true; - current_dev_addr = dev_addr; - uint8_t data_buf; - esp_err_t ret; - ESP_LOGI(TAG, "Found touch panel controller"); - if ((ret = ft6x06_i2c_read8(dev_addr, FT6X36_PANEL_ID_REG, &data_buf) != ESP_OK)) - ESP_LOGE(TAG, "Error reading from device: %s", - esp_err_to_name(ret)); // Only show error the first time - ESP_LOGI(TAG, "\tDevice ID: 0x%02x", data_buf); + ft6x06_i2c_read8(dev_addr, FT6X36_CHIPSELECT_REG, &data_buf); + ESP_LOGI(TAG, "\tChip ID: 0x%02x", data_buf); - ft6x06_i2c_read8(dev_addr, FT6X36_CHIPSELECT_REG, &data_buf); - ESP_LOGI(TAG, "\tChip ID: 0x%02x", data_buf); + ft6x06_i2c_read8(dev_addr, FT6X36_DEV_MODE_REG, &data_buf); + ESP_LOGI(TAG, "\tDevice mode: 0x%02x", data_buf); - ft6x06_i2c_read8(dev_addr, FT6X36_DEV_MODE_REG, &data_buf); - ESP_LOGI(TAG, "\tDevice mode: 0x%02x", data_buf); + ft6x06_i2c_read8(dev_addr, FT6X36_FIRMWARE_ID_REG, &data_buf); + ESP_LOGI(TAG, "\tFirmware ID: 0x%02x", data_buf); - ft6x06_i2c_read8(dev_addr, FT6X36_FIRMWARE_ID_REG, &data_buf); - ESP_LOGI(TAG, "\tFirmware ID: 0x%02x", data_buf); - - ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf); - ESP_LOGI(TAG, "\tRelease code: 0x%02x", data_buf); - } + ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf); + ESP_LOGI(TAG, "\tRelease code: 0x%02x", data_buf); + +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE + ft6x36_touch_queue_handle = xQueueCreate( FT6X36_TOUCH_QUEUE_ELEMENTS, sizeof( ft6x36_touch_t ) ); + if( ft6x36_touch_queue_handle == NULL ) + { + ESP_LOGE( TAG, "\tError creating touch input FreeRTOS queue" ); + return; } + xQueueSend( ft6x36_touch_queue_handle, &touch_inputs, 0 ); +#endif } /** @@ -120,82 +106,55 @@ void ft6x06_init(uint16_t dev_addr) { * @retval Always false */ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { - uint8_t data_xy[4]; // 2 bytes X | 2 bytes Y - uint8_t touch_pnt_cnt; // Number of detected touch points - static int16_t last_x = 0; // 12bit pixel value - static int16_t last_y = 0; // 12bit pixel value - - ft6x06_i2c_read8(current_dev_addr, FT6X36_TD_STAT_REG, &touch_pnt_cnt); - if (touch_pnt_cnt != 1) { // ignore no touch & multi touch - data->point.x = last_x; - data->point.y = last_y; - data->state = LV_INDEV_STATE_REL; - return false; + if (!ft6x36_status.inited) { + ESP_LOGE(TAG, "Init first!"); + return 0x00; } + uint8_t data_buf[5]; // 1 byte status, 2 bytes X, 2 bytes Y - // Read X value - i2c_cmd_handle_t i2c_cmd = i2c_cmd_link_create(); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (current_dev_addr << 1) | I2C_MASTER_WRITE, true); - i2c_master_write_byte(i2c_cmd, FT6X36_P1_XH_REG, I2C_MASTER_ACK); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (current_dev_addr << 1) | I2C_MASTER_READ, true); - - i2c_master_read_byte(i2c_cmd, &data_xy[0], I2C_MASTER_ACK); // reads FT6X36_P1_XH_REG - i2c_master_read_byte(i2c_cmd, &data_xy[1], I2C_MASTER_NACK); // reads FT6X36_P1_XL_REG - i2c_master_stop(i2c_cmd); - esp_err_t ret = i2c_master_cmd_begin(TOUCH_I2C_PORT, i2c_cmd, 1000 / portTICK_RATE_MS); - i2c_cmd_link_delete(i2c_cmd); + esp_err_t ret = lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, current_dev_addr, FT6X36_TD_STAT_REG, &data_buf[0], 5); if (ret != ESP_OK) { - ESP_LOGE(TAG, "Error getting X coordinates: %s", esp_err_to_name(ret)); - data->point.x = last_x; - data->point.y = last_y; - data->state = LV_INDEV_STATE_REL; // no touch detected + ESP_LOGE(TAG, "Error talking to touch IC: %s", esp_err_to_name(ret)); + } + uint8_t touch_pnt_cnt = data_buf[0]; // Number of detected touch points + + if (ret != ESP_OK || touch_pnt_cnt != 1) { // ignore no touch & multi touch + if ( touch_inputs.current_state != LV_INDEV_STATE_REL) + { + touch_inputs.current_state = LV_INDEV_STATE_REL; +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE + xQueueOverwrite( ft6x36_touch_queue_handle, &touch_inputs ); +#endif + } + data->point.x = touch_inputs.last_x; + data->point.y = touch_inputs.last_y; + data->state = touch_inputs.current_state; return false; } - // Read Y value - i2c_cmd = i2c_cmd_link_create(); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (current_dev_addr << 1) | I2C_MASTER_WRITE, true); - i2c_master_write_byte(i2c_cmd, FT6X36_P1_YH_REG, I2C_MASTER_ACK); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (current_dev_addr << 1) | I2C_MASTER_READ, true); - - i2c_master_read_byte(i2c_cmd, &data_xy[2], I2C_MASTER_ACK); // reads FT6X36_P1_YH_REG - i2c_master_read_byte(i2c_cmd, &data_xy[3], I2C_MASTER_NACK); // reads FT6X36_P1_YL_REG - i2c_master_stop(i2c_cmd); - ret = i2c_master_cmd_begin(TOUCH_I2C_PORT, i2c_cmd, 1000 / portTICK_RATE_MS); - i2c_cmd_link_delete(i2c_cmd); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Error getting Y coordinates: %s", esp_err_to_name(ret)); - data->point.x = last_x; - data->point.y = last_y; - data->state = LV_INDEV_STATE_REL; // no touch detected - return false; - } - - last_x = ((data_xy[0] & FT6X36_MSB_MASK) << 8) | (data_xy[1] & FT6X36_LSB_MASK); - last_y = ((data_xy[2] & FT6X36_MSB_MASK) << 8) | (data_xy[3] & FT6X36_LSB_MASK); + touch_inputs.current_state = LV_INDEV_STATE_PR; + touch_inputs.last_x = ((data_buf[1] & FT6X36_MSB_MASK) << 8) | (data_buf[2] & FT6X36_LSB_MASK); + touch_inputs.last_y = ((data_buf[3] & FT6X36_MSB_MASK) << 8) | (data_buf[4] & FT6X36_LSB_MASK); #if CONFIG_LV_FT6X36_SWAPXY - int16_t swap_buf = last_x; - last_x = last_y; - last_y = swap_buf; + int16_t swap_buf = touch_inputs.last_x; + touch_inputs.last_x = touch_inputs.last_y; + touch_inputs.last_y = swap_buf; #endif #if CONFIG_LV_FT6X36_INVERT_X - last_x = LV_HOR_RES - last_x; + touch_inputs.last_x = LV_HOR_RES - touch_inputs.last_x; #endif #if CONFIG_LV_FT6X36_INVERT_Y - last_y = LV_VER_RES - last_y; + touch_inputs.last_y = LV_VER_RES - touch_inputs.last_y; #endif - data->point.x = last_x; - data->point.y = last_y; - data->state = LV_INDEV_STATE_PR; - ESP_LOGV(TAG, "X=%u Y=%u", data->point.x, data->point.y); + data->point.x = touch_inputs.last_x; + data->point.y = touch_inputs.last_y; + data->state = touch_inputs.current_state; + ESP_LOGD(TAG, "X=%u Y=%u", data->point.x, data->point.y); + +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE + xQueueOverwrite( ft6x36_touch_queue_handle, &touch_inputs ); +#endif + return false; } diff --git a/lvgl_touch/ft6x36.h b/lvgl_touch/ft6x36.h index da466b6..c4074dc 100644 --- a/lvgl_touch/ft6x36.h +++ b/lvgl_touch/ft6x36.h @@ -2,20 +2,20 @@ /* * Copyright © 2020 Wolfgang Christl -* Permission is hereby granted, free of charge, to any person obtaining a copy of this -* software and associated documentation files (the “Software”), to deal in the Software -* without restriction, including without limitation the rights to use, copy, modify, merge, -* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the “Software”), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons * to whom the Software is furnished to do so, subject to the following conditions: * -* The above copyright notice and this permission notice shall be included in all copies or +* The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* +* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ @@ -23,6 +23,10 @@ #include #include +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" +#endif #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include "lvgl.h" #else @@ -145,6 +149,16 @@ typedef struct { bool inited; } ft6x36_status_t; +typedef struct +{ + int16_t last_x; + int16_t last_y; + lv_indev_state_t current_state; +} ft6x36_touch_t; + +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE +extern QueueHandle_t ft6x36_touch_queue_handle; +#endif /** * @brief Initialize for FT6x36 communication via I2C * @param dev_addr: Device address on communication Bus (I2C slave address of FT6X36). diff --git a/lvgl_touch/gt911.c b/lvgl_touch/gt911.c index e6cb972..03c3d9d 100644 --- a/lvgl_touch/gt911.c +++ b/lvgl_touch/gt911.c @@ -19,15 +19,14 @@ */ #include -#include #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include #else #include #endif #include "gt911.h" -#include "tp_i2c.h" -#include "../lvgl_i2c_conf.h" + +#include "lvgl_i2c/i2c_manager.h" #define TAG "GT911" @@ -35,35 +34,12 @@ gt911_status_t gt911_status; //TODO: handle multibyte read and refactor to just one read transaction esp_err_t gt911_i2c_read(uint8_t slave_addr, uint16_t register_addr, uint8_t *data_buf, uint8_t len) { - i2c_cmd_handle_t i2c_cmd = i2c_cmd_link_create(); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (slave_addr << 1) | I2C_MASTER_WRITE, true); - i2c_master_write_byte(i2c_cmd, (register_addr >> 8), I2C_MASTER_ACK); - i2c_master_write_byte(i2c_cmd, (register_addr & 0xFF), I2C_MASTER_ACK); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (slave_addr << 1) | I2C_MASTER_READ, true); - - i2c_master_read_byte(i2c_cmd, data_buf, I2C_MASTER_NACK); - i2c_master_stop(i2c_cmd); - esp_err_t ret = i2c_master_cmd_begin(TOUCH_I2C_PORT, i2c_cmd, 1000 / portTICK_RATE_MS); - i2c_cmd_link_delete(i2c_cmd); - return ret; + return lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr | I2C_REG_16, data_buf, len); } esp_err_t gt911_i2c_write8(uint8_t slave_addr, uint16_t register_addr, uint8_t data) { - i2c_cmd_handle_t i2c_cmd = i2c_cmd_link_create(); - - i2c_master_start(i2c_cmd); - i2c_master_write_byte(i2c_cmd, (slave_addr << 1) | I2C_MASTER_WRITE, true); - i2c_master_write_byte(i2c_cmd, (register_addr >> 8), I2C_MASTER_ACK); - i2c_master_write_byte(i2c_cmd, (register_addr & 0xFF), I2C_MASTER_ACK); - i2c_master_write_byte(i2c_cmd, data, I2C_MASTER_ACK); - i2c_master_stop(i2c_cmd); - esp_err_t ret = i2c_master_cmd_begin(TOUCH_I2C_PORT, i2c_cmd, 1000 / portTICK_RATE_MS); - i2c_cmd_link_delete(i2c_cmd); - return ret; + uint8_t buffer = data; + return lvgl_i2c_write(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr | I2C_REG_16, &buffer, 1); } /** diff --git a/lvgl_touch/touch_driver.c b/lvgl_touch/touch_driver.c index 72a01ed..7496647 100644 --- a/lvgl_touch/touch_driver.c +++ b/lvgl_touch/touch_driver.c @@ -8,6 +8,7 @@ // Is not being included in CMakeLists.txt (Research why) #include "l58.h" + void touch_driver_init(void) { #if defined (CONFIG_LV_TOUCH_CONTROLLER_XPT2046) diff --git a/lvgl_touch/tp_i2c.c b/lvgl_touch/tp_i2c.c deleted file mode 100644 index dc3371c..0000000 --- a/lvgl_touch/tp_i2c.c +++ /dev/null @@ -1,43 +0,0 @@ -/* -* Copyright © 2020 Wolfgang Christl - -* Permission is hereby granted, free of charge, to any person obtaining a copy of this -* software and associated documentation files (the “Software”), to deal in the Software -* without restriction, including without limitation the rights to use, copy, modify, merge, -* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons -* to whom the Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -#include -#include - -#define I2C_MASTER_FREQ_HZ 100000 /* 100kHz*/ -#define I2C_MASTER_TX_BUF_DISABLE 0 /* I2C master doesn't need buffer */ -#define I2C_MASTER_RX_BUF_DISABLE 0 /* I2C master doesn't need buffer */ - -/** - * @brief ESP32 I2C init as master - * @ret ESP32 error code - */ -esp_err_t i2c_master_init(void) { - int i2c_master_port = I2C_NUM_0; - i2c_config_t conf; - conf.mode = I2C_MODE_MASTER; - conf.sda_io_num = CONFIG_LV_TOUCH_I2C_SDA; - conf.sda_pullup_en = GPIO_PULLUP_ENABLE; - conf.scl_io_num = CONFIG_LV_TOUCH_I2C_SCL; - conf.scl_pullup_en = GPIO_PULLUP_ENABLE; - conf.master.clk_speed = I2C_MASTER_FREQ_HZ; - i2c_param_config(i2c_master_port, &conf); - return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); -} diff --git a/lvgl_touch/tp_i2c.h b/lvgl_touch/tp_i2c.h deleted file mode 100644 index 5c1eb55..0000000 --- a/lvgl_touch/tp_i2c.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -* Copyright © 2020 Wolfgang Christl - -* Permission is hereby granted, free of charge, to any person obtaining a copy of this -* software and associated documentation files (the “Software”), to deal in the Software -* without restriction, including without limitation the rights to use, copy, modify, merge, -* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons -* to whom the Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -#ifndef __TS_H -#define __TS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -esp_err_t i2c_master_init(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __TS_H */