Merge branch 'master' into master
This commit is contained in:
commit
0636e2605b
48 changed files with 931 additions and 1269 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -56,3 +56,7 @@ dkms.conf
|
||||||
|
|
||||||
# ESP-IDF build dir
|
# ESP-IDF build dir
|
||||||
build
|
build
|
||||||
|
|
||||||
|
# Kconfig files
|
||||||
|
sdkconfig
|
||||||
|
sdkconfig.old
|
|
@ -3,8 +3,7 @@ if(ESP_PLATFORM)
|
||||||
file(GLOB SOURCES *.c)
|
file(GLOB SOURCES *.c)
|
||||||
set(LVGL_INCLUDE_DIRS . lvgl_tft lvgl_touch/L58/include)
|
set(LVGL_INCLUDE_DIRS . lvgl_tft lvgl_touch/L58/include)
|
||||||
list(APPEND SOURCES "lvgl_tft/disp_driver.c")
|
list(APPEND SOURCES "lvgl_tft/disp_driver.c")
|
||||||
|
list(APPEND SOURCES "lvgl_tft/esp_lcd_backlight.c")
|
||||||
#@todo add SimleInclude macro here
|
|
||||||
|
|
||||||
# Include only the source file of the selected
|
# Include only the source file of the selected
|
||||||
# display controller.
|
# display controller.
|
||||||
|
@ -45,6 +44,8 @@ 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")
|
||||||
else()
|
else()
|
||||||
message(WARNING "LVGL ESP32 drivers: Display controller not defined.")
|
message(WARNING "LVGL ESP32 drivers: Display controller not defined.")
|
||||||
endif()
|
endif()
|
||||||
|
@ -81,11 +82,13 @@ if(CONFIG_LV_TOUCH_CONTROLLER)
|
||||||
|
|
||||||
if(CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI)
|
if(CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI)
|
||||||
list(APPEND SOURCES "lvgl_touch/tp_spi.c")
|
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()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CONFIG_LV_I2C)
|
||||||
|
list(APPEND SOURCES "lvgl_i2c/i2c_manager.c")
|
||||||
|
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)
|
||||||
|
|
16
Kconfig
16
Kconfig
|
@ -1,2 +1,14 @@
|
||||||
rsource "lvgl_tft/Kconfig"
|
menu "LVGL ESP Drivers"
|
||||||
rsource "lvgl_touch/Kconfig"
|
|
||||||
|
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
|
||||||
|
|
33
README.md
33
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 display controllers](#supported-display-controllers)
|
||||||
- [Supported indev controllers](#supported-indev-controllers)
|
- [Supported indev controllers](#supported-indev-controllers)
|
||||||
- [Support for predefined development kits](#support-for-predefined-development-kits)
|
- [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
|
**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).
|
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 |
|
| 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 |
|
||||||
|
@ -41,8 +44,8 @@ To use an EPDiy supported epaper you need to add it [as a component using git su
|
||||||
## Supported indev controllers
|
## Supported indev controllers
|
||||||
|
|
||||||
- XPT2046
|
- XPT2046
|
||||||
- FT3236
|
- FT3236, FT6X36
|
||||||
- other FT6X36 or the FT6206 controllers should work as well (not tested)
|
- FT6206 controllers should work as well (not tested)
|
||||||
- STMPE610
|
- STMPE610
|
||||||
- FT81x (Single, Dual, and Quad SPI)
|
- FT81x (Single, Dual, and Quad SPI)
|
||||||
- L58 touch component hook (Used in Lilygo EPD47 parallel with EPDiy driver)
|
- 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 |
|
| ESP Wrover Kit v4.1 | ILI9341 | SPI | 240 | 320 |
|
||||||
| M5Stack | ILI9341 | SPI | 240 | 320 |
|
| M5Stack | ILI9341 | SPI | 240 | 320 |
|
||||||
| M5Core2 | ILI9341 | SPI | 240 | 320 |
|
| M5Stack Core2 | ILI9341 | SPI | 240 | 320 |
|
||||||
| M5Stick | SH1107 | SPI | - | - |
|
| M5Stick | SH1107 | SPI | - | - |
|
||||||
| M5StickC | ST7735S | SPI | 80 | 160 |
|
| M5StickC | ST7735S | SPI | 80 | 160 |
|
||||||
| Adafruit 3.5 Featherwing | HX8357 | SPI | 480 | 320 |
|
| 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 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.
|
**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)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# LVGL ESP32 drivers
|
# LVGL ESP32 drivers
|
||||||
|
|
||||||
# Define sources and include dirs
|
# Define sources and include dirs
|
||||||
COMPONENT_SRCDIRS := . lvgl_tft lvgl_touch
|
COMPONENT_SRCDIRS := . lvgl_tft lvgl_touch lvgl_i2c
|
||||||
COMPONENT_ADD_INCLUDEDIRS := .
|
COMPONENT_ADD_INCLUDEDIRS := .
|
||||||
|
|
||||||
# LVGL is supposed to be used as a ESP-IDF component
|
# 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_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_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)
|
||||||
|
|
|
@ -114,6 +114,8 @@ void lvgl_driver_init(void)
|
||||||
ESP_LOGI(TAG, "Initializing Parallel driver for display");
|
ESP_LOGI(TAG, "Initializing Parallel driver for display");
|
||||||
// Check how not to initialize SPI. disp_driver_init() call is needed:
|
// Check how not to initialize SPI. disp_driver_init() call is needed:
|
||||||
disp_driver_init();
|
disp_driver_init();
|
||||||
|
#elif defined (CONFIG_LV_I2C_DISPLAY)
|
||||||
|
disp_driver_init();
|
||||||
#else
|
#else
|
||||||
#error "No protocol defined for display controller"
|
#error "No protocol defined for display controller"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,6 +16,7 @@ extern "C" {
|
||||||
|
|
||||||
#include "lvgl_spi_conf.h"
|
#include "lvgl_spi_conf.h"
|
||||||
#include "lvgl_tft/disp_driver.h"
|
#include "lvgl_tft/disp_driver.h"
|
||||||
|
#include "lvgl_tft/esp_lcd_backlight.h"
|
||||||
#include "lvgl_touch/touch_driver.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
|
#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))
|
||||||
#else
|
#else
|
||||||
#error "No display controller selected"
|
#error "No display controller selected"
|
||||||
#endif
|
#endif
|
||||||
|
@ -94,14 +97,14 @@ extern "C" {
|
||||||
* GLOBAL PROTOTYPES
|
* GLOBAL PROTOTYPES
|
||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
|
void lvgl_i2c_locking(void* leader);
|
||||||
|
|
||||||
/* Initialize detected SPI and I2C bus and devices */
|
/* Initialize detected SPI and I2C bus and devices */
|
||||||
void lvgl_driver_init(void);
|
void lvgl_driver_init(void);
|
||||||
|
|
||||||
/* Initialize SPI master */
|
/* Initialize SPI master */
|
||||||
bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin,
|
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);
|
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
|
* MACROS
|
||||||
|
|
116
lvgl_i2c_conf.h
116
lvgl_i2c_conf.h
|
@ -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*/
|
|
|
@ -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
|
||||||
|
@ -166,6 +158,8 @@ 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 (40*1000*1000)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -111,16 +111,6 @@ 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
|
//Initialize non-SPI GPIOs
|
||||||
gpio_pad_select_gpio(GC9A01_DC);
|
gpio_pad_select_gpio(GC9A01_DC);
|
||||||
gpio_set_direction(GC9A01_DC, GPIO_MODE_OUTPUT);
|
gpio_set_direction(GC9A01_DC, GPIO_MODE_OUTPUT);
|
||||||
|
@ -128,14 +118,7 @@ void GC9A01_init(void)
|
||||||
#if GC9A01_USE_RST
|
#if GC9A01_USE_RST
|
||||||
gpio_pad_select_gpio(GC9A01_RST);
|
gpio_pad_select_gpio(GC9A01_RST);
|
||||||
gpio_set_direction(GC9A01_RST, GPIO_MODE_OUTPUT);
|
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
|
//Reset the display
|
||||||
gpio_set_level(GC9A01_RST, 0);
|
gpio_set_level(GC9A01_RST, 0);
|
||||||
vTaskDelay(100 / portTICK_RATE_MS);
|
vTaskDelay(100 / portTICK_RATE_MS);
|
||||||
|
@ -156,8 +139,6 @@ void GC9A01_init(void)
|
||||||
cmd++;
|
cmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
GC9A01_enable_backlight(true);
|
|
||||||
|
|
||||||
GC9A01_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
GC9A01_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||||
|
|
||||||
#if GC9A01_INVERT_COLORS == 1
|
#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);
|
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()
|
void GC9A01_sleep_in()
|
||||||
{
|
{
|
||||||
uint8_t data[] = {0x08};
|
uint8_t data[] = {0x08};
|
||||||
|
|
|
@ -28,16 +28,6 @@ extern "C" {
|
||||||
#define GC9A01_DC CONFIG_LV_DISP_PIN_DC
|
#define GC9A01_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define GC9A01_RST CONFIG_LV_DISP_PIN_RST
|
#define GC9A01_RST CONFIG_LV_DISP_PIN_RST
|
||||||
#define GC9A01_USE_RST CONFIG_LV_DISP_USE_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_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
#define GC9A01_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
|
@ -50,7 +40,6 @@ extern "C" {
|
||||||
|
|
||||||
void GC9A01_init(void);
|
void GC9A01_init(void);
|
||||||
void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
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_in(void);
|
||||||
void GC9A01_sleep_out(void);
|
void GC9A01_sleep_out(void);
|
||||||
|
|
||||||
|
|
247
lvgl_tft/Kconfig
247
lvgl_tft/Kconfig
|
@ -50,7 +50,7 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
config LV_PREDEFINED_DISPLAY_WEMOS_LOLIN
|
config LV_PREDEFINED_DISPLAY_WEMOS_LOLIN
|
||||||
bool "Wemos Lolin OLED"
|
bool "Wemos Lolin OLED"
|
||||||
select LV_TFT_DISPLAY_CONTROLLER_SSD1306
|
select LV_TFT_DISPLAY_CONTROLLER_SSD1306
|
||||||
select LV_TFT_DISPLAY_PROTOCOL_I2C
|
select LV_I2C_DISPLAY
|
||||||
select LV_TFT_DISPLAY_MONOCHROME
|
select LV_TFT_DISPLAY_MONOCHROME
|
||||||
select LV_THEME_MONO
|
select LV_THEME_MONO
|
||||||
config LV_PREDEFINED_DISPLAY_ATAG
|
config LV_PREDEFINED_DISPLAY_ATAG
|
||||||
|
@ -179,6 +179,10 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
help
|
help
|
||||||
ILI9163C display controller.
|
ILI9163C display controller.
|
||||||
|
|
||||||
|
config LV_TFT_DISPLAY_CONTROLLER_PCD8544
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
PCD8544 display controller (Nokia 3110/5110)
|
||||||
# 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
|
||||||
|
@ -197,7 +201,7 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
help
|
help
|
||||||
Display controller protocol SPI
|
Display controller protocol SPI
|
||||||
|
|
||||||
config LV_TFT_DISPLAY_PROTOCOL_I2C
|
config LV_I2C_DISPLAY
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
Display controller protocol I2C
|
Display controller protocol I2C
|
||||||
|
@ -205,24 +209,24 @@ menu "LVGL TFT/Epaper 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
|
||||||
|
@ -231,14 +235,14 @@ menu "LVGL TFT/Epaper 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
|
int "X offset"
|
||||||
default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_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 && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_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
|
int "Y offset"
|
||||||
default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_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 && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED)
|
default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED)
|
||||||
default 0
|
default 0
|
||||||
|
@ -324,7 +328,7 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
config LV_TFT_DISPLAY_USER_CONTROLLER_SSD1306
|
config LV_TFT_DISPLAY_USER_CONTROLLER_SSD1306
|
||||||
bool "SSD1306"
|
bool "SSD1306"
|
||||||
select LV_TFT_DISPLAY_CONTROLLER_SSD1306
|
select LV_TFT_DISPLAY_CONTROLLER_SSD1306
|
||||||
select LV_TFT_DISPLAY_PROTOCOL_I2C
|
select LV_I2C_DISPLAY
|
||||||
select LV_TFT_DISPLAY_MONOCHROME
|
select LV_TFT_DISPLAY_MONOCHROME
|
||||||
config LV_TFT_DISPLAY_USER_CONTROLLER_FT81X
|
config LV_TFT_DISPLAY_USER_CONTROLLER_FT81X
|
||||||
bool "FT81X"
|
bool "FT81X"
|
||||||
|
@ -353,6 +357,11 @@ menu "LVGL TFT/Epaper 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
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config CUSTOM_DISPLAY_BUFFER_SIZE
|
config CUSTOM_DISPLAY_BUFFER_SIZE
|
||||||
|
@ -472,20 +481,15 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI && \
|
prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||||
!LV_PREDEFINED_DISPLAY_TTGO
|
default LV_TFT_DISPLAY_SPI2_HOST
|
||||||
default LV_TFT_DISPLAY_SPI_VSPI if LV_PREDEFINED_DISPLAY_TTGO && \
|
|
||||||
!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
|
||||||
|
@ -516,18 +520,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_SIO
|
depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_SIO
|
||||||
endchoice
|
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
|
config LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER
|
||||||
bool "Use custom SPI clock frequency." if LV_TFT_DISPLAY_PROTOCOL_SPI
|
bool "Use custom SPI clock frequency." if LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||||
default n
|
default n
|
||||||
|
@ -605,6 +597,16 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
default 80 if LV_TFT_SPI_CLK_DIVIDER_80
|
default 80 if LV_TFT_SPI_CLK_DIVIDER_80
|
||||||
default 2
|
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
|
config LV_INVERT_DISPLAY
|
||||||
bool "IN DEPRECATION - Invert display." if LV_TFT_DISPLAY_CONTROLLER_RA8875
|
bool "IN DEPRECATION - Invert display." if LV_TFT_DISPLAY_CONTROLLER_RA8875
|
||||||
default n
|
default n
|
||||||
|
@ -618,31 +620,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
If the colors look inverted on your display, try enabling this.
|
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.
|
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 will be visible only when LV_PREDEFINED_DISPLAY_NONE is y
|
||||||
menu "Display RA8875 Configuration"
|
menu "Display RA8875 Configuration"
|
||||||
|
@ -783,10 +760,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
|
|
||||||
config LV_DISP_SPI_MOSI
|
config LV_DISP_SPI_MOSI
|
||||||
int "GPIO for MOSI (Master Out Slave In)" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
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_WROVER4
|
||||||
default 23 if LV_PREDEFINED_DISPLAY_ATAG
|
default 23 if LV_PREDEFINED_DISPLAY_ATAG
|
||||||
default 23 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK
|
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 19 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS
|
||||||
default 13 if LV_PREDEFINED_DISPLAY_WT32_SC01
|
default 13 if LV_PREDEFINED_DISPLAY_WT32_SC01
|
||||||
default 13
|
default 13
|
||||||
|
|
||||||
help
|
help
|
||||||
Configure the display MOSI pin here.
|
Configure the display MOSI pin here.
|
||||||
|
|
||||||
|
@ -813,10 +785,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
config LV_DISP_SPI_MISO
|
config LV_DISP_SPI_MISO
|
||||||
int "GPIO for MISO (Master In Slave Out)" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
int "GPIO for MISO (Master In Slave Out)" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||||
depends on LV_DISPLAY_USE_SPI_MISO
|
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 19 if LV_PREDEFINED_PINS_TKOALA
|
||||||
default 38 if LV_PREDEFINED_DISPLAY_M5CORE2
|
default 38 if LV_PREDEFINED_DISPLAY_M5CORE2
|
||||||
default 0
|
default 0
|
||||||
|
@ -836,10 +804,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
config LV_DISP_SPI_IO2
|
config LV_DISP_SPI_IO2
|
||||||
int "GPIO for Quad SPI IO2/WP" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
int "GPIO for Quad SPI IO2/WP" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||||
depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO
|
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 22 if LV_PREDEFINED_PINS_TKOALA && LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO
|
||||||
default -1
|
default -1
|
||||||
help
|
help
|
||||||
|
@ -848,10 +812,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
config LV_DISP_SPI_IO3
|
config LV_DISP_SPI_IO3
|
||||||
int "GPIO for Quad SPI IO3/HD" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
int "GPIO for Quad SPI IO3/HD" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||||
depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO
|
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 21 if LV_PREDEFINED_PINS_TKOALA && LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO
|
||||||
default -1
|
default -1
|
||||||
help
|
help
|
||||||
|
@ -859,10 +819,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
|
|
||||||
config LV_DISP_SPI_CLK
|
config LV_DISP_SPI_CLK
|
||||||
int "GPIO for CLK (SCK / Serial Clock)" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
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_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK
|
||||||
default 18 if LV_PREDEFINED_DISPLAY_M5CORE2
|
default 18 if LV_PREDEFINED_DISPLAY_M5CORE2
|
||||||
default 13 if LV_PREDEFINED_DISPLAY_M5STICKC
|
default 13 if LV_PREDEFINED_DISPLAY_M5STICKC
|
||||||
|
@ -888,10 +844,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
config LV_DISP_SPI_CS
|
config LV_DISP_SPI_CS
|
||||||
int "GPIO for CS (Slave Select)" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
int "GPIO for CS (Slave Select)" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||||
depends on LV_DISPLAY_USE_SPI_CS
|
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 5 if LV_PREDEFINED_PINS_38V1
|
||||||
default 14 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK
|
default 14 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK
|
||||||
default 5 if LV_PREDEFINED_DISPLAY_M5CORE2
|
default 5 if LV_PREDEFINED_DISPLAY_M5CORE2
|
||||||
|
@ -917,10 +869,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
|
|
||||||
config LV_DISP_PIN_DC
|
config LV_DISP_PIN_DC
|
||||||
int "GPIO for DC (Data / Command)" if LV_TFT_DISPLAY_PROTOCOL_SPI
|
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
|
depends on LV_DISPLAY_USE_DC
|
||||||
default 19 if LV_PREDEFINED_PINS_38V1
|
default 19 if LV_PREDEFINED_PINS_38V1
|
||||||
default 17 if LV_PREDEFINED_PINS_38V4
|
default 17 if LV_PREDEFINED_PINS_38V4
|
||||||
|
@ -955,10 +903,6 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
config LV_DISP_PIN_RST
|
config LV_DISP_PIN_RST
|
||||||
int "GPIO for Reset" if LV_TFT_DISPLAY_PROTOCOL_SPI && !LV_DISP_ST7789_SOFT_RESET
|
int "GPIO for Reset" if LV_TFT_DISPLAY_PROTOCOL_SPI && !LV_DISP_ST7789_SOFT_RESET
|
||||||
depends on LV_DISP_USE_RST
|
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 18 if LV_PREDEFINED_PINS_38V1
|
||||||
default 25 if LV_PREDEFINED_PINS_38V4
|
default 25 if LV_PREDEFINED_PINS_38V4
|
||||||
default 33 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK
|
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
|
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
|
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 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 35 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2
|
||||||
default 21 if IDF_TARGET_ESP32C3
|
default 21 if IDF_TARGET_ESP32C3
|
||||||
|
@ -988,23 +928,59 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
help
|
help
|
||||||
Configure the display Busy pin here.
|
Configure the display Busy pin here.
|
||||||
|
|
||||||
config LV_ENABLE_BACKLIGHT_CONTROL
|
endmenu
|
||||||
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 ) ) \
|
choice
|
||||||
|| LV_PREDEFINED_DISPLAY_RPI_MPI3501
|
prompt "Select an I2C port for the display"
|
||||||
default y if LV_PREDEFINED_DISPLAY_M5STACK
|
default LV_I2C_DISPLAY_PORT_0
|
||||||
default n if LV_PREDEFINED_DISPLAY_M5CORE2
|
depends on LV_I2C_DISPLAY
|
||||||
default y if LV_PREDEFINED_DISPLAY_WROVER4
|
|
||||||
default y if LV_PREDEFINED_DISPLAY_ERTFT0356
|
config LV_I2C_DISPLAY_PORT_0
|
||||||
default y if LV_PREDEFINED_DISPLAY_TTGO
|
bool
|
||||||
default y if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS
|
prompt "I2C port 0"
|
||||||
default y if LV_PREDEFINED_DISPLAY_WT32_SC01
|
|
||||||
help
|
help
|
||||||
Enable controlling the display backlight using an GPIO
|
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
|
config LV_BACKLIGHT_ACTIVE_LVL
|
||||||
bool "Is backlight turn on with a HIGH (1) logic level?"
|
bool "Is backlight turn on with a HIGH (1) logic level?" if \
|
||||||
depends on LV_ENABLE_BACKLIGHT_CONTROL
|
( 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_M5STACK
|
||||||
default y if LV_PREDEFINED_DISPLAY_ERTFT0356
|
default y if LV_PREDEFINED_DISPLAY_ERTFT0356
|
||||||
default y if LV_PREDEFINED_DISPLAY_TTGO
|
default y if LV_PREDEFINED_DISPLAY_TTGO
|
||||||
|
@ -1016,12 +992,10 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
otherwise a 0 will be expected to enable it.
|
otherwise a 0 will be expected to enable it.
|
||||||
|
|
||||||
config LV_DISP_PIN_BCKL
|
config LV_DISP_PIN_BCKL
|
||||||
int "GPIO for Backlight Control"
|
int "GPIO for Backlight Control" if \
|
||||||
depends on LV_ENABLE_BACKLIGHT_CONTROL
|
( LV_PREDEFINED_DISPLAY_NONE && ! ( LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 ) ) \
|
||||||
range 0 39 if IDF_TARGET_ESP32
|
|| LV_PREDEFINED_DISPLAY_RPI_MPI3501
|
||||||
range 0 43 if IDF_TARGET_ESP32S2
|
depends on !LV_DISP_BACKLIGHT_OFF
|
||||||
range 0 21 if IDF_TARGET_ESP32C3
|
|
||||||
|
|
||||||
default 23 if LV_PREDEFINED_PINS_38V1
|
default 23 if LV_PREDEFINED_PINS_38V1
|
||||||
default 26 if LV_PREDEFINED_PINS_38V4
|
default 26 if LV_PREDEFINED_PINS_38V4
|
||||||
default 32 if LV_PREDEFINED_DISPLAY_M5STACK
|
default 32 if LV_PREDEFINED_DISPLAY_M5STACK
|
||||||
|
@ -1032,35 +1006,18 @@ menu "LVGL TFT/Epaper Display controller"
|
||||||
default 4 if LV_PREDEFINED_DISPLAY_TTGO
|
default 4 if LV_PREDEFINED_DISPLAY_TTGO
|
||||||
default 2 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS
|
default 2 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS
|
||||||
default 23 if LV_PREDEFINED_DISPLAY_WT32_SC01
|
default 23 if LV_PREDEFINED_DISPLAY_WT32_SC01
|
||||||
default 27
|
default -1
|
||||||
|
|
||||||
help
|
help
|
||||||
Configure the display BCLK (LED) pin here.
|
Configure the display BCLK (LED) pin here.
|
||||||
|
|
||||||
config LV_DISP_PIN_SDA
|
config LV_I2C
|
||||||
int "GPIO for I2C SDA" if LV_TFT_DISPLAY_PROTOCOL_I2C
|
bool
|
||||||
range 0 39 if IDF_TARGET_ESP32
|
default y if LV_I2C_DISPLAY
|
||||||
range 0 43 if IDF_TARGET_ESP32S2
|
|
||||||
range 0 21 if IDF_TARGET_ESP32C3
|
|
||||||
|
|
||||||
default 5 if LV_PREDEFINED_DISPLAY_WEMOS_LOLIN
|
config LV_I2C_DISPLAY_PORT
|
||||||
default 5
|
int
|
||||||
|
default 1 if LV_I2C_DISPLAY_PORT_1
|
||||||
help
|
default 0
|
||||||
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
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
|
|
||||||
#include "disp_driver.h"
|
#include "disp_driver.h"
|
||||||
#include "disp_spi.h"
|
#include "disp_spi.h"
|
||||||
|
#include "esp_lcd_backlight.h"
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
|
||||||
void *disp_driver_init(void)
|
void *disp_driver_init(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -310,7 +310,12 @@ static void IRAM_ATTR spi_ready(spi_transaction_t *trans)
|
||||||
disp = lv_refr_get_disp_refreshing();
|
disp = lv_refr_get_disp_refreshing();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if LVGL_VERSION_MAJOR < 8
|
||||||
lv_disp_flush_ready(&disp->driver);
|
lv_disp_flush_ready(&disp->driver);
|
||||||
|
#else
|
||||||
|
lv_disp_flush_ready(disp->driver);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chained_post_cb) {
|
if (chained_post_cb) {
|
||||||
|
|
107
lvgl_tft/esp_lcd_backlight.c
Normal file
107
lvgl_tft/esp_lcd_backlight.c
Normal file
|
@ -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);
|
||||||
|
}
|
67
lvgl_tft/esp_lcd_backlight.h
Normal file
67
lvgl_tft/esp_lcd_backlight.h
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/**
|
||||||
|
* @file esp_lcd_backlight.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ESP_LCD_BACKLIGHT_H
|
||||||
|
#define ESP_LCD_BACKLIGHT_H
|
||||||
|
|
||||||
|
/*********************
|
||||||
|
* INCLUDES
|
||||||
|
*********************/
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#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*/
|
|
@ -166,14 +166,7 @@ void hx8357_init(void)
|
||||||
#if HX8357_USE_RST
|
#if HX8357_USE_RST
|
||||||
gpio_pad_select_gpio(HX8357_RST);
|
gpio_pad_select_gpio(HX8357_RST);
|
||||||
gpio_set_direction(HX8357_RST, GPIO_MODE_OUTPUT);
|
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
|
//Reset the display
|
||||||
gpio_set_level(HX8357_RST, 0);
|
gpio_set_level(HX8357_RST, 0);
|
||||||
vTaskDelay(10 / portTICK_RATE_MS);
|
vTaskDelay(10 / portTICK_RATE_MS);
|
||||||
|
@ -210,8 +203,6 @@ void hx8357_init(void)
|
||||||
#else
|
#else
|
||||||
hx8357_send_cmd(HX8357_INVOFF);
|
hx8357_send_cmd(HX8357_INVOFF);
|
||||||
#endif
|
#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);
|
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)
|
void hx8357_set_rotation(uint8_t r)
|
||||||
{
|
{
|
||||||
r = r & 3; // can't be higher than 3
|
r = r & 3; // can't be higher than 3
|
||||||
|
|
|
@ -38,17 +38,8 @@ extern "C" {
|
||||||
#define HX8357_DC CONFIG_LV_DISP_PIN_DC
|
#define HX8357_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define HX8357_RST CONFIG_LV_DISP_PIN_RST
|
#define HX8357_RST CONFIG_LV_DISP_PIN_RST
|
||||||
#define HX8357_USE_RST CONFIG_LV_DISP_USE_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
|
#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
|
|
||||||
|
|
||||||
|
|
||||||
/*******************
|
/*******************
|
||||||
* HX8357B/D REGS
|
* HX8357B/D REGS
|
||||||
|
@ -136,7 +127,6 @@ extern "C" {
|
||||||
|
|
||||||
void hx8357_init(void);
|
void hx8357_init(void);
|
||||||
void hx8357_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
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);
|
void hx8357_set_rotation(uint8_t r);
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
|
|
|
@ -199,15 +199,13 @@ void il3820_init(void)
|
||||||
gpio_pad_select_gpio(IL3820_DC_PIN);
|
gpio_pad_select_gpio(IL3820_DC_PIN);
|
||||||
gpio_set_direction(IL3820_DC_PIN, GPIO_MODE_OUTPUT);
|
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_pad_select_gpio(IL3820_BUSY_PIN);
|
||||||
gpio_set_direction(IL3820_BUSY_PIN, GPIO_MODE_INPUT);
|
gpio_set_direction(IL3820_BUSY_PIN, GPIO_MODE_INPUT);
|
||||||
|
|
||||||
#if IL3820_USE_RST
|
#if IL3820_USE_RST
|
||||||
|
gpio_pad_select_gpio(IL3820_RST_PIN);
|
||||||
|
gpio_set_direction(IL3820_RST_PIN, GPIO_MODE_OUTPUT);
|
||||||
|
|
||||||
/* Harware reset */
|
/* Harware reset */
|
||||||
gpio_set_level( IL3820_RST_PIN, 0);
|
gpio_set_level( IL3820_RST_PIN, 0);
|
||||||
vTaskDelay(IL3820_RESET_DELAY / portTICK_RATE_MS);
|
vTaskDelay(IL3820_RESET_DELAY / portTICK_RATE_MS);
|
||||||
|
|
|
@ -143,10 +143,6 @@ void ili9163c_init(void)
|
||||||
gpio_pad_select_gpio(ILI9163C_RST);
|
gpio_pad_select_gpio(ILI9163C_RST);
|
||||||
gpio_set_direction(ILI9163C_RST, GPIO_MODE_OUTPUT);
|
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
|
//Reset the display
|
||||||
gpio_set_level(ILI9163C_RST, 0);
|
gpio_set_level(ILI9163C_RST, 0);
|
||||||
vTaskDelay(100 / portTICK_RATE_MS);
|
vTaskDelay(100 / portTICK_RATE_MS);
|
||||||
|
@ -166,8 +162,6 @@ void ili9163c_init(void)
|
||||||
cmd++;
|
cmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ili9163c_enable_backlight(true);
|
|
||||||
|
|
||||||
ili9163c_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
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);
|
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()
|
void ili9163c_sleep_in()
|
||||||
{
|
{
|
||||||
uint8_t data[] = {0x08};
|
uint8_t data[] = {0x08};
|
||||||
|
|
|
@ -28,33 +28,22 @@ extern "C"
|
||||||
*********************/
|
*********************/
|
||||||
#define ILI9163C_DC CONFIG_LV_DISP_PIN_DC
|
#define ILI9163C_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define ILI9163C_RST CONFIG_LV_DISP_PIN_RST
|
#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_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
#define ILI9163C_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* TYPEDEFS
|
* TYPEDEFS
|
||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* GLOBAL PROTOTYPES
|
* GLOBAL PROTOTYPES
|
||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
void ili9163c_init(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_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_in(void);
|
void ili9163c_sleep_out(void);
|
||||||
void ili9163c_sleep_out(void);
|
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* MACROS
|
* MACROS
|
||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
|
|
|
@ -80,30 +80,14 @@ void ili9341_init(void)
|
||||||
{0, {0}, 0xff},
|
{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
|
//Initialize non-SPI GPIOs
|
||||||
gpio_pad_select_gpio(ILI9341_DC);
|
gpio_pad_select_gpio(ILI9341_DC);
|
||||||
gpio_set_direction(ILI9341_DC, GPIO_MODE_OUTPUT);
|
gpio_set_direction(ILI9341_DC, GPIO_MODE_OUTPUT);
|
||||||
|
|
||||||
#if ILI9341_USE_RST
|
#if ILI9341_USE_RST
|
||||||
gpio_pad_select_gpio(ILI9341_RST);
|
gpio_pad_select_gpio(ILI9341_RST);
|
||||||
gpio_set_direction(ILI9341_RST, GPIO_MODE_OUTPUT);
|
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
|
//Reset the display
|
||||||
gpio_set_level(ILI9341_RST, 0);
|
gpio_set_level(ILI9341_RST, 0);
|
||||||
vTaskDelay(100 / portTICK_RATE_MS);
|
vTaskDelay(100 / portTICK_RATE_MS);
|
||||||
|
@ -124,8 +108,6 @@ void ili9341_init(void)
|
||||||
cmd++;
|
cmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ili9341_enable_backlight(true);
|
|
||||||
|
|
||||||
ili9341_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
ili9341_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||||
|
|
||||||
#if ILI9341_INVERT_COLORS == 1
|
#if ILI9341_INVERT_COLORS == 1
|
||||||
|
@ -158,29 +140,10 @@ void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col
|
||||||
|
|
||||||
/*Memory write*/
|
/*Memory write*/
|
||||||
ili9341_send_cmd(0x2C);
|
ili9341_send_cmd(0x2C);
|
||||||
|
|
||||||
|
|
||||||
uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);
|
uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);
|
||||||
|
|
||||||
ili9341_send_color((void*)color_map, size * 2);
|
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()
|
void ili9341_sleep_in()
|
||||||
{
|
{
|
||||||
uint8_t data[] = {0x08};
|
uint8_t data[] = {0x08};
|
||||||
|
|
|
@ -20,7 +20,8 @@ extern "C" {
|
||||||
#else
|
#else
|
||||||
#include "lvgl/lvgl.h"
|
#include "lvgl/lvgl.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../lvgl_helpers.h"
|
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
|
||||||
/*********************
|
/*********************
|
||||||
* DEFINES
|
* DEFINES
|
||||||
|
@ -28,16 +29,6 @@ extern "C" {
|
||||||
#define ILI9341_DC CONFIG_LV_DISP_PIN_DC
|
#define ILI9341_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define ILI9341_USE_RST CONFIG_LV_DISP_USE_RST
|
#define ILI9341_USE_RST CONFIG_LV_DISP_USE_RST
|
||||||
#define ILI9341_RST CONFIG_LV_DISP_PIN_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
|
#define ILI9341_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
|
@ -50,7 +41,6 @@ extern "C" {
|
||||||
|
|
||||||
void ili9341_init(void);
|
void ili9341_init(void);
|
||||||
void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
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_in(void);
|
||||||
void ili9341_sleep_out(void);
|
void ili9341_sleep_out(void);
|
||||||
|
|
||||||
|
|
|
@ -80,14 +80,7 @@ void ili9481_init(void)
|
||||||
#if ILI9481_USE_RST
|
#if ILI9481_USE_RST
|
||||||
gpio_pad_select_gpio(ILI9481_RST);
|
gpio_pad_select_gpio(ILI9481_RST);
|
||||||
gpio_set_direction(ILI9481_RST, GPIO_MODE_OUTPUT);
|
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
|
//Reset the display
|
||||||
gpio_set_level(ILI9481_RST, 0);
|
gpio_set_level(ILI9481_RST, 0);
|
||||||
vTaskDelay(100 / portTICK_RATE_MS);
|
vTaskDelay(100 / portTICK_RATE_MS);
|
||||||
|
@ -112,8 +105,6 @@ void ili9481_init(void)
|
||||||
cmd++;
|
cmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ili9481_enable_backlight(true);
|
|
||||||
|
|
||||||
ili9481_set_orientation(ILI9481_DISPLAY_ORIENTATION);
|
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);
|
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
|
* STATIC FUNCTIONS
|
||||||
**********************/
|
**********************/
|
||||||
|
|
|
@ -28,17 +28,9 @@ extern "C" {
|
||||||
#define ILI9481_DC CONFIG_LV_DISP_PIN_DC
|
#define ILI9481_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define ILI9481_RST CONFIG_LV_DISP_PIN_RST
|
#define ILI9481_RST CONFIG_LV_DISP_PIN_RST
|
||||||
#define ILI9481_USE_RST CONFIG_LV_DISP_USE_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_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
||||||
#define ILI9481_DISPLAY_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION
|
#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
|
* ILI9481 REGS
|
||||||
|
@ -118,7 +110,6 @@ extern "C" {
|
||||||
|
|
||||||
void ili9481_init(void);
|
void ili9481_init(void);
|
||||||
void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
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
|
* MACROS
|
||||||
|
|
|
@ -65,16 +65,6 @@ void ili9486_init(void)
|
||||||
{0x00, {0}, 0xff},
|
{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
|
//Initialize non-SPI GPIOs
|
||||||
gpio_pad_select_gpio(ILI9486_DC);
|
gpio_pad_select_gpio(ILI9486_DC);
|
||||||
gpio_set_direction(ILI9486_DC, GPIO_MODE_OUTPUT);
|
gpio_set_direction(ILI9486_DC, GPIO_MODE_OUTPUT);
|
||||||
|
@ -82,14 +72,7 @@ void ili9486_init(void)
|
||||||
#if ILI9486_USE_RST
|
#if ILI9486_USE_RST
|
||||||
gpio_pad_select_gpio(ILI9486_RST);
|
gpio_pad_select_gpio(ILI9486_RST);
|
||||||
gpio_set_direction(ILI9486_RST, GPIO_MODE_OUTPUT);
|
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
|
//Reset the display
|
||||||
gpio_set_level(ILI9486_RST, 0);
|
gpio_set_level(ILI9486_RST, 0);
|
||||||
vTaskDelay(100 / portTICK_RATE_MS);
|
vTaskDelay(100 / portTICK_RATE_MS);
|
||||||
|
@ -110,8 +93,6 @@ void ili9486_init(void)
|
||||||
cmd++;
|
cmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ili9486_enable_backlight(true);
|
|
||||||
|
|
||||||
ili9486_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
ili9486_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
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
|
* STATIC FUNCTIONS
|
||||||
**********************/
|
**********************/
|
||||||
|
|
|
@ -28,15 +28,7 @@ extern "C" {
|
||||||
#define ILI9486_DC CONFIG_LV_DISP_PIN_DC
|
#define ILI9486_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define ILI9486_RST CONFIG_LV_DISP_PIN_RST
|
#define ILI9486_RST CONFIG_LV_DISP_PIN_RST
|
||||||
#define ILI9486_USE_RST CONFIG_LV_DISP_USE_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
|
* TYPEDEFS
|
||||||
|
@ -48,7 +40,6 @@ extern "C" {
|
||||||
|
|
||||||
void ili9486_init(void);
|
void ili9486_init(void);
|
||||||
void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
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
|
* MACROS
|
||||||
|
|
|
@ -82,14 +82,7 @@ void ili9488_init(void)
|
||||||
#if ILI9488_USE_RST
|
#if ILI9488_USE_RST
|
||||||
gpio_pad_select_gpio(ILI9488_RST);
|
gpio_pad_select_gpio(ILI9488_RST);
|
||||||
gpio_set_direction(ILI9488_RST, GPIO_MODE_OUTPUT);
|
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
|
//Reset the display
|
||||||
gpio_set_level(ILI9488_RST, 0);
|
gpio_set_level(ILI9488_RST, 0);
|
||||||
vTaskDelay(100 / portTICK_RATE_MS);
|
vTaskDelay(100 / portTICK_RATE_MS);
|
||||||
|
@ -114,8 +107,6 @@ void ili9488_init(void)
|
||||||
cmd++;
|
cmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ili9488_enable_backlight(true);
|
|
||||||
|
|
||||||
ili9488_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
ili9488_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
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
|
* STATIC FUNCTIONS
|
||||||
**********************/
|
**********************/
|
||||||
|
|
|
@ -27,16 +27,7 @@ extern "C" {
|
||||||
*********************/
|
*********************/
|
||||||
#define ILI9488_DC CONFIG_LV_DISP_PIN_DC
|
#define ILI9488_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define ILI9488_RST CONFIG_LV_DISP_PIN_RST
|
#define ILI9488_RST CONFIG_LV_DISP_PIN_RST
|
||||||
#define ILI9488_USE_RST CONFIG_LV_DISP_USE_RST
|
#define ILI9488_USE_RST CONFIG_LV_DISP_USE_RSTS
|
||||||
#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
|
|
||||||
|
|
||||||
/*******************
|
/*******************
|
||||||
* ILI9488 REGS
|
* ILI9488 REGS
|
||||||
|
@ -155,7 +146,6 @@ typedef struct {
|
||||||
|
|
||||||
void ili9488_init(void);
|
void ili9488_init(void);
|
||||||
void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
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
|
* MACROS
|
||||||
|
|
148
lvgl_tft/pcd8544.c
Normal file
148
lvgl_tft/pcd8544.c
Normal 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
57
lvgl_tft/pcd8544.h
Normal 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*/
|
|
@ -148,29 +148,12 @@ void ra8875_init(void)
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Initializing RA8875...");
|
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
|
// Initialize non-SPI GPIOs
|
||||||
|
|
||||||
#if RA8875_USE_RST
|
#if RA8875_USE_RST
|
||||||
gpio_pad_select_gpio(RA8875_RST);
|
gpio_pad_select_gpio(RA8875_RST);
|
||||||
gpio_set_direction(RA8875_RST, GPIO_MODE_OUTPUT);
|
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
|
// Reset the RA8875
|
||||||
gpio_set_level(RA8875_RST, 0);
|
gpio_set_level(RA8875_RST, 0);
|
||||||
vTaskDelay(DIV_ROUND_UP(100, portTICK_RATE_MS));
|
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.");
|
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_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)
|
void ra8875_enable_display(bool enable)
|
||||||
|
|
|
@ -97,7 +97,6 @@ extern "C" {
|
||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
void ra8875_init(void);
|
void ra8875_init(void);
|
||||||
void ra8875_enable_backlight(bool backlight);
|
|
||||||
void ra8875_enable_display(bool enable);
|
void ra8875_enable_display(bool enable);
|
||||||
void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,9 @@
|
||||||
/*********************
|
/*********************
|
||||||
* INCLUDES
|
* INCLUDES
|
||||||
*********************/
|
*********************/
|
||||||
#include "driver/i2c.h"
|
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
|
|
||||||
#include "lvgl_i2c_conf.h"
|
#include "lvgl_i2c/i2c_manager.h"
|
||||||
|
|
||||||
#include "ssd1306.h"
|
#include "ssd1306.h"
|
||||||
|
|
||||||
|
@ -25,6 +24,7 @@
|
||||||
*********************/
|
*********************/
|
||||||
#define TAG "SSD1306"
|
#define TAG "SSD1306"
|
||||||
|
|
||||||
|
#define OLED_I2C_PORT (CONFIG_LV_I2C_DISPLAY_PORT)
|
||||||
// SLA (0x3C) + WRITE_MODE (0x00) = 0x78 (0b01111000)
|
// SLA (0x3C) + WRITE_MODE (0x00) = 0x78 (0b01111000)
|
||||||
#define OLED_I2C_ADDRESS 0x3C
|
#define OLED_I2C_ADDRESS 0x3C
|
||||||
#define OLED_WIDTH 128
|
#define OLED_WIDTH 128
|
||||||
|
@ -70,8 +70,6 @@
|
||||||
// Charge Pump (pg.62)
|
// Charge Pump (pg.62)
|
||||||
#define OLED_CMD_SET_CHARGE_PUMP 0x8D // follow with 0x14
|
#define OLED_CMD_SET_CHARGE_PUMP 0x8D // follow with 0x14
|
||||||
|
|
||||||
#define OLED_IIC_FREQ_HZ 400000 // I2C colock frequency
|
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* TYPEDEFS
|
* TYPEDEFS
|
||||||
**********************/
|
**********************/
|
||||||
|
@ -101,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
|
||||||
|
@ -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)
|
static uint8_t send_data(lv_disp_drv_t *disp_drv, void *bytes, size_t bytes_len)
|
||||||
{
|
{
|
||||||
(void) disp_drv;
|
(void) disp_drv;
|
||||||
esp_err_t err;
|
|
||||||
|
|
||||||
uint8_t *data = (uint8_t *) bytes;
|
uint8_t *data = (uint8_t *) bytes;
|
||||||
|
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
return lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, data[0], data + 1, bytes_len - 1 );
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t send_pixels(lv_disp_drv_t *disp_drv, void *color_buffer, size_t buffer_len)
|
static uint8_t send_pixels(lv_disp_drv_t *disp_drv, void *color_buffer, size_t buffer_len)
|
||||||
{
|
{
|
||||||
(void) disp_drv;
|
(void) disp_drv;
|
||||||
esp_err_t err;
|
|
||||||
|
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
return lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, OLED_CONTROL_BYTE_DATA_STREAM, color_buffer, buffer_len);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,8 +25,6 @@ extern "C" {
|
||||||
/*********************
|
/*********************
|
||||||
* DEFINES
|
* DEFINES
|
||||||
*********************/
|
*********************/
|
||||||
#define SSD1306_SDA CONFIG_LV_DISP_PIN_SDA
|
|
||||||
#define SSD1306_SCL CONFIG_LV_DISP_PIN_SCL
|
|
||||||
#define SSD1306_DISPLAY_ORIENTATION TFT_ORIENTATION_LANDSCAPE
|
#define SSD1306_DISPLAY_ORIENTATION TFT_ORIENTATION_LANDSCAPE
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
|
|
|
@ -8,12 +8,15 @@
|
||||||
*********************/
|
*********************/
|
||||||
#include "st7735s.h"
|
#include "st7735s.h"
|
||||||
#include "disp_spi.h"
|
#include "disp_spi.h"
|
||||||
#include "driver/i2c.h"
|
|
||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192
|
||||||
|
#include "lvgl_i2c/i2c_manager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/*********************
|
/*********************
|
||||||
* DEFINES
|
* 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_data(void * data, uint16_t length);
|
||||||
static void st7735s_send_color(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 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_write_byte(uint8_t addr, uint8_t data);
|
||||||
static void axp192_init();
|
static void axp192_init();
|
||||||
static void axp192_sleep_in();
|
static void axp192_sleep_in();
|
||||||
|
@ -60,7 +62,6 @@ uint8_t st7735s_portrait_mode = 0;
|
||||||
void st7735s_init(void)
|
void st7735s_init(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192
|
#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192
|
||||||
i2c_master_init();
|
|
||||||
axp192_init();
|
axp192_init();
|
||||||
#endif
|
#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()
|
void st7735s_sleep_in()
|
||||||
{
|
{
|
||||||
st7735s_send_cmd(0x10);
|
st7735s_send_cmd(0x10);
|
||||||
|
#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192
|
||||||
axp192_sleep_in();
|
axp192_sleep_in();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void st7735s_sleep_out()
|
void st7735s_sleep_out()
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192
|
||||||
axp192_sleep_out();
|
axp192_sleep_out();
|
||||||
|
#endif
|
||||||
st7735s_send_cmd(0x11);
|
st7735s_send_cmd(0x11);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,40 +223,18 @@ static void st7735s_set_orientation(uint8_t orientation)
|
||||||
st7735s_send_data((void *) &data[orientation], 1);
|
st7735s_send_data((void *) &data[orientation], 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void i2c_master_init()
|
#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void axp192_write_byte(uint8_t addr, uint8_t data)
|
static void axp192_write_byte(uint8_t addr, uint8_t data)
|
||||||
{
|
{
|
||||||
esp_err_t ret;
|
err = lvgl_i2c_write(CONFIG_LV_I2C_DISPLAY_PORT, AXP192_I2C_ADDRESS, addr, &data, 1);
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 10/portTICK_PERIOD_MS);
|
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "AXP192 send failed. code: 0x%.2X", ret);
|
ESP_LOGE(TAG, "AXP192 send failed. code: 0x%.2X", ret);
|
||||||
}
|
}
|
||||||
i2c_cmd_link_delete(cmd);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void axp192_init()
|
static void axp192_init()
|
||||||
{
|
{
|
||||||
// information on how to init and use AXP192 ifor M5StickC taken from
|
// information on how to init and use AXP192 ifor M5StickC taken from
|
||||||
// https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely
|
// https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely
|
||||||
|
|
||||||
|
@ -259,14 +242,16 @@ static void axp192_init()
|
||||||
axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V
|
axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V
|
||||||
axp192_sleep_out();
|
axp192_sleep_out();
|
||||||
ESP_LOGI(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3");
|
ESP_LOGI(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void axp192_sleep_in()
|
static void axp192_sleep_in()
|
||||||
{
|
{
|
||||||
axp192_write_byte(0x12, 0x4b);
|
axp192_write_byte(0x12, 0x4b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void axp192_sleep_out()
|
static void axp192_sleep_out()
|
||||||
{
|
{
|
||||||
axp192_write_byte(0x12, 0x4d);
|
axp192_write_byte(0x12, 0x4d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -29,9 +29,6 @@ extern "C" {
|
||||||
#define ST7735S_RST CONFIG_LV_DISP_PIN_RST
|
#define ST7735S_RST CONFIG_LV_DISP_PIN_RST
|
||||||
#define ST7735S_USE_RST CONFIG_LV_DISP_USE_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
|
#define ST7735S_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
||||||
|
|
||||||
// Defines are taken from
|
// Defines are taken from
|
||||||
|
@ -134,7 +131,6 @@ extern "C" {
|
||||||
|
|
||||||
void st7735s_init(void);
|
void st7735s_init(void);
|
||||||
void st7735s_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
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_in(void);
|
||||||
void st7735s_sleep_out(void);
|
void st7735s_sleep_out(void);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
@ -94,11 +94,6 @@ void st7789_init(void)
|
||||||
gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT);
|
gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ST7789_ENABLE_BACKLIGHT_CONTROL
|
|
||||||
gpio_pad_select_gpio(ST7789_BCKL);
|
|
||||||
gpio_set_direction(ST7789_BCKL, GPIO_MODE_OUTPUT);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Reset the display
|
//Reset the display
|
||||||
#if !defined(ST7789_SOFT_RST)
|
#if !defined(ST7789_SOFT_RST)
|
||||||
gpio_set_level(ST7789_RST, 0);
|
gpio_set_level(ST7789_RST, 0);
|
||||||
|
@ -122,30 +117,12 @@ void st7789_init(void)
|
||||||
cmd++;
|
cmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
st7789_enable_backlight(true);
|
|
||||||
|
|
||||||
st7789_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
st7789_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
void st7789_enable_backlight(bool backlight)
|
/* 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.
|
||||||
#if ST7789_ENABLE_BACKLIGHT_CONTROL
|
* We need to edit the coordinates to take into account those gaps, this is not necessary in all orientations. */
|
||||||
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. */
|
|
||||||
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};
|
||||||
|
@ -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;
|
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*/
|
||||||
|
@ -190,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);
|
||||||
|
|
||||||
|
@ -213,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);
|
||||||
|
|
|
@ -23,7 +23,6 @@ extern "C"
|
||||||
|
|
||||||
#define ST7789_DC CONFIG_LV_DISP_PIN_DC
|
#define ST7789_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define ST7789_RST CONFIG_LV_DISP_PIN_RST
|
#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_USE_RST
|
||||||
#if CONFIG_LV_DISP_ST7789_SOFT_RESET
|
#if CONFIG_LV_DISP_ST7789_SOFT_RESET
|
||||||
|
@ -33,16 +32,8 @@ extern "C"
|
||||||
#define ST7789_SOFT_RST
|
#define ST7789_SOFT_RST
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define ST7789_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
|
|
||||||
#define ST7789_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
#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 */
|
/* ST7789 commands */
|
||||||
#define ST7789_NOP 0x00
|
#define ST7789_NOP 0x00
|
||||||
#define ST7789_SWRESET 0x01
|
#define ST7789_SWRESET 0x01
|
||||||
|
@ -121,7 +112,6 @@ extern "C"
|
||||||
|
|
||||||
void st7789_init(void);
|
void st7789_init(void);
|
||||||
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);
|
||||||
void st7789_enable_backlight(bool backlight);
|
|
||||||
|
|
||||||
void st7789_send_cmd(uint8_t cmd);
|
void st7789_send_cmd(uint8_t cmd);
|
||||||
void st7789_send_data(void *data, uint16_t length);
|
void st7789_send_data(void *data, uint16_t length);
|
||||||
|
|
|
@ -81,16 +81,6 @@ void st7796s_init(void)
|
||||||
{0, {0}, 0xff},
|
{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
|
//Initialize non-SPI GPIOs
|
||||||
gpio_pad_select_gpio(ST7796S_DC);
|
gpio_pad_select_gpio(ST7796S_DC);
|
||||||
gpio_set_direction(ST7796S_DC, GPIO_MODE_OUTPUT);
|
gpio_set_direction(ST7796S_DC, GPIO_MODE_OUTPUT);
|
||||||
|
@ -98,14 +88,7 @@ void st7796s_init(void)
|
||||||
#if ST7796S_USE_RST
|
#if ST7796S_USE_RST
|
||||||
gpio_pad_select_gpio(ST7796S_RST);
|
gpio_pad_select_gpio(ST7796S_RST);
|
||||||
gpio_set_direction(ST7796S_RST, GPIO_MODE_OUTPUT);
|
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
|
//Reset the display
|
||||||
gpio_set_level(ST7796S_RST, 0);
|
gpio_set_level(ST7796S_RST, 0);
|
||||||
vTaskDelay(100 / portTICK_RATE_MS);
|
vTaskDelay(100 / portTICK_RATE_MS);
|
||||||
|
@ -128,8 +111,6 @@ void st7796s_init(void)
|
||||||
cmd++;
|
cmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
st7796s_enable_backlight(true);
|
|
||||||
|
|
||||||
st7796s_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
st7796s_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||||
|
|
||||||
#if ST7796S_INVERT_COLORS == 1
|
#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);
|
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()
|
void st7796s_sleep_in()
|
||||||
{
|
{
|
||||||
uint8_t data[] = {0x08};
|
uint8_t data[] = {0x08};
|
||||||
|
|
|
@ -29,17 +29,9 @@ extern "C"
|
||||||
#define ST7796S_DC CONFIG_LV_DISP_PIN_DC
|
#define ST7796S_DC CONFIG_LV_DISP_PIN_DC
|
||||||
#define ST7796S_RST CONFIG_LV_DISP_PIN_RST
|
#define ST7796S_RST CONFIG_LV_DISP_PIN_RST
|
||||||
#define ST7796S_USE_RST CONFIG_LV_DISP_USE_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_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
||||||
#define ST7796S_DISPLAY_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION
|
#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
|
* ST7796S REGS
|
||||||
|
@ -119,7 +111,6 @@ extern "C"
|
||||||
|
|
||||||
void st7796s_init(void);
|
void st7796s_init(void);
|
||||||
void st7796s_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
|
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
|
* MACROS
|
||||||
|
|
|
@ -23,7 +23,7 @@ menu "LVGL Touch controller"
|
||||||
select LV_TOUCH_DRIVER_PROTOCOL_SPI
|
select LV_TOUCH_DRIVER_PROTOCOL_SPI
|
||||||
bool "XPT2046"
|
bool "XPT2046"
|
||||||
config LV_TOUCH_CONTROLLER_FT6X06
|
config LV_TOUCH_CONTROLLER_FT6X06
|
||||||
select LV_TOUCH_DRIVER_PROTOCOL_I2C
|
select LV_I2C_TOUCH
|
||||||
bool "FT6X06"
|
bool "FT6X06"
|
||||||
|
|
||||||
config LV_TOUCH_CONTROLLER_L58
|
config LV_TOUCH_CONTROLLER_L58
|
||||||
|
@ -44,7 +44,7 @@ menu "LVGL Touch controller"
|
||||||
select LV_TOUCH_DRIVER_DISPLAY
|
select LV_TOUCH_DRIVER_DISPLAY
|
||||||
bool "RA8875"
|
bool "RA8875"
|
||||||
config LV_TOUCH_CONTROLLER_GT911
|
config LV_TOUCH_CONTROLLER_GT911
|
||||||
select LV_TOUCH_DRIVER_PROTOCOL_I2C
|
select LV_I2C_TOUCH
|
||||||
bool "GT911"
|
bool "GT911"
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ menu "LVGL Touch controller"
|
||||||
help
|
help
|
||||||
Touch controller protocol SPI
|
Touch controller protocol SPI
|
||||||
|
|
||||||
config LV_TOUCH_DRIVER_PROTOCOL_I2C
|
config LV_I2C_TOUCH
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
Touch controller protocol I2C
|
Touch controller protocol I2C
|
||||||
|
@ -69,35 +69,18 @@ menu "LVGL Touch controller"
|
||||||
Touch controller uses same interface/device as display
|
Touch controller uses same interface/device as display
|
||||||
(Note: Display must be initialized before touch)
|
(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.
|
|
||||||
|
|
||||||
config LV_TOUCH_I2C_PORT_0
|
|
||||||
bool "I2C PORT 0"
|
|
||||||
config LV_TOUCH_I2C_PORT_1
|
|
||||||
bool "I2C PORT 1"
|
|
||||||
endchoice
|
|
||||||
|
|
||||||
choice
|
choice
|
||||||
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 (L58) Lilygo Pin Assignments"
|
menu "Touchpanel (L58) Lilygo Pin Assignments"
|
||||||
|
@ -137,9 +120,6 @@ menu "LVGL Touch controller"
|
||||||
config LV_TOUCH_SPI_MISO
|
config LV_TOUCH_SPI_MISO
|
||||||
int
|
int
|
||||||
prompt "GPIO for MISO (Master In Slave Out)"
|
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 35 if LV_PREDEFINED_PINS_38V1
|
||||||
default 19
|
default 19
|
||||||
|
@ -149,9 +129,6 @@ menu "LVGL Touch controller"
|
||||||
config LV_TOUCH_SPI_MOSI
|
config LV_TOUCH_SPI_MOSI
|
||||||
int
|
int
|
||||||
prompt "GPIO for MOSI (Master Out Slave In)"
|
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 32 if LV_PREDEFINED_PINS_38V1
|
||||||
default 23
|
default 23
|
||||||
|
@ -160,9 +137,6 @@ menu "LVGL Touch controller"
|
||||||
|
|
||||||
config LV_TOUCH_SPI_CLK
|
config LV_TOUCH_SPI_CLK
|
||||||
int "GPIO for CLK (SCK / Serial Clock)"
|
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 26 if LV_PREDEFINED_PINS_38V1
|
||||||
default 18
|
default 18
|
||||||
|
@ -171,8 +145,6 @@ menu "LVGL Touch controller"
|
||||||
|
|
||||||
config LV_TOUCH_SPI_CS
|
config LV_TOUCH_SPI_CS
|
||||||
int "GPIO for CS (Slave Select)"
|
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 33 if LV_PREDEFINED_PINS_38V1
|
||||||
default 5
|
default 5
|
||||||
|
@ -181,9 +153,6 @@ menu "LVGL Touch controller"
|
||||||
|
|
||||||
config LV_TOUCH_PIN_IRQ
|
config LV_TOUCH_PIN_IRQ
|
||||||
int "GPIO for IRQ (Interrupt Request)"
|
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 27 if LV_PREDEFINED_PINS_38V4
|
||||||
default 25
|
default 25
|
||||||
|
@ -248,38 +217,13 @@ menu "LVGL Touch controller"
|
||||||
endchoice
|
endchoice
|
||||||
endmenu
|
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)"
|
menu "Touchpanel Configuration (FT6X06)"
|
||||||
depends on LV_TOUCH_CONTROLLER_FT6X06
|
depends on LV_TOUCH_CONTROLLER_FT6X06
|
||||||
|
|
||||||
config LV_FT6X36_SWAPXY
|
config LV_FT6X36_SWAPXY
|
||||||
bool
|
bool
|
||||||
prompt "Swap X with Y coordinate."
|
prompt "Swap X with Y coordinate."
|
||||||
default y
|
default n
|
||||||
|
|
||||||
config LV_FT6X36_INVERT_X
|
config LV_FT6X36_INVERT_X
|
||||||
bool
|
bool
|
||||||
|
@ -289,7 +233,14 @@ menu "LVGL Touch controller"
|
||||||
config LV_FT6X36_INVERT_Y
|
config LV_FT6X36_INVERT_Y
|
||||||
bool
|
bool
|
||||||
prompt "Invert Y coordinate value."
|
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
|
endmenu
|
||||||
|
|
||||||
|
@ -299,9 +250,6 @@ menu "LVGL Touch controller"
|
||||||
config LV_TOUCH_SPI_MISO
|
config LV_TOUCH_SPI_MISO
|
||||||
int
|
int
|
||||||
prompt "GPIO for MISO (Master In Slave Out)"
|
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 35 if LV_PREDEFINED_PINS_38V1
|
||||||
default 19 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
default 19 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
||||||
|
@ -314,9 +262,6 @@ menu "LVGL Touch controller"
|
||||||
# TODO Fix default for ESP32C3
|
# TODO Fix default for ESP32C3
|
||||||
int
|
int
|
||||||
prompt "GPIO for MOSI (Master Out Slave In)"
|
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 32 if LV_PREDEFINED_PINS_38V1
|
||||||
default 18 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
default 18 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
||||||
|
@ -327,9 +272,6 @@ menu "LVGL Touch controller"
|
||||||
|
|
||||||
config LV_TOUCH_SPI_CLK
|
config LV_TOUCH_SPI_CLK
|
||||||
int "GPIO for CLK (SCK / Serial Clock)"
|
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 26 if LV_PREDEFINED_PINS_38V1
|
||||||
default 5 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
default 5 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
||||||
|
@ -339,10 +281,6 @@ menu "LVGL Touch controller"
|
||||||
|
|
||||||
config LV_TOUCH_SPI_CS
|
config LV_TOUCH_SPI_CS
|
||||||
int "GPIO for CS (Slave Select)"
|
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 33 if LV_PREDEFINED_PINS_38V1
|
||||||
default 32 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
default 32 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
||||||
default 5
|
default 5
|
||||||
|
@ -540,31 +478,6 @@ menu "LVGL Touch controller"
|
||||||
|
|
||||||
endmenu
|
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)"
|
menu "Touchpanel Configuration (GT911)"
|
||||||
depends on LV_TOUCH_CONTROLLER_GT911
|
depends on LV_TOUCH_CONTROLLER_GT911
|
||||||
|
|
||||||
|
@ -585,4 +498,37 @@ menu "LVGL Touch controller"
|
||||||
|
|
||||||
endmenu
|
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
|
endmenu
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,37 +19,27 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
#include <driver/i2c.h>
|
|
||||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
#include <lvgl.h>
|
#include <lvgl.h>
|
||||||
#else
|
#else
|
||||||
#include <lvgl/lvgl.h>
|
#include <lvgl/lvgl.h>
|
||||||
#endif
|
#endif
|
||||||
#include "ft6x36.h"
|
#include "ft6x36.h"
|
||||||
#include "tp_i2c.h"
|
#include "lvgl_i2c/i2c_manager.h"
|
||||||
#include "../lvgl_i2c_conf.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) {
|
||||||
i2c_cmd_handle_t i2c_cmd = i2c_cmd_link_create();
|
return lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr, data_buf, 1);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,19 +65,7 @@ uint8_t ft6x36_get_gesture_id() {
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
void ft6x06_init(uint16_t dev_addr) {
|
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
|
|
||||||
|
|
||||||
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;
|
ft6x36_status.inited = true;
|
||||||
current_dev_addr = dev_addr;
|
current_dev_addr = dev_addr;
|
||||||
uint8_t data_buf;
|
uint8_t data_buf;
|
||||||
|
@ -109,8 +87,16 @@ 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
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -120,82 +106,55 @@ void ft6x06_init(uint16_t dev_addr) {
|
||||||
* @retval Always false
|
* @retval Always false
|
||||||
*/
|
*/
|
||||||
bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
|
bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
|
||||||
uint8_t data_xy[4]; // 2 bytes X | 2 bytes Y
|
if (!ft6x36_status.inited) {
|
||||||
uint8_t touch_pnt_cnt; // Number of detected touch points
|
ESP_LOGE(TAG, "Init first!");
|
||||||
static int16_t last_x = 0; // 12bit pixel value
|
return 0x00;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
uint8_t data_buf[5]; // 1 byte status, 2 bytes X, 2 bytes Y
|
||||||
|
|
||||||
// Read X value
|
esp_err_t ret = lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, current_dev_addr, FT6X36_TD_STAT_REG, &data_buf[0], 5);
|
||||||
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);
|
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Error getting X coordinates: %s", esp_err_to_name(ret));
|
ESP_LOGE(TAG, "Error talking to touch IC: %s", esp_err_to_name(ret));
|
||||||
data->point.x = last_x;
|
}
|
||||||
data->point.y = last_y;
|
uint8_t touch_pnt_cnt = data_buf[0]; // Number of detected touch points
|
||||||
data->state = LV_INDEV_STATE_REL; // no touch detected
|
|
||||||
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read Y value
|
touch_inputs.current_state = LV_INDEV_STATE_PR;
|
||||||
i2c_cmd = i2c_cmd_link_create();
|
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);
|
||||||
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);
|
|
||||||
|
|
||||||
#if CONFIG_LV_FT6X36_SWAPXY
|
#if CONFIG_LV_FT6X36_SWAPXY
|
||||||
int16_t swap_buf = last_x;
|
int16_t swap_buf = touch_inputs.last_x;
|
||||||
last_x = last_y;
|
touch_inputs.last_x = touch_inputs.last_y;
|
||||||
last_y = swap_buf;
|
touch_inputs.last_y = swap_buf;
|
||||||
#endif
|
#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
|
||||||
data->point.x = last_x;
|
data->point.x = touch_inputs.last_x;
|
||||||
data->point.y = last_y;
|
data->point.y = touch_inputs.last_y;
|
||||||
data->state = LV_INDEV_STATE_PR;
|
data->state = touch_inputs.current_state;
|
||||||
ESP_LOGV(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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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).
|
||||||
|
|
|
@ -19,15 +19,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
#include <driver/i2c.h>
|
|
||||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
#include <lvgl.h>
|
#include <lvgl.h>
|
||||||
#else
|
#else
|
||||||
#include <lvgl/lvgl.h>
|
#include <lvgl/lvgl.h>
|
||||||
#endif
|
#endif
|
||||||
#include "gt911.h"
|
#include "gt911.h"
|
||||||
#include "tp_i2c.h"
|
|
||||||
#include "../lvgl_i2c_conf.h"
|
#include "lvgl_i2c/i2c_manager.h"
|
||||||
|
|
||||||
#define TAG "GT911"
|
#define TAG "GT911"
|
||||||
|
|
||||||
|
@ -35,35 +34,12 @@ gt911_status_t gt911_status;
|
||||||
|
|
||||||
//TODO: handle multibyte read and refactor to just one read transaction
|
//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) {
|
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();
|
return lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr | I2C_REG_16, data_buf, len);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t gt911_i2c_write8(uint8_t slave_addr, uint16_t register_addr, uint8_t data) {
|
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();
|
uint8_t buffer = data;
|
||||||
|
return lvgl_i2c_write(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr | I2C_REG_16, &buffer, 1);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
// Is not being included in CMakeLists.txt (Research why)
|
// Is not being included in CMakeLists.txt (Research why)
|
||||||
#include "l58.h"
|
#include "l58.h"
|
||||||
|
|
||||||
|
|
||||||
void touch_driver_init(void)
|
void touch_driver_init(void)
|
||||||
{
|
{
|
||||||
#if defined (CONFIG_LV_TOUCH_CONTROLLER_XPT2046)
|
#if defined (CONFIG_LV_TOUCH_CONTROLLER_XPT2046)
|
||||||
|
|
|
@ -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 <driver/i2c.h>
|
|
||||||
#include <esp_log.h>
|
|
||||||
|
|
||||||
#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);
|
|
||||||
}
|
|
|
@ -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 <stdint.h>
|
|
||||||
|
|
||||||
esp_err_t i2c_master_init(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __TS_H */
|
|
Loading…
Reference in a new issue