Compare commits

...

30 commits

Author SHA1 Message Date
Andreas Mieke 341b522b7b fix(lcd-backlight): Update to ESP IDF v5 2023-12-30 05:15:27 +01:00
Andreas Mieke 8592cb9d29 Add Schmitt SPI display driver 2023-12-30 03:47:03 +01:00
arktrin 26fe6e7703 clarify the 52/53 px offset oddity 2021-12-23 14:54:28 -06:00
arktrin c4cd524487 add offset for 240x135 displays based on ST7789 2021-12-23 14:54:28 -06:00
arktrin 8d1fbcf5c4 replace hardcoded SPI DMA parameter 2021-12-21 16:57:51 -06:00
arktrin 8cbbc299e9 fix SPI names for touch
with ESP32-C3 specific auto-dma proper selection
2021-12-21 16:57:51 -06:00
Tomas Rezucha 762bb35265
Merge pull request #152 from lvgl/revert-151-fix/spi-names
Revert "fix spi names"
2021-12-17 19:18:36 +01:00
Tomas Rezucha d44b7e808a
Revert "fix spi names" 2021-12-17 19:18:05 +01:00
Tomas Rezucha 02d351f898
Merge pull request #151 from lvgl/fix/spi-names
fix spi names
2021-12-16 15:46:10 +01:00
Tomas Rezucha 22ba4161b5 fix spi names 2021-12-16 15:45:23 +01:00
Tomas Rezucha 4afc03a9fa
Merge pull request #145 from arktrin/fix-spi-conf
Fix SPI configuration for ESP32C3 and ESP32S2
2021-12-14 16:28:06 +01:00
arktrin 23ee5be93b replace all specific SPI names with SPIx_HOST 2021-12-13 14:31:09 +03:00
arktrin 31a5733c8d Fix SPI configuration for ESP32-C3 and ESP32-S2
ESP32-C3 and ESP32-S2 do not have VSPI or HSPI
2021-12-05 17:01:36 +03:00
Matthias Ringwald f3f6ba6470 Added PCD8544 to readme, addressed PR comments 2021-11-25 17:16:04 -06:00
Matthias Ringwald 37a4d3a4e6 Add PCD8544 driver 2021-11-25 17:16:04 -06:00
Carlos Diaz b674d2d4f1
Merge pull request #136 from rashedtalukder/master
Add touch input values to an accessible FreeRTOS queue
2021-10-27 18:57:13 -05:00
Rashed Talukder 37548ad50f Extern the queue handle and add definition in source file. Add macro condition for dependencies. 2021-10-27 09:20:57 -07:00
Rashed Talukder a56b80b362 Add kconfig symbol for optional coordinates queue 2021-10-25 11:53:26 -07:00
Rashed Talukder bd445ea30a Add touch input values to a FreeRTOS queue 2021-10-19 17:27:27 -07:00
Carlos Diaz 617e6a46c0
Merge pull request #132 from ropg/fix_115
Fixes for #115
2021-10-15 10:54:41 -05:00
Rop Gonggrijp db3d00e374 Addresses confusion: I2C manager component install only when others need I2C too.
See #115
2021-10-15 15:38:16 +02:00
Rop Gonggrijp 83eba9b04c Fixes potential ESP-IDF config editor crash (#115) 2021-10-15 15:37:36 +02:00
Carlos Diaz 4d3f23a3e8
Merge pull request #119 from lvgl/fix/ft6x36_coordinates
FT6X36: Fix coordinates inversion and swap
2021-09-28 20:52:38 -05:00
C47D 88628042e6 FT6X36: Fix coordinates invesion
The coordinates need to be swapped before inveting them when swapping is enabled.

Suggested in #118 by @wreyford
2021-09-28 20:51:57 -05:00
Carlos Diaz dd09b4d01a
Merge pull request #93 from sidwarkd/patch-1
Fix orientation config define on Kconfig and ssd1306
2021-08-25 12:46:29 -05:00
Tomas Rezucha 6a3e46e509
Merge pull request #99 from lvgl/fix/backlight-off
Don't call backlight function when backlight is disabled
2021-08-23 10:13:01 +02:00
Carlos Diaz 82583ce6ce
Merge pull request #101 from chenghongyao/fix_data_length_overflow
ST7789: Fix data length overflow on `send_color` by changing the length parameter from uint16_t to size_t
2021-08-17 15:36:41 -05:00
chenghongyao 171cd53915 fix data length overflow 2021-08-15 12:52:34 +08:00
Kevin Sidwar ee36378f54 Change config naming for ssd1306 to use LV_ prefix 2021-08-12 23:48:23 -06:00
Kevin Sidwar a0e933c7e6
Fix orientation config define 2021-07-30 15:29:18 -06:00
21 changed files with 497 additions and 165 deletions

4
.gitignore vendored
View file

@ -56,3 +56,7 @@ dkms.conf
# ESP-IDF build dir # ESP-IDF build dir
build build
# Kconfig files
sdkconfig
sdkconfig.old

View file

@ -42,6 +42,10 @@ elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01)
list(APPEND SOURCES "lvgl_tft/GC9A01.c") list(APPEND SOURCES "lvgl_tft/GC9A01.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C) elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C)
list(APPEND SOURCES "lvgl_tft/ili9163c.c") list(APPEND SOURCES "lvgl_tft/ili9163c.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544)
list(APPEND SOURCES "lvgl_tft/pcd8544.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT)
list(APPEND SOURCES "lvgl_tft/schmitt.c")
else() else()
message(WARNING "LVGL ESP32 drivers: Display controller not defined.") message(WARNING "LVGL ESP32 drivers: Display controller not defined.")
endif() endif()
@ -84,7 +88,7 @@ endif()
idf_component_register(SRCS ${SOURCES} idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS ${LVGL_INCLUDE_DIRS} INCLUDE_DIRS ${LVGL_INCLUDE_DIRS}
REQUIRES lvgl) REQUIRES lvgl driver esp_common log freertos esp_rom soc)
target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_LVGL_H_INCLUDE_SIMPLE") target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_LVGL_H_INCLUDE_SIMPLE")

View file

@ -30,6 +30,7 @@ swap of RGB565 color on the LVGL configuration menuconfig (it's not handled auto
| RA8875 | TFT | SPI | 16: RGB565 | Yes | | RA8875 | TFT | SPI | 16: RGB565 | Yes |
| SH1107 | Monochrome | SPI | 1: 1byte per pixel | No | | SH1107 | Monochrome | SPI | 1: 1byte per pixel | No |
| SSD1306 | Monochrome | I2C | 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 | | IL3820 | e-Paper | SPI | 1: 1byte per pixel | No |
| UC8151D/ GoodDisplay GDEW0154M10 DES | 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 | | FitiPower JD79653A/ GoodDisplay GDEW0154M09 | e-Paper | SPI | 1: 1byte per pixel | No |

View file

@ -154,34 +154,12 @@ bool lvgl_spi_driver_init(int host,
int dma_channel, int dma_channel,
int quadwp_pin, int quadhd_pin) int quadwp_pin, int quadhd_pin)
{ {
int dma_chan = 0 /* SPI_DMA_DISABLED */; assert((0 <= host) && (3 > host));
#if defined (CONFIG_IDF_TARGET_ESP32)
assert((SPI_HOST <= host) && (VSPI_HOST >= host));
const char *spi_names[] = {
"SPI_HOST", "HSPI_HOST", "VSPI_HOST"
};
dma_chan = dma_channel;
#elif defined (CONFIG_IDF_TARGET_ESP32S2)
assert((SPI_HOST <= host) && (HSPI_HOST >= host));
const char *spi_names[] = {
"SPI_HOST", "", ""
};
dma_chan = dma_channel;
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
assert((SPI1_HOST <= host) && (SPI3_HOST >= host));
const char *spi_names[] = { const char *spi_names[] = {
"SPI1_HOST", "SPI2_HOST", "SPI3_HOST" "SPI1_HOST", "SPI2_HOST", "SPI3_HOST"
}; };
dma_chan = 3 /* SPI_DMA_CH_AUTO */; ESP_LOGI(TAG, "Configuring SPI host %s", spi_names[host]);
#else
#error "Target chip not selected"
#endif
ESP_LOGI(TAG, "Configuring SPI host %s (%d)", spi_names[host], host);
ESP_LOGI(TAG, "MISO pin: %d, MOSI pin: %d, SCLK pin: %d, IO2/WP pin: %d, IO3/HD pin: %d", ESP_LOGI(TAG, "MISO pin: %d, MOSI pin: %d, SCLK pin: %d, IO2/WP pin: %d, IO3/HD pin: %d",
miso_pin, mosi_pin, sclk_pin, quadwp_pin, quadhd_pin); miso_pin, mosi_pin, sclk_pin, quadwp_pin, quadhd_pin);
@ -197,9 +175,11 @@ bool lvgl_spi_driver_init(int host,
}; };
ESP_LOGI(TAG, "Initializing SPI bus..."); ESP_LOGI(TAG, "Initializing SPI bus...");
esp_err_t ret = spi_bus_initialize(host, &buscfg, dma_chan); #if defined (CONFIG_IDF_TARGET_ESP32C3)
dma_channel = SPI_DMA_CH_AUTO;
#endif
esp_err_t ret = spi_bus_initialize(host, &buscfg, (spi_dma_chan_t)dma_channel);
assert(ret == ESP_OK); assert(ret == ESP_OK);
return ESP_OK != ret; return ESP_OK != ret;
} }

View file

@ -76,6 +76,10 @@ extern "C" {
#define DISP_BUF_SIZE ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8) // 2888 bytes #define DISP_BUF_SIZE ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8) // 2888 bytes
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) #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))
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT)
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * LV_VER_RES_MAX)
#else #else
#error "No display controller selected" #error "No display controller selected"
#endif #endif

View file

@ -6,8 +6,10 @@ menu "I2C Port 0"
if I2C_MANAGER_0_ENABLED if I2C_MANAGER_0_ENABLED
config I2C_MANAGER_0_SDA config I2C_MANAGER_0_SDA
int "SDA (GPIO pin)" int "SDA (GPIO pin)"
default 0
config I2C_MANAGER_0_SCL config I2C_MANAGER_0_SCL
int "SCL (GPIO pin)" int "SCL (GPIO pin)"
default 0
config I2C_MANAGER_0_FREQ_HZ config I2C_MANAGER_0_FREQ_HZ
int "Frequency (Hz)" int "Frequency (Hz)"
default 400000 default 400000

View file

@ -8,9 +8,11 @@
### I2C Manager support ### I2C Manager support
`lvgl_esp32_drivers` integrates [I2C Manager](https://github.com/ropg/i2c_manager), which is used in case you select a touch sensor or screen that uses the I2C bus. If you're just using LVGL you don't need to do anything special. `lvgl_esp32_drivers` integrates [I2C Manager](https://github.com/ropg/i2c_manager), which is used in case you select a touch sensor or screen that uses the I2C bus.
I2C Manager can help if you are in a situation where you want to avoid "bus conflicts" on the I2C bus. Suppose you use LVGL with a touch sensor that uses I2C, and your device also has another I2C device that needs to be read frequently, such as a 3D-accelerometer. ESP-IDF is not inherently "thread-safe". So if you read that from another task than the one LVGL uses to read the touch data, you need some kind of mechanism to keep these communications from interfering. I2C Manager is also available as a separate ESP-IDF component and can help if you are in a situation where you want to avoid "bus conflicts" on the I2C bus. **If in your application nothing outside of LVGL needs to talk to the I2C bus, you can stop reading here.**
Suppose you use LVGL with a touch sensor that uses I2C, and your device also has another I2C device that needs to be read frequently, such as a 3D-accelerometer. ESP-IDF is not inherently "thread-safe". So if you read that from another task than the one LVGL uses to read the touch data, you need some kind of mechanism to keep these communications from interfering.
If you have (or write) a driver for that 3D-accelerometer that can use I2C Manager (or the I2C HAL and i2cdev abstraction layers that I2C Manager is compatible with) then put I2C Manager in your components directory by cloning the repository from below and in your main program do: If you have (or write) a driver for that 3D-accelerometer that can use I2C Manager (or the I2C HAL and i2cdev abstraction layers that I2C Manager is compatible with) then put I2C Manager in your components directory by cloning the repository from below and in your main program do:

View file

@ -64,16 +64,10 @@ extern "C" {
#define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH #define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH
#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HSPI) #if defined (CONFIG_LV_TFT_DISPLAY_SPI2_HOST)
#if defined (CONFIG_IDF_TARGET_ESP32C3)
#define TFT_SPI_HOST SPI2_HOST #define TFT_SPI_HOST SPI2_HOST
#else #elif defined (CONFIG_LV_TFT_DISPLAY_SPI3_HOST)
#define TFT_SPI_HOST HSPI_HOST #define TFT_SPI_HOST SPI3_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
#endif #endif
#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HALF_DUPLEX) #if defined (CONFIG_LV_TFT_DISPLAY_SPI_HALF_DUPLEX)
@ -90,12 +84,10 @@ extern "C" {
#define DISP_SPI_TRANS_MODE_SIO #define DISP_SPI_TRANS_MODE_SIO
#endif #endif
#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_HSPI) #if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI2_HOST)
#define TOUCH_SPI_HOST HSPI_HOST #define TOUCH_SPI_HOST SPI2_HOST
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_VSPI) #elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI3_HOST)
#define TOUCH_SPI_HOST VSPI_HOST #define TOUCH_SPI_HOST SPI3_HOST
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_FSPI)
#define TOUCH_SPI_HOST FSPI_HOST
#endif #endif
/* Handle the FT81X Special case */ /* 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 // 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 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 #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 #endif
#define SHARED_SPI_BUS #define SHARED_SPI_BUS
@ -122,7 +114,11 @@ extern "C" {
/********************** /**********************
* TYPEDEFS * TYPEDEFS
**********************/ **********************/
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \ #if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT)
#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 4)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488) defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488)
#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 3) #define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 3)
@ -166,8 +162,10 @@ extern "C" {
#define SPI_TFT_CLOCK_SPEED_HZ (40 * 1000 * 1000) #define SPI_TFT_CLOCK_SPEED_HZ (40 * 1000 * 1000)
#elif defined(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) #elif defined(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
#define SPI_TFT_CLOCK_SPEED_HZ (32*1000*1000) #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 #else
#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) #define SPI_TFT_CLOCK_SPEED_HZ (5*1000*1000) // Set to 40 later
#endif #endif
#endif #endif

View file

@ -174,6 +174,14 @@ menu "LVGL TFT Display controller"
help help
ILI9163C display controller. ILI9163C display controller.
config LV_TFT_DISPLAY_CONTROLLER_PCD8544
bool
help
PCD8544 display controller (Nokia 3110/5110)
config LV_TFT_DISPLAY_CONTROLLER_SCHMITT
bool
help
Schmitt's display controller
# Display controller communication protocol # Display controller communication protocol
# #
# This symbols define the communication protocol used by the # This symbols define the communication protocol used by the
@ -195,24 +203,24 @@ menu "LVGL TFT Display controller"
# Used in display init function to send display orientation commands # Used in display init function to send display orientation commands
choice DISPLAY_ORIENTATION choice DISPLAY_ORIENTATION
prompt "Display orientation" prompt "Display orientation"
default DISPLAY_ORIENTATION_PORTRAIT if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 default LV_DISPLAY_ORIENTATION_PORTRAIT if !LV_TFT_DISPLAY_CONTROLLER_SSD1306
default DISPLAY_ORIENTATION_LANDSCAPE if LV_TFT_DISPLAY_CONTROLLER_SSD1306 default LV_DISPLAY_ORIENTATION_LANDSCAPE if LV_TFT_DISPLAY_CONTROLLER_SSD1306
config DISPLAY_ORIENTATION_PORTRAIT config LV_DISPLAY_ORIENTATION_PORTRAIT
bool "Portrait" if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 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 bool "Portrait inverted" if !LV_TFT_DISPLAY_CONTROLLER_SSD1306
config DISPLAY_ORIENTATION_LANDSCAPE config LV_DISPLAY_ORIENTATION_LANDSCAPE
bool "Landscape" bool "Landscape"
config DISPLAY_ORIENTATION_LANDSCAPE_INVERTED config LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED
bool "Landscape inverted" bool "Landscape inverted"
endchoice endchoice
config LV_DISPLAY_ORIENTATION config LV_DISPLAY_ORIENTATION
int int
default 0 if DISPLAY_ORIENTATION_PORTRAIT default 0 if LV_DISPLAY_ORIENTATION_PORTRAIT
default 1 if DISPLAY_ORIENTATION_PORTRAIT_INVERTED default 1 if LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED
default 2 if DISPLAY_ORIENTATION_LANDSCAPE default 2 if LV_DISPLAY_ORIENTATION_LANDSCAPE
default 3 if DISPLAY_ORIENTATION_LANDSCAPE_INVERTED default 3 if LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED
config LV_TFT_DISPLAY_OFFSETS config LV_TFT_DISPLAY_OFFSETS
bool bool
@ -222,15 +230,15 @@ menu "LVGL TFT Display controller"
config LV_TFT_DISPLAY_X_OFFSET config LV_TFT_DISPLAY_X_OFFSET
depends on LV_TFT_DISPLAY_OFFSETS depends on LV_TFT_DISPLAY_OFFSETS
int "X offset" int "X offset"
default 40 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_LANDSCAPE || DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED)
default 53 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_PORTRAIT || DISPLAY_ORIENTATION_PORTRAIT_INVERTED) default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED)
default 0 default 0
config LV_TFT_DISPLAY_Y_OFFSET config LV_TFT_DISPLAY_Y_OFFSET
depends on LV_TFT_DISPLAY_OFFSETS depends on LV_TFT_DISPLAY_OFFSETS
int "Y offset" int "Y offset"
default 53 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_LANDSCAPE || DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED)
default 40 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_PORTRAIT || DISPLAY_ORIENTATION_PORTRAIT_INVERTED) default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED)
default 0 default 0
@ -340,6 +348,15 @@ menu "LVGL TFT Display controller"
bool "ILI9163C" bool "ILI9163C"
select LV_TFT_DISPLAY_CONTROLLER_ILI9163C select LV_TFT_DISPLAY_CONTROLLER_ILI9163C
select LV_TFT_DISPLAY_PROTOCOL_SPI 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
config LV_TFT_DISPLAY_USER_CONTROLLER_SCHMITT
bool "SCHMITT"
select LV_TFT_DISPLAY_CONTROLLER_SCHMITT
select LV_TFT_DISPLAY_PROTOCOL_SPI
endchoice endchoice
config CUSTOM_DISPLAY_BUFFER_SIZE config CUSTOM_DISPLAY_BUFFER_SIZE
@ -460,18 +477,14 @@ menu "LVGL TFT Display controller"
choice choice
prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI
default LV_TFT_DISPLAY_SPI_VSPI if LV_PREDEFINED_DISPLAY_TTGO && \ default LV_TFT_DISPLAY_SPI2_HOST
!IDF_TARGET_ESP32S2
default LV_TFT_DISPLAY_SPI_FSPI if IDF_TARGET_ESP32S2
help help
Select the SPI Bus the TFT Display is attached to. Select the SPI Bus the TFT Display is attached to.
config LV_TFT_DISPLAY_SPI_HSPI config LV_TFT_DISPLAY_SPI2_HOST
bool "HSPI" bool "SPI2_HOST"
config LV_TFT_DISPLAY_SPI_VSPI config LV_TFT_DISPLAY_SPI3_HOST
bool "VSPI" if !IDF_TARGET_ESP32S2 bool "SPI3_HOST"
config LV_TFT_DISPLAY_SPI_FSPI
bool "FSPI" if IDF_TARGET_ESP32S2
endchoice endchoice
choice choice
@ -1003,6 +1016,3 @@ menu "LVGL TFT Display controller"
default 0 default 0
endmenu endmenu

View file

@ -43,6 +43,10 @@ void *disp_driver_init(void)
uc8151d_init(); uc8151d_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
ili9163c_init(); ili9163c_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
pcd8544_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT
schmitt_init();
#endif #endif
// We still use menuconfig for these settings // We still use menuconfig for these settings
@ -107,6 +111,10 @@ void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t *
uc8151d_lv_fb_flush(drv, area, color_map); uc8151d_lv_fb_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
ili9163c_flush(drv, area, color_map); ili9163c_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
pcd8544_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT
schmitt_flush(drv, area, color_map);
#endif #endif
} }
@ -122,6 +130,8 @@ void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area)
jd79653a_lv_rounder_cb(disp_drv, area); jd79653a_lv_rounder_cb(disp_drv, area);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
uc8151d_lv_rounder_cb(disp_drv, area); uc8151d_lv_rounder_cb(disp_drv, area);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
pcd8544_rounder(disp_drv, area);
#endif #endif
} }
@ -138,5 +148,7 @@ void disp_driver_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_
jd79653a_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa); jd79653a_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
uc8151d_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa); uc8151d_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
pcd8544_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa);
#endif #endif
} }

View file

@ -52,6 +52,10 @@ extern "C" {
#include "uc8151d.h" #include "uc8151d.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
#include "ili9163c.h" #include "ili9163c.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
#include "pcd8544.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT
#include "schmitt.h"
#endif #endif
/********************* /*********************

View file

@ -8,10 +8,12 @@
*********************/ *********************/
#include "esp_lcd_backlight.h" #include "esp_lcd_backlight.h"
#include "driver/ledc.h" #include "driver/ledc.h"
#include "driver/gpio.h" #include "rom/gpio.h"
#include "esp_log.h" #include "esp_log.h"
#include "soc/ledc_periph.h" // to invert LEDC output on IDF version < v4.3 #include "soc/ledc_periph.h" // to invert LEDC output on IDF version < v4.3
#define SIG_GPIO_OUT_IDX 128
typedef struct { typedef struct {
bool pwm_control; // true: LEDC is used, false: GPIO is used bool pwm_control; // true: LEDC is used, false: GPIO is used
int index; // Either GPIO or LEDC channel int index; // Either GPIO or LEDC channel
@ -49,7 +51,7 @@ disp_backlight_h disp_backlight_new(const disp_backlight_config_t *config)
}; };
const ledc_timer_config_t LCD_backlight_timer = { const ledc_timer_config_t LCD_backlight_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE, .speed_mode = LEDC_LOW_SPEED_MODE,
.bit_num = LEDC_TIMER_10_BIT, .duty_resolution = LEDC_TIMER_10_BIT,
.timer_num = config->timer_idx, .timer_num = config->timer_idx,
.freq_hz = 5000, .freq_hz = 5000,
.clk_cfg = LEDC_AUTO_CLK}; .clk_cfg = LEDC_AUTO_CLK};

148
lvgl_tft/pcd8544.c Normal file
View file

@ -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 <esp_log.h>
#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);
}
}

57
lvgl_tft/pcd8544.h Normal file
View file

@ -0,0 +1,57 @@
/**
* @file pcd8544.h
*
*/
#ifndef PCD8544_H
#define PCD8544_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#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*/

27
lvgl_tft/schmitt.c Normal file
View file

@ -0,0 +1,27 @@
#include <stdio.h>
#include "schmitt.h"
#include "disp_spi.h"
#include "esp_log.h"
static const char* TAG = "SCHMITT_DIS";
void schmitt_init(void)
{
disp_spi_acquire();
// Do things
ESP_LOGI(TAG, "schmitt_init() called");
disp_spi_release();
}
void schmitt_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
{
disp_spi_acquire();
// Do things
uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);
disp_spi_send_colors(color_map, size * 4);
ESP_LOGI(TAG, "schmitt_flush() called");
disp_spi_release();
lv_disp_flush_ready(drv);
}

20
lvgl_tft/schmitt.h Normal file
View file

@ -0,0 +1,20 @@
#ifndef SCHMITT_H_
#define SCHMITT_H_
#include <stdint.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
#define LV_HOR_RES_MAX 64
#define LV_VER_RES_MAX 64
void schmitt_init(void);
void schmitt_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
#endif /* SCHMITT_H_ */

View file

@ -99,10 +99,10 @@ void ssd1306_init(void)
uint8_t orientation_1 = 0; uint8_t orientation_1 = 0;
uint8_t orientation_2 = 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_1 = OLED_CMD_SET_SEGMENT_REMAP;
orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_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_1 = 0xA0;
orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_NORMAL; orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_NORMAL;
#else #else

View file

@ -35,7 +35,7 @@ typedef struct {
**********************/ **********************/
static void st7789_set_orientation(uint8_t orientation); 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 * STATIC VARIABLES
@ -120,9 +120,9 @@ void st7789_init(void)
st7789_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); st7789_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
} }
/* The ST7789 display controller can drive 320*240 displays, when using a 240*240 /* The ST7789 display controller can drive up to 320*240 displays, when using a 240*240 or 240*135
* display there's a gap of 80px, we need to edit the coordinates to take into * displays there's a gap of 80px or 40/52/53px respectively. 52px or 53x offset depends on display orientation.
* account that gap, this is not necessary in all orientations. */ * 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) void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
{ {
uint8_t data[4] = {0}; uint8_t data[4] = {0};
@ -139,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; offsety2 += CONFIG_LV_TFT_DISPLAY_Y_OFFSET;
#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240) #elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240)
#if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT)
offsetx1 += 80; offsetx1 += 80;
offsetx2 += 80; offsetx2 += 80;
#elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) #elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED)
offsety1 += 80; offsety1 += 80;
offsety2 += 80; offsety2 += 80;
#endif #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 #endif
/*Column addresses*/ /*Column addresses*/
@ -167,7 +183,7 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo
/*Memory write*/ /*Memory write*/
st7789_send_cmd(ST7789_RAMWR); 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); st7789_send_color((void*)color_map, size * 2);
@ -190,7 +206,7 @@ void st7789_send_data(void * data, uint16_t length)
disp_spi_send_data(data, 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(); disp_wait_for_pending_transactions();
gpio_set_level(ST7789_DC, 1); gpio_set_level(ST7789_DC, 1);

View file

@ -67,17 +67,14 @@ menu "LVGL Touch controller"
prompt "Touch Controller SPI Bus." prompt "Touch Controller SPI Bus."
depends on LV_TOUCH_DRIVER_PROTOCOL_SPI depends on LV_TOUCH_DRIVER_PROTOCOL_SPI
default LV_TOUCH_CONTROLLER_SPI_VSPI if !IDF_TARGET_ESP32S2 default LV_TOUCH_CONTROLLER_SPI2_HOST
default LV_TOUCH_CONTROLLER_SPI_FSPI if IDF_TARGET_ESP32S2
help help
Select the SPI Bus the TFT Display is attached to. Select the SPI Bus the touch controller is attached to.
config LV_TOUCH_CONTROLLER_SPI_HSPI config LV_TOUCH_CONTROLLER_SPI2_HOST
bool "HSPI" bool "SPI2_HOST"
config LV_TOUCH_CONTROLLER_SPI_VSPI config LV_TOUCH_CONTROLLER_SPI3_HOST
bool "VSPI" if !IDF_TARGET_ESP32S2 bool "SPI3_HOST"
config LV_TOUCH_CONTROLLER_SPI_FSPI
bool "FSPI" if IDF_TARGET_ESP32S2
endchoice endchoice
menu "Touchpanel (XPT2046) Pin Assignments" menu "Touchpanel (XPT2046) Pin Assignments"
@ -201,6 +198,13 @@ menu "LVGL Touch controller"
prompt "Invert Y coordinate value." prompt "Invert Y coordinate value."
default n 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 endmenu
menu "Touchpanel (STMPE610) Pin Assignments" menu "Touchpanel (STMPE610) Pin Assignments"

View file

@ -25,20 +25,23 @@
#include <lvgl/lvgl.h> #include <lvgl/lvgl.h>
#endif #endif
#include "ft6x36.h" #include "ft6x36.h"
#include "lvgl_i2c/i2c_manager.h" #include "lvgl_i2c/i2c_manager.h"
#define TAG "FT6X36" #define TAG "FT6X36"
#define FT6X36_TOUCH_QUEUE_ELEMENTS 1
ft6x36_status_t ft6x36_status; static ft6x36_status_t ft6x36_status;
uint8_t current_dev_addr; // set during init 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) { 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); return lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr, data_buf, 1);
} }
/** /**
* @brief Read the FT6x36 gesture ID. Initialize first! * @brief Read the FT6x36 gesture ID. Initialize first!
* @param dev_addr: I2C FT6x36 Slave address. * @param dev_addr: I2C FT6x36 Slave address.
@ -85,6 +88,15 @@ void ft6x06_init(uint16_t dev_addr) {
ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf);
ESP_LOGI(TAG, "\tRelease code: 0x%02x", 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
} }
/** /**
@ -99,8 +111,6 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
return 0x00; return 0x00;
} }
uint8_t data_buf[5]; // 1 byte status, 2 bytes X, 2 bytes Y uint8_t data_buf[5]; // 1 byte status, 2 bytes X, 2 bytes Y
static int16_t last_x = 0; // 12bit pixel value
static int16_t last_y = 0; // 12bit pixel value
esp_err_t ret = lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, current_dev_addr, FT6X36_TD_STAT_REG, &data_buf[0], 5); 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) { if (ret != ESP_OK) {
@ -109,29 +119,42 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
uint8_t touch_pnt_cnt = data_buf[0]; // Number of detected touch points 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 (ret != ESP_OK || touch_pnt_cnt != 1) { // ignore no touch & multi touch
data->point.x = last_x; if ( touch_inputs.current_state != LV_INDEV_STATE_REL)
data->point.y = last_y; {
data->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; return false;
} }
last_x = ((data_buf[1] & FT6X36_MSB_MASK) << 8) | (data_buf[2] & FT6X36_LSB_MASK); touch_inputs.current_state = LV_INDEV_STATE_PR;
last_y = ((data_buf[3] & FT6X36_MSB_MASK) << 8) | (data_buf[4] & FT6X36_LSB_MASK); 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 = 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 #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 #endif
#if CONFIG_LV_FT6X36_INVERT_Y #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 #endif
#if CONFIG_LV_FT6X36_SWAPXY data->point.x = touch_inputs.last_x;
int16_t swap_buf = last_x; data->point.y = touch_inputs.last_y;
last_x = last_y; data->state = touch_inputs.current_state;
last_y = swap_buf;
#endif
data->point.x = last_x;
data->point.y = last_y;
data->state = LV_INDEV_STATE_PR;
ESP_LOGD(TAG, "X=%u Y=%u", data->point.x, data->point.y); 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; return false;
} }

View file

@ -23,6 +23,10 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#if CONFIG_LV_FT6X36_COORDINATES_QUEUE
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#endif
#ifdef LV_LVGL_H_INCLUDE_SIMPLE #ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h" #include "lvgl.h"
#else #else
@ -145,6 +149,16 @@ typedef struct {
bool inited; bool inited;
} ft6x36_status_t; } 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 * @brief Initialize for FT6x36 communication via I2C
* @param dev_addr: Device address on communication Bus (I2C slave address of FT6X36). * @param dev_addr: Device address on communication Bus (I2C slave address of FT6X36).