diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b3942d..9613d9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,8 @@ if(CONFIG_LV_TOUCH_CONTROLLER) list(APPEND SOURCES "lvgl_touch/ft6x36.c") elseif(CONFIG_LV_TOUCH_CONTROLLER_L58) list(APPEND SOURCES "lvgl_touch/l58.cpp") + elseif(CONFIG_LV_TOUCH_CONTROLLER_GT911) + list(APPEND SOURCES "lvgl_touch/gt911.c") elseif(CONFIG_LV_TOUCH_CONTROLLER_STMPE610) list(APPEND SOURCES "lvgl_touch/stmpe610.c") elseif(CONFIG_LV_TOUCH_CONTROLLER_ADCRAW) @@ -89,7 +91,7 @@ endif() idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS ${LVGL_INCLUDE_DIRS} REQUIRES epdiy - lvgl CalEPD sharp-lcd + lvgl CalEPD sharp-lcd espressif__esp_lcd_touch_gt911 ) target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_LVGL_H_INCLUDE_SIMPLE") diff --git a/lvgl_helpers.c b/lvgl_helpers.c index 334f1f3..84285fc 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -148,9 +148,7 @@ void lvgl_driver_init(void) touch_driver_init(); #elif defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) ESP_LOGI(TAG, "Initializing I2C master for touch"); - lvgl_i2c_driver_init(TOUCH_I2C_PORT, - TOUCH_I2C_SDA, TOUCH_I2C_SCL, - TOUCH_I2C_SPEED_HZ); + //lvgl_i2c_driver_init(TOUCH_I2C_PORT, TOUCH_I2C_SDA, TOUCH_I2C_SCL, TOUCH_I2C_SPEED_HZ); touch_driver_init(); #elif defined (CONFIG_LV_TOUCH_DRIVER_ADC) @@ -197,7 +195,7 @@ bool lvgl_i2c_driver_init(int port, int sda_pin, int scl_pin, int speed_hz) I2C_MODE_MASTER, 0, 0 /*I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE */, 0 /* intr_alloc_flags */); - assert(ESP_OK == err); + //assert(ESP_OK == err); return ESP_OK != err; } diff --git a/lvgl_tft/epdiy_epaper.cpp b/lvgl_tft/epdiy_epaper.cpp index 30aecd6..11f989f 100644 --- a/lvgl_tft/epdiy_epaper.cpp +++ b/lvgl_tft/epdiy_epaper.cpp @@ -84,10 +84,10 @@ void epdiy_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_ma printf("%x ", buf[index]); } */ // This is the slower version that works good without leaving any white line - //buf_copy_to_framebuffer(update_area, buf); + buf_copy_to_framebuffer(update_area, buf); //Faster mode suggested in LVGL forum (Leaves ghosting&prints bad sections / experimental) NOTE: Do NOT use in production - buf_area_to_framebuffer(area, buf); + //buf_area_to_framebuffer(area, buf); epd_hl_update_area(&hl, updateMode, temperature, update_area); //update_area diff --git a/lvgl_touch/Kconfig b/lvgl_touch/Kconfig index ad6f4f3..9ed4255 100644 --- a/lvgl_touch/Kconfig +++ b/lvgl_touch/Kconfig @@ -2,14 +2,15 @@ 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 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_L58 + default 8 if LV_TOUCH_CONTROLLER_GT911 choice prompt "Select a touch panel controller model." default LV_TOUCH_CONTROLLER_NONE @@ -29,7 +30,9 @@ menu "LVGL Touch controller" # Start only touch without protocol: select CONFIG_LV_TOUCH_DRIVER_DISPLAY bool "L58" - + config LV_TOUCH_CONTROLLER_GT911 + select LV_TOUCH_DRIVER_PROTOCOL_I2C + bool "GT911" config LV_TOUCH_CONTROLLER_STMPE610 select LV_TOUCH_DRIVER_PROTOCOL_SPI bool "STMPE610" @@ -522,7 +525,27 @@ menu "LVGL Touch controller" bool prompt "De-bounce Circuit Enable for Touch Panel Interrupt" 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_ESP32S3 + + default 39 + 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_ESP32S3 + + default 40 + help + Configure the I2C touchpanel SCL pin here. + endmenu endmenu diff --git a/lvgl_touch/gt911.c b/lvgl_touch/gt911.c index 03c3d9d..baf9b48 100644 --- a/lvgl_touch/gt911.c +++ b/lvgl_touch/gt911.c @@ -1,5 +1,5 @@ /* -* Copyright © 2021 Sturnus Inc. +* Copyright © 2023 Fasani Corp. * 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 @@ -17,8 +17,12 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_lcd_touch_gt911.h" #include +#include "driver/i2c.h" + #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include #else @@ -26,62 +30,46 @@ #endif #include "gt911.h" -#include "lvgl_i2c/i2c_manager.h" - #define TAG "GT911" -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) { - 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) { - uint8_t buffer = data; - return lvgl_i2c_write(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr | I2C_REG_16, &buffer, 1); -} +#ifdef CONFIG_LV_TOUCH_I2C_PORT_0 + #define I2C_PORT I2C_NUM_0 +#endif +#ifdef CONFIG_LV_TOUCH_I2C_PORT_1 + #define I2C_PORT I2C_NUM_1 +#endif +// When the touch panel has different pixels definition +float x_adjust = 1.55; +float y_adjust = 0.8; +esp_lcd_touch_handle_t tp; /** * @brief Initialize for GT911 communication via I2C - * @param dev_addr: Device address on communication Bus (I2C slave address of GT911). * @retval None */ void gt911_init(uint8_t dev_addr) { - if (!gt911_status.inited) { - gt911_status.i2c_dev_addr = dev_addr; - uint8_t data_buf; - esp_err_t ret; + esp_lcd_panel_io_handle_t tp_io_handle = NULL; + esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG(); - ESP_LOGI(TAG, "Checking for GT911 Touch Controller"); - if ((ret = gt911_i2c_read(dev_addr, GT911_PRODUCT_ID1, &data_buf, 1) != ESP_OK)) { - ESP_LOGE(TAG, "Error reading from device: %s", - esp_err_to_name(ret)); // Only show error the first time - return; - } + esp_lcd_touch_config_t tp_cfg = { + .x_max = 1025, + .y_max = 770, + .rst_gpio_num = -1, + .int_gpio_num = -1, + .levels = { + .reset = 0, + .interrupt = 0, + }, + .flags = { + .swap_xy = 1, + .mirror_x = 1, + .mirror_y = 0, + }, + }; + + esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)I2C_PORT, &tp_io_config, &tp_io_handle); - // Read 4 bytes for Product ID in ASCII - for (int i = 0; i < GT911_PRODUCT_ID_LEN; i++) { - gt911_i2c_read(dev_addr, (GT911_PRODUCT_ID1 + i), (uint8_t *)&(gt911_status.product_id[i]), 1); - } - ESP_LOGI(TAG, "\tProduct ID: %s", gt911_status.product_id); - - gt911_i2c_read(dev_addr, GT911_VENDOR_ID, &data_buf, 1); - ESP_LOGI(TAG, "\tVendor ID: 0x%02x", data_buf); - - gt911_i2c_read(dev_addr, GT911_X_COORD_RES_L, &data_buf, 1); - gt911_status.max_x_coord = data_buf; - gt911_i2c_read(dev_addr, GT911_X_COORD_RES_H, &data_buf, 1); - gt911_status.max_x_coord |= ((uint16_t)data_buf << 8); - ESP_LOGI(TAG, "\tX Resolution: %d", gt911_status.max_x_coord); - - gt911_i2c_read(dev_addr, GT911_Y_COORD_RES_L, &data_buf, 1); - gt911_status.max_y_coord = data_buf; - gt911_i2c_read(dev_addr, GT911_Y_COORD_RES_H, &data_buf, 1); - gt911_status.max_y_coord |= ((uint16_t)data_buf << 8); - ESP_LOGI(TAG, "\tY Resolution: %d", gt911_status.max_y_coord); - gt911_status.inited = true; - } + esp_lcd_touch_new_i2c_gt911(tp_io_handle, &tp_cfg, &tp); } /** @@ -91,54 +79,22 @@ void gt911_init(uint8_t dev_addr) { * @retval Always false */ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { - 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 - uint8_t data_buf; - uint8_t status_reg; + esp_lcd_touch_read_data(tp); - gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_STATUS_REG, &status_reg, 1); -// ESP_LOGI(TAG, "\tstatus: 0x%02x", status_reg); - touch_pnt_cnt = status_reg & 0x0F; - if ((status_reg & 0x80) || (touch_pnt_cnt < 6)) { - //Reset Status Reg Value - gt911_i2c_write8(gt911_status.i2c_dev_addr, GT911_STATUS_REG, 0x00); - } - if (touch_pnt_cnt != 1) { // ignore no touch & multi touch - data->point.x = last_x; - data->point.y = last_y; + uint16_t touch_x[2]; + uint16_t touch_y[2]; + uint16_t touch_strength[2]; + uint8_t touch_cnt = 0; + bool touchpad_pressed = esp_lcd_touch_get_coordinates(tp, touch_x, touch_y, touch_strength, &touch_cnt, 2); + if (touchpad_pressed) { + data->state = LV_INDEV_STATE_PR; + data->point.x = (int)(touch_x[0]*x_adjust); + data->point.y = (int)(touch_y[0]*y_adjust); + ESP_LOGI(TAG, "X=%d Y=%d", (int)data->point.x, (int)data->point.y); + } else { data->state = LV_INDEV_STATE_REL; - return false; + data->point.x = -1; + data->point.y = -1; } - -// gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_TRACK_ID1, &data_buf, 1); -// ESP_LOGI(TAG, "\ttrack_id: %d", data_buf); - - gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_PT1_X_COORD_L, &data_buf, 1); - last_x = data_buf; - gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_PT1_X_COORD_H, &data_buf, 1); - last_x |= ((uint16_t)data_buf << 8); - - gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_PT1_Y_COORD_L, &data_buf, 1); - last_y = data_buf; - gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_PT1_Y_COORD_H, &data_buf, 1); - last_y |= ((uint16_t)data_buf << 8); - -#if CONFIG_LV_GT911_INVERT_X - last_x = gt911_status.max_x_coord - last_x; -#endif -#if CONFIG_LV_GT911_INVERT_Y - last_y = gt911_status.max_y_coord - last_y; -#endif -#if CONFIG_LV_GT911_SWAPXY - int16_t swap_buf = last_x; - last_x = last_y; - last_y = swap_buf; -#endif - data->point.x = last_x; - data->point.y = last_y; - data->state = LV_INDEV_STATE_PR; - ESP_LOGI(TAG, "X=%u Y=%u", data->point.x, data->point.y); - ESP_LOGV(TAG, "X=%u Y=%u", data->point.x, data->point.y); return false; } diff --git a/lvgl_touch/gt911.h b/lvgl_touch/gt911.h index 6a110bd..96643b7 100644 --- a/lvgl_touch/gt911.h +++ b/lvgl_touch/gt911.h @@ -22,7 +22,6 @@ #define __GT911_H #include -#include #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include "lvgl.h" #else @@ -33,46 +32,6 @@ extern "C" { #endif -#define GT911_I2C_SLAVE_ADDR 0x5D - -#define GT911_PRODUCT_ID_LEN 4 - -/* Register Map of GT911 */ -#define GT911_PRODUCT_ID1 0x8140 -#define GT911_PRODUCT_ID2 0x8141 -#define GT911_PRODUCT_ID3 0x8142 -#define GT911_PRODUCT_ID4 0x8143 -#define GT911_FIRMWARE_VER_L 0x8144 -#define GT911_FIRMWARE_VER_H 0x8145 -#define GT911_X_COORD_RES_L 0x8146 -#define GT911_X_COORD_RES_H 0x8147 -#define GT911_Y_COORD_RES_L 0x8148 -#define GT911_Y_COORD_RES_H 0x8149 -#define GT911_VENDOR_ID 0x814A - -#define GT911_STATUS_REG 0x814E -#define GT911_STATUS_REG_BUF 0x80 -#define GT911_STATUS_REG_LARGE 0x40 -#define GT911_STATUS_REG_PROX_VALID 0x20 -#define GT911_STATUS_REG_HAVEKEY 0x10 -#define GT911_STATUS_REG_PT_MASK 0x0F - -#define GT911_TRACK_ID1 0x814F -#define GT911_PT1_X_COORD_L 0x8150 -#define GT911_PT1_X_COORD_H 0x8151 -#define GT911_PT1_Y_COORD_L 0x8152 -#define GT911_PT1_Y_COORD_H 0x8153 -#define GT911_PT1_X_SIZE_L 0x8154 -#define GT911_PT1_X_SIZE_H 0x8155 - -typedef struct { - bool inited; - char product_id[GT911_PRODUCT_ID_LEN]; - uint16_t max_x_coord; - uint16_t max_y_coord; - uint8_t i2c_dev_addr; -} gt911_status_t; - /** * @brief Initialize for GT911 communication via I2C * @param dev_addr: Device address on communication Bus (I2C slave address of GT911). diff --git a/lvgl_touch/touch_driver.c b/lvgl_touch/touch_driver.c index 4508810..499f5cf 100644 --- a/lvgl_touch/touch_driver.c +++ b/lvgl_touch/touch_driver.c @@ -16,6 +16,8 @@ void touch_driver_init(void) ft6x06_init(FT6236_I2C_SLAVE_ADDR); #elif defined (CONFIG_LV_TOUCH_CONTROLLER_L58) l58_init(); +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_GT911) + gt911_init(0x5d); #elif defined (CONFIG_LV_TOUCH_CONTROLLER_STMPE610) stmpe610_init(); #elif defined (CONFIG_LV_TOUCH_CONTROLLER_ADCRAW) @@ -37,7 +39,8 @@ bool touch_driver_read(lv_indev_drv_t *drv, lv_indev_data_t *data) res = ft6x36_read(drv, data); #elif defined (CONFIG_LV_TOUCH_CONTROLLER_L58) res = l58_read(drv, data); - +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_GT911) + res = gt911_read(drv, data); #elif defined (CONFIG_LV_TOUCH_CONTROLLER_STMPE610) res = stmpe610_read(drv, data); #elif defined (CONFIG_LV_TOUCH_CONTROLLER_ADCRAW) diff --git a/lvgl_touch/touch_driver.h b/lvgl_touch/touch_driver.h index bc92f4f..44378db 100644 --- a/lvgl_touch/touch_driver.h +++ b/lvgl_touch/touch_driver.h @@ -32,6 +32,8 @@ extern "C" { #include "FT81x.h" #elif defined (CONFIG_LV_TOUCH_CONTROLLER_RA8875) #include "ra8875_touch.h" +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_GT911) +#include "gt911.h" #endif /*********************