Compare commits
30 commits
dont_merge
...
master
Author | SHA1 | Date | |
---|---|---|---|
Andreas Mieke | 341b522b7b | ||
Andreas Mieke | 8592cb9d29 | ||
26fe6e7703 | |||
c4cd524487 | |||
8d1fbcf5c4 | |||
8cbbc299e9 | |||
762bb35265 | |||
d44b7e808a | |||
02d351f898 | |||
22ba4161b5 | |||
4afc03a9fa | |||
23ee5be93b | |||
31a5733c8d | |||
f3f6ba6470 | |||
37a4d3a4e6 | |||
b674d2d4f1 | |||
37548ad50f | |||
a56b80b362 | |||
bd445ea30a | |||
617e6a46c0 | |||
db3d00e374 | |||
83eba9b04c | |||
4d3f23a3e8 | |||
88628042e6 | |||
dd09b4d01a | |||
6a3e46e509 | |||
82583ce6ce | |||
171cd53915 | |||
ee36378f54 | |||
a0e933c7e6 |
29
.github/workflows/build_examples.yml
vendored
29
.github/workflows/build_examples.yml
vendored
|
@ -1,29 +0,0 @@
|
|||
name: 'build'
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
idf_ver: ["v4.1", "v4.2", "v4.3"]
|
||||
idf_target: ["esp32"]
|
||||
include:
|
||||
- idf_ver: "v4.2"
|
||||
idf_target: esp32s2
|
||||
- idf_ver: "v4.3"
|
||||
idf_target: esp32c3
|
||||
runs-on: ubuntu-20.04
|
||||
container: espressif/idf:release-${{ matrix.idf_ver }}
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Build ESP examples
|
||||
env:
|
||||
IDF_TARGET: ${{ matrix.idf_target }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd examples/wemos_lolin_oled/hello_world
|
||||
. ${IDF_PATH}/export.sh
|
||||
idf.py build
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -56,3 +56,7 @@ dkms.conf
|
|||
|
||||
# ESP-IDF build dir
|
||||
build
|
||||
|
||||
# Kconfig files
|
||||
sdkconfig
|
||||
sdkconfig.old
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +0,0 @@
|
|||
[submodule "examples/common_components/lvgl"]
|
||||
path = examples/common_components/lvgl
|
||||
url = https://github.com/lvgl/lvgl.git
|
|
@ -5,32 +5,50 @@ set(LVGL_INCLUDE_DIRS . lvgl_tft)
|
|||
list(APPEND SOURCES "lvgl_tft/disp_driver.c")
|
||||
list(APPEND SOURCES "lvgl_tft/esp_lcd_backlight.c")
|
||||
|
||||
# This are the source files used for mcu abstraction
|
||||
set(LV_PORT_PATH "lv_port")
|
||||
|
||||
list(APPEND SOURCES "${LV_PORT_PATH}/lv_port_display_espressif.c")
|
||||
|
||||
#@todo add SimleInclude macro here
|
||||
|
||||
# Build all display drivers
|
||||
# Include only the source file of the selected
|
||||
# display controller.
|
||||
if(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341)
|
||||
list(APPEND SOURCES "lvgl_tft/ili9341.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481)
|
||||
list(APPEND SOURCES "lvgl_tft/ili9481.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486)
|
||||
list(APPEND SOURCES "lvgl_tft/ili9486.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488)
|
||||
list(APPEND SOURCES "lvgl_tft/ili9488.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789)
|
||||
list(APPEND SOURCES "lvgl_tft/st7789.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S)
|
||||
list(APPEND SOURCES "lvgl_tft/st7735s.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7796S)
|
||||
list(APPEND SOURCES "lvgl_tft/st7796s.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357)
|
||||
list(APPEND SOURCES "lvgl_tft/hx8357.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107)
|
||||
list(APPEND SOURCES "lvgl_tft/sh1107.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306)
|
||||
list(APPEND SOURCES "lvgl_tft/ssd1306.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
|
||||
list(APPEND SOURCES "lvgl_tft/EVE_commands.c")
|
||||
list(APPEND SOURCES "lvgl_tft/FT81x.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820)
|
||||
list(APPEND SOURCES "lvgl_tft/il3820.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A)
|
||||
list(APPEND SOURCES "lvgl_tft/jd79653a.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D)
|
||||
list(APPEND SOURCES "lvgl_tft/uc8151d.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875)
|
||||
list(APPEND SOURCES "lvgl_tft/ra8875.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01)
|
||||
list(APPEND SOURCES "lvgl_tft/GC9A01.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C)
|
||||
list(APPEND SOURCES "lvgl_tft/ili9163c.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544)
|
||||
list(APPEND SOURCES "lvgl_tft/pcd8544.c")
|
||||
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT)
|
||||
list(APPEND SOURCES "lvgl_tft/schmitt.c")
|
||||
else()
|
||||
message(WARNING "LVGL ESP32 drivers: Display controller not defined.")
|
||||
endif()
|
||||
|
||||
if(CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI)
|
||||
list(APPEND SOURCES "lvgl_tft/disp_spi.c")
|
||||
|
@ -70,7 +88,7 @@ endif()
|
|||
|
||||
idf_component_register(SRCS ${SOURCES}
|
||||
INCLUDE_DIRS ${LVGL_INCLUDE_DIRS}
|
||||
REQUIRES lvgl)
|
||||
REQUIRES lvgl driver esp_common log freertos esp_rom soc)
|
||||
|
||||
target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_LVGL_H_INCLUDE_SIMPLE")
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ swap of RGB565 color on the LVGL configuration menuconfig (it's not handled auto
|
|||
| RA8875 | TFT | SPI | 16: RGB565 | Yes |
|
||||
| SH1107 | Monochrome | SPI | 1: 1byte per pixel | No |
|
||||
| SSD1306 | Monochrome | I2C | 1: 1byte per pixel | No |
|
||||
| PCD8544 | Monochrome | SPI | 1: 1byte per pixel | No |
|
||||
| IL3820 | e-Paper | SPI | 1: 1byte per pixel | No |
|
||||
| UC8151D/ GoodDisplay GDEW0154M10 DES | e-Paper | SPI | 1: 1byte per pixel | No |
|
||||
| FitiPower JD79653A/ GoodDisplay GDEW0154M09 | e-Paper | SPI | 1: 1byte per pixel | No |
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
#ifndef DISPLAY_CONFIG_H_
|
||||
#define DISPLAY_CONFIG_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "sdkconfig.h"
|
||||
|
||||
/* Configuration options for ST7789 display controllers */
|
||||
#if CONFIG_LV_DISP_USE_RST
|
||||
#if CONFIG_LV_DISP_ST7789_SOFT_RESET
|
||||
#define ST7789_SOFT_RST
|
||||
#endif
|
||||
#else
|
||||
#define ST7789_SOFT_RST
|
||||
#endif
|
||||
|
||||
#if defined (CONFIG_LV_INVERT_COLORS)
|
||||
#define ST7789_INVERT_COLORS 1U
|
||||
#define ILI9341_INVERT_COLORS 1U
|
||||
#endif
|
||||
|
||||
#define ST7789_INITIAL_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION
|
||||
|
||||
#if CONFIG_LV_DISP_USE_RST
|
||||
#define ILI9341_USE_RST
|
||||
#endif
|
||||
|
||||
#define ILI9341_INITIAL_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION
|
||||
|
||||
/* ILI9488 Configuration */
|
||||
#if CONFIG_LV_DISP_USE_RST
|
||||
#define ILI9488_USE_RST
|
||||
#endif
|
||||
|
||||
#define ILI9488_INITIAL_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* DISPLAY_CONFIG_H_ */
|
|
@ -1 +0,0 @@
|
|||
Subproject commit ec9de515b36641be565d7bace5863ab631ce3b69
|
|
@ -1,9 +0,0 @@
|
|||
# For more information about build system see
|
||||
# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html
|
||||
# The following five lines of boilerplate have to be in your project's
|
||||
# CMakeLists in this exact order for cmake to work correctly
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
set(EXTRA_COMPONENT_DIRS ../../common_components ../../..)
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
project(hello_world)
|
|
@ -1,2 +0,0 @@
|
|||
idf_component_register(SRCS "hello_world.c"
|
||||
INCLUDE_DIRS ".")
|
|
@ -1,98 +0,0 @@
|
|||
/* Hello world on Wemos Lolin32 board
|
||||
*
|
||||
* This example code is in the Public Domain (or CC0 licensed, at your option.)
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, this
|
||||
* software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||
* CONDITIONS OF ANY KIND, either express or implied.
|
||||
*/
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "esp_freertos_hooks.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "esp_system.h"
|
||||
#include "driver/gpio.h"
|
||||
|
||||
/* Littlevgl specific */
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#include "lvgl_helpers.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define LV_TICK_PERIOD_MS 1
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void lvgl_tick_inc(void *arg);
|
||||
static void guiTask(void *pvParameter);
|
||||
|
||||
/**********************
|
||||
* APPLICATION MAIN
|
||||
**********************/
|
||||
void app_main()
|
||||
{
|
||||
xTaskCreatePinnedToCore(guiTask, "gui", 4096*2, NULL, 0, NULL, 1);
|
||||
}
|
||||
|
||||
static void guiTask(void *pvParameter)
|
||||
{
|
||||
(void) pvParameter;
|
||||
lv_init();
|
||||
lvgl_driver_init();
|
||||
|
||||
lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
|
||||
assert(buf1 != NULL);
|
||||
|
||||
static lv_disp_buf_t disp_buf;
|
||||
lv_disp_buf_init(&disp_buf, buf1, NULL, DISP_BUF_SIZE * 8);
|
||||
|
||||
lv_disp_drv_t disp_drv;
|
||||
lv_disp_drv_init(&disp_drv);
|
||||
disp_drv.flush_cb = disp_driver_flush;
|
||||
disp_drv.rounder_cb = disp_driver_rounder;
|
||||
disp_drv.set_px_cb = disp_driver_set_px;
|
||||
disp_drv.buffer = &disp_buf;
|
||||
lv_disp_drv_register(&disp_drv);
|
||||
|
||||
/* Create and start a periodic timer interrupt to call lv_tick_inc */
|
||||
const esp_timer_create_args_t periodic_timer_args = {
|
||||
.callback = &lvgl_tick_inc,
|
||||
.name = "lvgl_tick"
|
||||
};
|
||||
esp_timer_handle_t periodic_timer;
|
||||
ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
|
||||
ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
|
||||
|
||||
/* Create a Hellow World label on the currently active screen */
|
||||
lv_obj_t *scr = lv_disp_get_scr_act(NULL);
|
||||
lv_obj_t *label1 = lv_label_create(scr, NULL);
|
||||
lv_label_set_text(label1, "Hello\nworld");
|
||||
|
||||
/* Align the Label to the center
|
||||
* NULL means align on parent (which is the screen now)
|
||||
* 0, 0 at the end means an x, y offset after alignment*/
|
||||
lv_obj_align(label1, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
|
||||
while (1) {
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
lv_task_handler();
|
||||
}
|
||||
free(buf1);
|
||||
}
|
||||
|
||||
static void lvgl_tick_inc(void *arg) {
|
||||
(void) arg;
|
||||
lv_tick_inc(LV_TICK_PERIOD_MS);
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
CONFIG_LV_HOR_RES_MAX=128
|
||||
CONFIG_LV_VER_RES_MAX=64
|
||||
CONFIG_LV_COLOR_DEPTH_1=y
|
||||
CONFIG_LV_THEME_MONO=y
|
||||
|
||||
CONFIG_LV_PREDEFINED_DISPLAY_WEMOS_LOLIN=y
|
||||
|
||||
CONFIG_I2C_MANAGER_0_ENABLED=y
|
||||
CONFIG_I2C_MANAGER_0_SDA=5
|
||||
CONFIG_I2C_MANAGER_0_SCL=4
|
||||
CONFIG_I2C_MANAGER_0_FREQ_HZ=100000
|
|
@ -1,110 +0,0 @@
|
|||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
#include "display_port.h"
|
||||
|
||||
#include "sdkconfig.h"
|
||||
#include "driver/gpio.h"
|
||||
|
||||
#include "disp_spi.h"
|
||||
#include "lvgl_i2c/i2c_manager.h"
|
||||
|
||||
/* TODO: This is ssd1306 specific */
|
||||
#define OLED_I2C_PORT (CONFIG_LV_I2C_DISPLAY_PORT)
|
||||
#define OLED_I2C_ADDRESS 0x3C
|
||||
|
||||
#define LV_DISPLAY_DC_CMD_MODE 0
|
||||
#define LV_DISPLAY_DC_DATA_MODE 1
|
||||
|
||||
void display_port_delay(lv_disp_drv_t *drv, uint32_t delay_ms)
|
||||
{
|
||||
(void) drv;
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(delay_ms));
|
||||
}
|
||||
|
||||
void display_port_backlight(lv_disp_drv_t *drv, uint8_t state)
|
||||
{
|
||||
(void) drv;
|
||||
|
||||
#ifdef CONFIG_LV_DISP_PIN_BCKL
|
||||
gpio_set_level(CONFIG_LV_DISP_PIN_BCKL, state);
|
||||
#endif
|
||||
}
|
||||
|
||||
void display_port_gpio_dc(lv_disp_drv_t *drv, uint8_t state)
|
||||
{
|
||||
(void) drv;
|
||||
|
||||
#ifdef CONFIG_LV_DISPLAY_USE_DC
|
||||
gpio_set_level(CONFIG_LV_DISP_PIN_DC, state);
|
||||
#endif
|
||||
}
|
||||
|
||||
void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state)
|
||||
{
|
||||
(void) drv;
|
||||
|
||||
#ifdef CONFIG_LV_DISP_USE_RST
|
||||
gpio_set_level(CONFIG_LV_DISP_PIN_RST, state);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool display_port_gpio_is_busy(lv_disp_drv_t *drv)
|
||||
{
|
||||
(void) drv;
|
||||
|
||||
bool device_busy = false;
|
||||
|
||||
#ifdef CONFIG_LV_DISP_PIN_BUSY
|
||||
/* FIXME Assuming the busy signal in logic 1 means the device is busy */
|
||||
if (gpio_get_level(CONFIG_LV_DISP_PIN_BUSY) == 1) {
|
||||
device_busy = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
return device_busy;
|
||||
}
|
||||
|
||||
void display_interface_send_cmd(lv_disp_drv_t *drv, uint32_t cmd, cmd_width_t cmd_width, void *args, size_t args_len)
|
||||
{
|
||||
(void) drv;
|
||||
|
||||
#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI)
|
||||
disp_wait_for_pending_transactions();
|
||||
display_port_gpio_dc(drv, LV_DISPLAY_DC_CMD_MODE);
|
||||
|
||||
if (CMD_WIDTH_8BITS == cmd_width) {
|
||||
disp_spi_send_data(&cmd, 1);
|
||||
}
|
||||
else if (CMD_WIDTH_16BITS == cmd_width) {
|
||||
/* Send 16bits cmd */
|
||||
}
|
||||
else {
|
||||
/* Unsupported cmd size */
|
||||
}
|
||||
|
||||
if (args != NULL) {
|
||||
display_port_gpio_dc(drv, LV_DISPLAY_DC_DATA_MODE);
|
||||
disp_spi_send_data(args, args_len);
|
||||
}
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C)
|
||||
uint8_t *data = (uint8_t *) args;
|
||||
|
||||
lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, cmd, data, args_len);
|
||||
#endif
|
||||
}
|
||||
|
||||
void display_interface_send_data(lv_disp_drv_t *drv, void *data, size_t len)
|
||||
{
|
||||
(void) drv;
|
||||
|
||||
#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI)
|
||||
disp_wait_for_pending_transactions();
|
||||
display_port_gpio_dc(drv, LV_DISPLAY_DC_DATA_MODE);
|
||||
disp_spi_send_colors(data, len);
|
||||
/* lv_disp_flush is called in the SPI xfer done callback */
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C)
|
||||
lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, OLED_CONTROL_BYTE_DATA_STREAM, data, len);
|
||||
#endif
|
||||
}
|
|
@ -69,6 +69,7 @@ void lvgl_driver_init(void)
|
|||
DISP_SPI_IO2, DISP_SPI_IO3);
|
||||
|
||||
disp_spi_add_device(TFT_SPI_HOST);
|
||||
disp_driver_init();
|
||||
|
||||
#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X)
|
||||
touch_driver_init();
|
||||
|
@ -88,6 +89,7 @@ void lvgl_driver_init(void)
|
|||
disp_spi_add_device(TFT_SPI_HOST);
|
||||
tp_spi_add_device(TOUCH_SPI_HOST);
|
||||
|
||||
disp_driver_init();
|
||||
touch_driver_init();
|
||||
|
||||
return;
|
||||
|
@ -103,7 +105,10 @@ void lvgl_driver_init(void)
|
|||
DISP_SPI_IO2, DISP_SPI_IO3);
|
||||
|
||||
disp_spi_add_device(TFT_SPI_HOST);
|
||||
|
||||
disp_driver_init();
|
||||
#elif defined (CONFIG_LV_I2C_DISPLAY)
|
||||
disp_driver_init();
|
||||
#else
|
||||
#error "No protocol defined for display controller"
|
||||
#endif
|
||||
|
@ -134,39 +139,6 @@ void lvgl_driver_init(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
void display_bsp_init_io(void)
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
gpio_config_t io_conf;
|
||||
|
||||
#ifdef CONFIG_LV_DISPLAY_USE_DC
|
||||
io_conf.mode = GPIO_MODE_OUTPUT;
|
||||
io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_DC);
|
||||
err = gpio_config(&io_conf);
|
||||
ESP_ERROR_CHECK(err);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LV_DISP_USE_RST
|
||||
io_conf.mode = GPIO_MODE_OUTPUT;
|
||||
io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_RST);
|
||||
err = gpio_config(&io_conf);
|
||||
ESP_ERROR_CHECK(err);
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_LV_DISP_BACKLIGHT_OFF) && defined(CONFIG_LV_DISP_PIN_BCKL)
|
||||
io_conf.mode = GPIO_MODE_OUTPUT;
|
||||
io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_BCKL);
|
||||
err = gpio_config(&io_conf);
|
||||
ESP_ERROR_CHECK(err);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LV_DISP_PIN_BUSY
|
||||
io_conf.mode = GPIO_MODE_INPUT;
|
||||
io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_BUSY);
|
||||
err = gpio_config(&io_conf);
|
||||
ESP_ERROR_CHECK(err);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Initialize spi bus master
|
||||
*
|
||||
|
@ -182,34 +154,12 @@ bool lvgl_spi_driver_init(int host,
|
|||
int dma_channel,
|
||||
int quadwp_pin, int quadhd_pin)
|
||||
{
|
||||
int dma_chan = 0 /* SPI_DMA_DISABLED */;
|
||||
|
||||
#if defined (CONFIG_IDF_TARGET_ESP32)
|
||||
assert((SPI_HOST <= host) && (VSPI_HOST >= host));
|
||||
const char *spi_names[] = {
|
||||
"SPI_HOST", "HSPI_HOST", "VSPI_HOST"
|
||||
};
|
||||
|
||||
dma_chan = dma_channel;
|
||||
#elif defined (CONFIG_IDF_TARGET_ESP32S2)
|
||||
assert((SPI_HOST <= host) && (HSPI_HOST >= host));
|
||||
const char *spi_names[] = {
|
||||
"SPI_HOST", "", ""
|
||||
};
|
||||
|
||||
dma_chan = dma_channel;
|
||||
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
|
||||
assert((SPI1_HOST <= host) && (SPI3_HOST >= host));
|
||||
assert((0 <= host) && (3 > host));
|
||||
const char *spi_names[] = {
|
||||
"SPI1_HOST", "SPI2_HOST", "SPI3_HOST"
|
||||
};
|
||||
|
||||
dma_chan = 3 /* SPI_DMA_CH_AUTO */;
|
||||
#else
|
||||
#error "Target chip not selected"
|
||||
#endif
|
||||
|
||||
ESP_LOGI(TAG, "Configuring SPI host %s (%d)", spi_names[host], host);
|
||||
ESP_LOGI(TAG, "Configuring SPI host %s", spi_names[host]);
|
||||
ESP_LOGI(TAG, "MISO pin: %d, MOSI pin: %d, SCLK pin: %d, IO2/WP pin: %d, IO3/HD pin: %d",
|
||||
miso_pin, mosi_pin, sclk_pin, quadwp_pin, quadhd_pin);
|
||||
|
||||
|
@ -217,17 +167,19 @@ bool lvgl_spi_driver_init(int host,
|
|||
|
||||
spi_bus_config_t buscfg = {
|
||||
.miso_io_num = miso_pin,
|
||||
.mosi_io_num = mosi_pin,
|
||||
.sclk_io_num = sclk_pin,
|
||||
.quadwp_io_num = quadwp_pin,
|
||||
.quadhd_io_num = quadhd_pin,
|
||||
.mosi_io_num = mosi_pin,
|
||||
.sclk_io_num = sclk_pin,
|
||||
.quadwp_io_num = quadwp_pin,
|
||||
.quadhd_io_num = quadhd_pin,
|
||||
.max_transfer_sz = max_transfer_sz
|
||||
};
|
||||
|
||||
ESP_LOGI(TAG, "Initializing SPI bus...");
|
||||
esp_err_t ret = spi_bus_initialize(host, &buscfg, dma_chan);
|
||||
#if defined (CONFIG_IDF_TARGET_ESP32C3)
|
||||
dma_channel = SPI_DMA_CH_AUTO;
|
||||
#endif
|
||||
esp_err_t ret = spi_bus_initialize(host, &buscfg, (spi_dma_chan_t)dma_channel);
|
||||
assert(ret == ESP_OK);
|
||||
|
||||
return ESP_OK != ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -76,6 +76,10 @@ extern "C" {
|
|||
#define DISP_BUF_SIZE ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8) // 2888 bytes
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
|
||||
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544)
|
||||
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * (LV_VER_RES_MAX / 8))
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT)
|
||||
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * LV_VER_RES_MAX)
|
||||
#else
|
||||
#error "No display controller selected"
|
||||
#endif
|
||||
|
@ -98,8 +102,6 @@ void lvgl_driver_init(void);
|
|||
bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin,
|
||||
int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin);
|
||||
|
||||
/* Initialize display GPIOs, e.g. DC and RST pins */
|
||||
void display_bsp_init_io(void);
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
|
|
@ -64,16 +64,10 @@ extern "C" {
|
|||
|
||||
#define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH
|
||||
|
||||
#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HSPI)
|
||||
#if defined (CONFIG_IDF_TARGET_ESP32C3)
|
||||
#define TFT_SPI_HOST SPI2_HOST
|
||||
#else
|
||||
#define TFT_SPI_HOST HSPI_HOST
|
||||
#endif
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_VSPI)
|
||||
#define TFT_SPI_HOST VSPI_HOST
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_FSPI)
|
||||
#define TFT_SPI_HOST FSPI_HOST
|
||||
#if defined (CONFIG_LV_TFT_DISPLAY_SPI2_HOST)
|
||||
#define TFT_SPI_HOST SPI2_HOST
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_SPI3_HOST)
|
||||
#define TFT_SPI_HOST SPI3_HOST
|
||||
#endif
|
||||
|
||||
#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HALF_DUPLEX)
|
||||
|
@ -90,12 +84,10 @@ extern "C" {
|
|||
#define DISP_SPI_TRANS_MODE_SIO
|
||||
#endif
|
||||
|
||||
#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_HSPI)
|
||||
#define TOUCH_SPI_HOST HSPI_HOST
|
||||
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_VSPI)
|
||||
#define TOUCH_SPI_HOST VSPI_HOST
|
||||
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_FSPI)
|
||||
#define TOUCH_SPI_HOST FSPI_HOST
|
||||
#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI2_HOST)
|
||||
#define TOUCH_SPI_HOST SPI2_HOST
|
||||
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI3_HOST)
|
||||
#define TOUCH_SPI_HOST SPI3_HOST
|
||||
#endif
|
||||
|
||||
/* Handle the FT81X Special case */
|
||||
|
@ -111,7 +103,7 @@ extern "C" {
|
|||
// Detect the use of a shared SPI Bus and verify the user specified the same SPI bus for both touch and tft
|
||||
#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) && TP_SPI_MOSI == DISP_SPI_MOSI && TP_SPI_CLK == DISP_SPI_CLK
|
||||
#if TFT_SPI_HOST != TOUCH_SPI_HOST
|
||||
#error You must specify the same SPI host (HSPI, VSPI or FSPI) for both display and touch driver
|
||||
#error You must specify the same SPI host (SPIx_HOST) for both display and touch driver
|
||||
#endif
|
||||
|
||||
#define SHARED_SPI_BUS
|
||||
|
@ -122,7 +114,11 @@ extern "C" {
|
|||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \
|
||||
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT)
|
||||
|
||||
#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 4)
|
||||
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \
|
||||
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488)
|
||||
|
||||
#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 3)
|
||||
|
@ -166,8 +162,10 @@ extern "C" {
|
|||
#define SPI_TFT_CLOCK_SPEED_HZ (40 * 1000 * 1000)
|
||||
#elif defined(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
|
||||
#define SPI_TFT_CLOCK_SPEED_HZ (32*1000*1000)
|
||||
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544)
|
||||
#define SPI_TFT_CLOCK_SPEED_HZ (4*1000*1000)
|
||||
#else
|
||||
#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000)
|
||||
#define SPI_TFT_CLOCK_SPEED_HZ (5*1000*1000) // Set to 40 later
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -41,11 +41,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined (BT81X_ENABLE)
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
|
||||
#include "EVE.h"
|
||||
#include "EVE_commands.h"
|
||||
|
@ -55,8 +50,19 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "soc/soc_memory_layout.h"
|
||||
|
||||
#include "esp_log.h"
|
||||
|
||||
#include "disp_spi.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#if defined (BT81X_ENABLE)
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
|
||||
#define TAG_LOG "FT81X"
|
||||
|
||||
/* data structure for SPI reading that has (optional) space for inserted dummy byte */
|
||||
typedef struct _spi_read_data {
|
||||
#if defined(DISP_SPI_FULL_DUPLEX)
|
||||
|
@ -869,13 +875,13 @@ uint8_t EVE_init(void)
|
|||
|
||||
/* The most reliable DIO/QIO switching point is after EVE start up but before reading the ChipID. */
|
||||
#if defined(DISP_SPI_TRANS_MODE_DIO)
|
||||
LV_LOG_INFO("Switching to DIO mode");
|
||||
ESP_LOGI(TAG_LOG, "Switching to DIO mode");
|
||||
DELAY_MS(20); /* different boards may take a different delay but this generally seems to work */
|
||||
EVE_memWrite16(REG_SPI_WIDTH, SPI_WIDTH_DIO);
|
||||
SPIInherentSendFlags = DISP_SPI_MODE_DIO | DISP_SPI_MODE_DIOQIO_ADDR;
|
||||
SPIDummyReadBits = 4; /* Esp32 DMA SPI transaction dummy_bits works more like clock cycles, so in DIO 4 dummy_bits == 8 total bits */
|
||||
#elif defined(DISP_SPI_TRANS_MODE_QIO)
|
||||
LV_LOG_INFO("Switching to QIO mode");
|
||||
ESP_LOGI(TAG_LOG, "Switching to QIO mode");
|
||||
DELAY_MS(20); /* different boards may take a different delay but this generally seems to work */
|
||||
EVE_memWrite16(REG_SPI_WIDTH, SPI_WIDTH_QIO);
|
||||
SPIInherentSendFlags = DISP_SPI_MODE_QIO | DISP_SPI_MODE_DIOQIO_ADDR;
|
||||
|
@ -891,7 +897,7 @@ uint8_t EVE_init(void)
|
|||
timeout++;
|
||||
if(timeout > 400)
|
||||
{
|
||||
LV_LOG_WARN("Failed to read ChipID...aborting initialization.");
|
||||
ESP_LOGI(TAG_LOG, "Failed to read ChipID...aborting initialization.");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -903,7 +909,7 @@ uint8_t EVE_init(void)
|
|||
timeout++;
|
||||
if(timeout > 50) /* experimental, 10 was the lowest value to get the BT815 started with, the touch-controller was the last to get out of reset */
|
||||
{
|
||||
LV_LOG_WARN("Failed to read CPU status...aborting initialization.");
|
||||
ESP_LOGI(TAG_LOG, "Failed to read CPU status...aborting initialization.");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -208,8 +208,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
#define EVE_SUNFLOWER
|
||||
#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_CONNECTEVE)
|
||||
#define EVE_CONNECTEVE
|
||||
#else
|
||||
#define EVE_EVE2_35 // Define something if there is no Kconfig option selected
|
||||
#endif
|
||||
|
||||
/* display timing parameters below */
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "GC9A01"
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
@ -125,7 +126,7 @@ void GC9A01_init(void)
|
|||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("Initialization.");
|
||||
ESP_LOGI(TAG, "Initialization.");
|
||||
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
|
@ -219,23 +220,23 @@ static void GC9A01_send_color(void * data, uint16_t length)
|
|||
|
||||
static void GC9A01_set_orientation(uint8_t orientation)
|
||||
{
|
||||
assert(orientation < 4);
|
||||
// ESP_ASSERT(orientation < 4);
|
||||
|
||||
const char *orientation_str[] = {
|
||||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"
|
||||
};
|
||||
|
||||
LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]);
|
||||
ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
#if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK
|
||||
const uint8_t data[] = {0x68, 0x68, 0x08, 0x08};
|
||||
uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; ///
|
||||
#elif defined (CONFIG_LV_PREDEFINED_DISPLAY_WROVER4)
|
||||
const uint8_t data[] = {0x4C, 0x88, 0x28, 0xE8};
|
||||
#else
|
||||
const uint8_t data[] = {0x08, 0xC8, 0x68, 0xA8};
|
||||
uint8_t data[] = {0x4C, 0x88, 0x28, 0xE8}; ///
|
||||
#elif defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE)
|
||||
uint8_t data[] = {0x08, 0xC8, 0x68, 0xA8}; ///ggggg
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]);
|
||||
ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]);
|
||||
|
||||
GC9A01_send_cmd(0x36);
|
||||
GC9A01_send_data((void *) &data[orientation], 1);
|
||||
|
|
|
@ -22,7 +22,7 @@ menu "LVGL TFT Display controller"
|
|||
select LV_TFT_DISPLAY_CONTROLLER_ILI9341
|
||||
select LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||
config LV_PREDEFINED_DISPLAY_M5CORE2
|
||||
bool "M5Core2"
|
||||
bool "M5Core2"
|
||||
select LV_TFT_DISPLAY_CONTROLLER_ILI9341
|
||||
select LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||
config LV_PREDEFINED_DISPLAY_M5STICK
|
||||
|
@ -174,6 +174,14 @@ menu "LVGL TFT Display controller"
|
|||
help
|
||||
ILI9163C display controller.
|
||||
|
||||
config LV_TFT_DISPLAY_CONTROLLER_PCD8544
|
||||
bool
|
||||
help
|
||||
PCD8544 display controller (Nokia 3110/5110)
|
||||
config LV_TFT_DISPLAY_CONTROLLER_SCHMITT
|
||||
bool
|
||||
help
|
||||
Schmitt's display controller
|
||||
# Display controller communication protocol
|
||||
#
|
||||
# This symbols define the communication protocol used by the
|
||||
|
@ -340,6 +348,15 @@ menu "LVGL TFT Display controller"
|
|||
bool "ILI9163C"
|
||||
select LV_TFT_DISPLAY_CONTROLLER_ILI9163C
|
||||
select LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||
config LV_TFT_DISPLAY_USER_CONTROLLER_PCD8544
|
||||
bool "PCD8544"
|
||||
select LV_TFT_DISPLAY_CONTROLLER_PCD8544
|
||||
select LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||
select LV_TFT_DISPLAY_MONOCHROME
|
||||
config LV_TFT_DISPLAY_USER_CONTROLLER_SCHMITT
|
||||
bool "SCHMITT"
|
||||
select LV_TFT_DISPLAY_CONTROLLER_SCHMITT
|
||||
select LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||
endchoice
|
||||
|
||||
config CUSTOM_DISPLAY_BUFFER_SIZE
|
||||
|
@ -460,18 +477,14 @@ menu "LVGL TFT Display controller"
|
|||
|
||||
choice
|
||||
prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI
|
||||
default LV_TFT_DISPLAY_SPI_VSPI if LV_PREDEFINED_DISPLAY_TTGO && \
|
||||
!IDF_TARGET_ESP32S2
|
||||
default LV_TFT_DISPLAY_SPI_FSPI if IDF_TARGET_ESP32S2
|
||||
default LV_TFT_DISPLAY_SPI2_HOST
|
||||
help
|
||||
Select the SPI Bus the TFT Display is attached to.
|
||||
|
||||
config LV_TFT_DISPLAY_SPI_HSPI
|
||||
bool "HSPI"
|
||||
config LV_TFT_DISPLAY_SPI_VSPI
|
||||
bool "VSPI" if !IDF_TARGET_ESP32S2
|
||||
config LV_TFT_DISPLAY_SPI_FSPI
|
||||
bool "FSPI" if IDF_TARGET_ESP32S2
|
||||
config LV_TFT_DISPLAY_SPI2_HOST
|
||||
bool "SPI2_HOST"
|
||||
config LV_TFT_DISPLAY_SPI3_HOST
|
||||
bool "SPI3_HOST"
|
||||
endchoice
|
||||
|
||||
choice
|
||||
|
@ -1003,6 +1016,3 @@ menu "LVGL TFT Display controller"
|
|||
default 0
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -7,16 +7,16 @@
|
|||
#include "esp_lcd_backlight.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
void *disp_driver_init(lv_disp_drv_t *drv)
|
||||
void *disp_driver_init(void)
|
||||
{
|
||||
#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341
|
||||
ili9341_init(drv);
|
||||
ili9341_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481
|
||||
ili9481_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488
|
||||
ili9488_init(drv);
|
||||
ili9488_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789
|
||||
st7789_init(drv);
|
||||
st7789_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7796S
|
||||
st7796s_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S
|
||||
|
@ -28,7 +28,7 @@ void *disp_driver_init(lv_disp_drv_t *drv)
|
|||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107
|
||||
sh1107_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
|
||||
ssd1306_init(drv);
|
||||
ssd1306_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X
|
||||
FT81x_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820
|
||||
|
@ -43,13 +43,12 @@ void *disp_driver_init(lv_disp_drv_t *drv)
|
|||
uc8151d_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
|
||||
ili9163c_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
|
||||
pcd8544_init();
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT
|
||||
schmitt_init();
|
||||
#endif
|
||||
|
||||
return disp_backlight_init();
|
||||
}
|
||||
|
||||
void *disp_backlight_init(void)
|
||||
{
|
||||
// We still use menuconfig for these settings
|
||||
// It will be set up during runtime in the future
|
||||
#if (defined(CONFIG_LV_DISP_BACKLIGHT_SWITCH) || defined(CONFIG_LV_DISP_BACKLIGHT_PWM))
|
||||
|
@ -112,6 +111,10 @@ void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t *
|
|||
uc8151d_lv_fb_flush(drv, area, color_map);
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
|
||||
ili9163c_flush(drv, area, color_map);
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
|
||||
pcd8544_flush(drv, area, color_map);
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT
|
||||
schmitt_flush(drv, area, color_map);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -127,6 +130,8 @@ void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area)
|
|||
jd79653a_lv_rounder_cb(disp_drv, area);
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
|
||||
uc8151d_lv_rounder_cb(disp_drv, area);
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
|
||||
pcd8544_rounder(disp_drv, area);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -143,5 +148,7 @@ void disp_driver_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_
|
|||
jd79653a_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa);
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
|
||||
uc8151d_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa);
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
|
||||
pcd8544_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -52,6 +52,10 @@ extern "C" {
|
|||
#include "uc8151d.h"
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C
|
||||
#include "ili9163c.h"
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544
|
||||
#include "pcd8544.h"
|
||||
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SCHMITT
|
||||
#include "schmitt.h"
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
|
@ -67,7 +71,7 @@ extern "C" {
|
|||
**********************/
|
||||
|
||||
/* Initialize display */
|
||||
void *disp_driver_init(lv_disp_drv_t *drv);
|
||||
void *disp_driver_init(void);
|
||||
|
||||
/* Display flush callback */
|
||||
void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
||||
|
@ -79,8 +83,6 @@ void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area);
|
|||
void disp_driver_set_px(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);
|
||||
|
||||
/* Display backlight configuration */
|
||||
void *disp_backlight_init(void);
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
|
|
@ -1,93 +0,0 @@
|
|||
#ifndef DISPLAY_PORT_H_
|
||||
#define DISPLAY_PORT_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
enum {
|
||||
CMD_WIDTH_8BITS,
|
||||
CMD_WIDTH_16BITS,
|
||||
CMD_WIDTH_INVALID,
|
||||
};
|
||||
|
||||
typedef uint8_t cmd_width_t;
|
||||
|
||||
/**
|
||||
* Busy wait delay port
|
||||
*
|
||||
* @param drv Pointer to driver See @ref lv_disp_drv_t
|
||||
* @param delay_ms Delay duration in milliseconds
|
||||
*/
|
||||
void display_port_delay(lv_disp_drv_t *drv, uint32_t delay_ms);
|
||||
|
||||
/**
|
||||
* Backlight control port
|
||||
*
|
||||
* @param drv Pointer to driver See @ref lv_disp_drv_t
|
||||
* @param state State of the backlight signal
|
||||
*/
|
||||
void display_port_backlight(lv_disp_drv_t *drv, uint8_t state);
|
||||
|
||||
/**
|
||||
* DC signal control port
|
||||
*
|
||||
* @param drv Pointer to driver See @ref lv_disp_drv_t
|
||||
* @param state State of the DC signal, 1 for logic high, 0 for logic low
|
||||
*/
|
||||
void display_port_gpio_dc(lv_disp_drv_t *drv, uint8_t state);
|
||||
|
||||
/**
|
||||
* Hardware reset control port
|
||||
*
|
||||
* @param drv Pointer to driver See @ref lv_disp_drv_t
|
||||
* @param state State of the reset signal, 1 for logic high, 0 for logic low
|
||||
*/
|
||||
void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state);
|
||||
|
||||
/**
|
||||
* Display is busy port
|
||||
*
|
||||
* @param drv Pointer to driver See @ref lv_disp_drv_t
|
||||
*
|
||||
* @retval Returns false when display is not busy, true otherwise.
|
||||
*/
|
||||
bool display_port_gpio_is_busy(lv_disp_drv_t *drv);
|
||||
|
||||
/**
|
||||
* Send cmd to display
|
||||
*
|
||||
* @param drv Pointer to driver
|
||||
* @param cmd Command to send
|
||||
* @param cmd_width Width of the command (in bits) to be sent, see @ref cmd_width_t
|
||||
* @param args Pointer to arguments, use NULL to send command without arguments
|
||||
* @param args_len Arguments length (in bytes) to be sent
|
||||
*/
|
||||
void display_interface_send_cmd(lv_disp_drv_t *drv, uint32_t cmd, cmd_width_t cmd_width, void *args, size_t args_len);
|
||||
|
||||
/**
|
||||
* Send (image) data to display
|
||||
*
|
||||
* User must call lv_disp_flush after the image is sent
|
||||
*
|
||||
* @param drv Pointer to driver
|
||||
* @param data Pointer to data to be sent
|
||||
* @param len Data length (in bytes) to be sent
|
||||
*/
|
||||
void display_interface_send_data(lv_disp_drv_t *drv, void *data, size_t len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -8,10 +8,12 @@
|
|||
*********************/
|
||||
#include "esp_lcd_backlight.h"
|
||||
#include "driver/ledc.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "rom/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "soc/ledc_periph.h" // to invert LEDC output on IDF version < v4.3
|
||||
|
||||
#define SIG_GPIO_OUT_IDX 128
|
||||
|
||||
typedef struct {
|
||||
bool pwm_control; // true: LEDC is used, false: GPIO is used
|
||||
int index; // Either GPIO or LEDC channel
|
||||
|
@ -49,7 +51,7 @@ disp_backlight_h disp_backlight_new(const disp_backlight_config_t *config)
|
|||
};
|
||||
const ledc_timer_config_t LCD_backlight_timer = {
|
||||
.speed_mode = LEDC_LOW_SPEED_MODE,
|
||||
.bit_num = LEDC_TIMER_10_BIT,
|
||||
.duty_resolution = LEDC_TIMER_10_BIT,
|
||||
.timer_num = config->timer_idx,
|
||||
.freq_hz = 5000,
|
||||
.clk_cfg = LEDC_AUTO_CLK};
|
||||
|
|
|
@ -18,12 +18,15 @@
|
|||
#include "hx8357.h"
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include <esp_log.h>
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "HX8357"
|
||||
|
||||
#define MADCTL_MY 0x80 ///< Bottom to top
|
||||
#define MADCTL_MX 0x40 ///< Right to left
|
||||
#define MADCTL_MV 0x20 ///< Reverse Mode
|
||||
|
@ -171,7 +174,7 @@ void hx8357_init(void)
|
|||
vTaskDelay(120 / portTICK_RATE_MS);
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("Initialization.");
|
||||
ESP_LOGI(TAG, "Initialization.");
|
||||
|
||||
//Send all the commands
|
||||
const uint8_t *addr = (displayType == HX8357B) ? initb : initd;
|
||||
|
|
|
@ -30,6 +30,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
*********************/
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
|
@ -38,6 +39,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "IL3820"
|
||||
|
||||
/**
|
||||
* SSD1673, SSD1608 compatible EPD controller driver.
|
||||
|
@ -178,9 +180,7 @@ void il3820_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t* buf,
|
|||
BIT_CLEAR(buf[byte_index], 7 - bit_index);
|
||||
}
|
||||
#else
|
||||
(void)byte_index;
|
||||
(void)bit_index;
|
||||
assert(false); // Unsupported orientation configured. Crash if we get here, but allow compilation for CI
|
||||
#error "Unsupported orientation used"
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -277,7 +277,7 @@ static void il3820_waitbusy(int wait_ms)
|
|||
vTaskDelay(10 / portTICK_RATE_MS);
|
||||
}
|
||||
|
||||
LV_LOG_ERROR("Busy exceeded %dms", i*10 );
|
||||
ESP_LOGE( TAG, "busy exceeded %dms", i*10 );
|
||||
}
|
||||
|
||||
/* Set DC signal to command mode */
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "ili9163c.h"
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "assert.h"
|
||||
|
@ -16,6 +17,8 @@
|
|||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "ILI9163C"
|
||||
|
||||
// ILI9163C specific commands used in init
|
||||
#define ILI9163C_NOP 0x00
|
||||
#define ILI9163C_SWRESET 0x01
|
||||
|
@ -66,7 +69,7 @@
|
|||
|
||||
#define ST77XX_MADCTL_MY 0x80
|
||||
#define ST77XX_MADCTL_MX 0x40
|
||||
#define ST77XX_MADCTL_MV 0x20
|
||||
#define ST77XX_MADCTL_MV 0x20 #define
|
||||
#define ST77XX_MADCTL_ML 0x10
|
||||
#define ST77XX_MADCTL_RGB 0x00
|
||||
#define ST77XX_MADCTL_BGR 0x08
|
||||
|
@ -91,7 +94,7 @@ static void ili9163c_set_orientation(uint8_t orientation);
|
|||
static void ili9163c_send_cmd(uint8_t cmd);
|
||||
static void ili9163c_send_data(void *data, uint16_t length);
|
||||
static void ili9163c_send_color(void *data, uint16_t length);
|
||||
static void ili9163c_reset(void);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
@ -106,7 +109,7 @@ static void ili9163c_reset(void);
|
|||
|
||||
void ili9163c_init(void)
|
||||
{
|
||||
LV_LOG_INFO("Init");
|
||||
ESP_LOGD(TAG, "Init");
|
||||
|
||||
lcd_init_cmd_t ili_init_cmds[] = {
|
||||
{ILI9163C_SWRESET, {0}, 0x80}, // Software reset, 0 args, w/delay 120ms
|
||||
|
@ -133,8 +136,18 @@ void ili9163c_init(void)
|
|||
{ILI9163C_DISPON, {0}, 0x80}, // Main screen turn on, no args w/delay 100 ms delay
|
||||
{0, {0}, 0xff}
|
||||
};
|
||||
|
||||
ili9163c_reset();
|
||||
|
||||
//Initialize non-SPI GPIOs
|
||||
gpio_pad_select_gpio(ILI9163C_DC);
|
||||
gpio_set_direction(ILI9163C_DC, GPIO_MODE_OUTPUT);
|
||||
gpio_pad_select_gpio(ILI9163C_RST);
|
||||
gpio_set_direction(ILI9163C_RST, GPIO_MODE_OUTPUT);
|
||||
|
||||
//Reset the display
|
||||
gpio_set_level(ILI9163C_RST, 0);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
gpio_set_level(ILI9163C_RST, 1);
|
||||
vTaskDelay(150 / portTICK_RATE_MS);
|
||||
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
|
@ -226,21 +239,10 @@ static void ili9163c_set_orientation(uint8_t orientation)
|
|||
const char *orientation_str[] = {
|
||||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"};
|
||||
|
||||
LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]);
|
||||
ESP_LOGD(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
uint8_t data[] = {0x48, 0x88, 0xA8, 0x68};
|
||||
|
||||
ili9163c_send_cmd(ILI9163C_MADCTL);
|
||||
ili9163c_send_data((void *)&data[orientation], 1);
|
||||
}
|
||||
|
||||
static void ili9163c_reset(void)
|
||||
{
|
||||
#if CONFIG_LV_DISP_USE_RST
|
||||
gpio_set_level(ILI9163C_RST, 0);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
gpio_set_level(ILI9163C_RST, 1);
|
||||
vTaskDelay(150 / portTICK_RATE_MS);
|
||||
#else
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -7,23 +7,22 @@
|
|||
* INCLUDES
|
||||
*********************/
|
||||
#include "ili9341.h"
|
||||
|
||||
#include "display_port.h"
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define END_OF_CMD_MARKER 0xFFU
|
||||
|
||||
#define MEMORY_ACCESS_CONTROL_REG 0x36U
|
||||
#define SOFTWARE_RESET_REG 0x01U
|
||||
#define TAG "ILI9341"
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*The LCD needs a bunch of command/argument values to be initialized. They are stored in this struct. */
|
||||
|
||||
typedef struct {
|
||||
uint8_t cmd;
|
||||
uint8_t data[16];
|
||||
|
@ -33,8 +32,12 @@ typedef struct {
|
|||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void ili9341_set_orientation(lv_disp_drv_t * drv, uint8_t orientation);
|
||||
static void ili9341_reset(lv_disp_drv_t * drv);
|
||||
static void ili9341_set_orientation(uint8_t orientation);
|
||||
|
||||
static void ili9341_send_cmd(uint8_t cmd);
|
||||
static void ili9341_send_data(void * data, uint16_t length);
|
||||
static void ili9341_send_color(void * data, uint16_t length);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
@ -47,143 +50,162 @@ static void ili9341_reset(lv_disp_drv_t * drv);
|
|||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
void ili9341_init(lv_disp_drv_t * drv)
|
||||
void ili9341_init(void)
|
||||
{
|
||||
lcd_init_cmd_t ili_init_cmds[] = {
|
||||
{0xCF, {0x00, 0x83, 0X30}, 3},
|
||||
{0xED, {0x64, 0x03, 0X12, 0X81}, 4},
|
||||
{0xE8, {0x85, 0x01, 0x79}, 3},
|
||||
{0xCB, {0x39, 0x2C, 0x00, 0x34, 0x02}, 5},
|
||||
{0xF7, {0x20}, 1},
|
||||
{0xEA, {0x00, 0x00}, 2},
|
||||
/* Power control */
|
||||
{0xC0, {0x26}, 1},
|
||||
/* Power control */
|
||||
{0xC1, {0x11}, 1},
|
||||
/* VCOM control */
|
||||
{0xC5, {0x35, 0x3E}, 2},
|
||||
/* VCOM control */
|
||||
{0xC7, {0xBE}, 1},
|
||||
/* Memory Access Control */
|
||||
{0x36, {0x28}, 1},
|
||||
/* Pixel Format Set */
|
||||
{0x3A, {0x55}, 1},
|
||||
{0xB1, {0x00, 0x1B}, 2},
|
||||
{0xF2, {0x08}, 1},
|
||||
{0x26, {0x01}, 1},
|
||||
{0xE0, {0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0X87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00}, 15},
|
||||
{0XE1, {0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F}, 15},
|
||||
{0x2A, {0x00, 0x00, 0x00, 0xEF}, 4},
|
||||
{0x2B, {0x00, 0x00, 0x01, 0x3f}, 4},
|
||||
{0x2C, {0}, 0},
|
||||
{0xB7, {0x07}, 1},
|
||||
{0xB6, {0x0A, 0x82, 0x27, 0x00}, 4},
|
||||
{0x11, {0}, 0x80},
|
||||
{0x29, {0}, 0x80},
|
||||
{0, {0}, END_OF_CMD_MARKER},
|
||||
};
|
||||
lcd_init_cmd_t ili_init_cmds[]={
|
||||
{0xCF, {0x00, 0x83, 0X30}, 3},
|
||||
{0xED, {0x64, 0x03, 0X12, 0X81}, 4},
|
||||
{0xE8, {0x85, 0x01, 0x79}, 3},
|
||||
{0xCB, {0x39, 0x2C, 0x00, 0x34, 0x02}, 5},
|
||||
{0xF7, {0x20}, 1},
|
||||
{0xEA, {0x00, 0x00}, 2},
|
||||
{0xC0, {0x26}, 1}, /*Power control*/
|
||||
{0xC1, {0x11}, 1}, /*Power control */
|
||||
{0xC5, {0x35, 0x3E}, 2}, /*VCOM control*/
|
||||
{0xC7, {0xBE}, 1}, /*VCOM control*/
|
||||
{0x36, {0x28}, 1}, /*Memory Access Control*/
|
||||
{0x3A, {0x55}, 1}, /*Pixel Format Set*/
|
||||
{0xB1, {0x00, 0x1B}, 2},
|
||||
{0xF2, {0x08}, 1},
|
||||
{0x26, {0x01}, 1},
|
||||
{0xE0, {0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0X87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00}, 15},
|
||||
{0XE1, {0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F}, 15},
|
||||
{0x2A, {0x00, 0x00, 0x00, 0xEF}, 4},
|
||||
{0x2B, {0x00, 0x00, 0x01, 0x3f}, 4},
|
||||
{0x2C, {0}, 0},
|
||||
{0xB7, {0x07}, 1},
|
||||
{0xB6, {0x0A, 0x82, 0x27, 0x00}, 4},
|
||||
{0x11, {0}, 0x80},
|
||||
{0x29, {0}, 0x80},
|
||||
{0, {0}, 0xff},
|
||||
};
|
||||
|
||||
ili9341_reset(drv);
|
||||
//Initialize non-SPI GPIOs
|
||||
gpio_pad_select_gpio(ILI9341_DC);
|
||||
gpio_set_direction(ILI9341_DC, GPIO_MODE_OUTPUT);
|
||||
|
||||
//Send all the commands
|
||||
uint16_t idx = 0;
|
||||
while (ili_init_cmds[idx].databytes != END_OF_CMD_MARKER) {
|
||||
uint8_t cmd = ili_init_cmds[idx].cmd;
|
||||
void *args = ili_init_cmds[idx].data;
|
||||
size_t args_len = ili_init_cmds[idx].databytes & 0x1F;
|
||||
#if ILI9341_USE_RST
|
||||
gpio_pad_select_gpio(ILI9341_RST);
|
||||
gpio_set_direction(ILI9341_RST, GPIO_MODE_OUTPUT);
|
||||
|
||||
display_interface_send_cmd(drv, cmd, CMD_WIDTH_8BITS, args, args_len);
|
||||
|
||||
if (ili_init_cmds[idx].databytes & 0x80) {
|
||||
display_port_delay(drv, 100);
|
||||
}
|
||||
//Reset the display
|
||||
gpio_set_level(ILI9341_RST, 0);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
gpio_set_level(ILI9341_RST, 1);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
#endif
|
||||
|
||||
idx++;
|
||||
}
|
||||
ESP_LOGI(TAG, "Initialization.");
|
||||
|
||||
ili9341_set_orientation(drv, ILI9341_INITIAL_ORIENTATION);
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
while (ili_init_cmds[cmd].databytes!=0xff) {
|
||||
ili9341_send_cmd(ili_init_cmds[cmd].cmd);
|
||||
ili9341_send_data(ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes&0x1F);
|
||||
if (ili_init_cmds[cmd].databytes & 0x80) {
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
}
|
||||
cmd++;
|
||||
}
|
||||
|
||||
#if ILI9341_INVERT_COLORS == 1U
|
||||
display_interface_send_cmd(drv, 0x21, CMD_WIDTH_8BITS, NULL, 0);
|
||||
ili9341_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||
|
||||
#if ILI9341_INVERT_COLORS == 1
|
||||
ili9341_send_cmd(0x21);
|
||||
#else
|
||||
display_interface_send_cmd(drv, 0x20, CMD_WIDTH_8BITS, NULL, 0);
|
||||
ili9341_send_cmd(0x20);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
|
||||
{
|
||||
uint8_t data[4] = {0};
|
||||
uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);
|
||||
uint8_t data[4];
|
||||
|
||||
#if LV_COLOR_DEPTH == 16
|
||||
/* Each pixel is 2bytes */
|
||||
size *= 2;
|
||||
#endif
|
||||
/*Column addresses*/
|
||||
ili9341_send_cmd(0x2A);
|
||||
data[0] = (area->x1 >> 8) & 0xFF;
|
||||
data[1] = area->x1 & 0xFF;
|
||||
data[2] = (area->x2 >> 8) & 0xFF;
|
||||
data[3] = area->x2 & 0xFF;
|
||||
ili9341_send_data(data, 4);
|
||||
|
||||
/*Column addresses*/
|
||||
data[0] = (area->x1 >> 8) & 0xFF;
|
||||
data[1] = area->x1 & 0xFF;
|
||||
data[2] = (area->x2 >> 8) & 0xFF;
|
||||
data[3] = area->x2 & 0xFF;
|
||||
|
||||
display_interface_send_cmd(drv, 0x2A, CMD_WIDTH_8BITS, data, sizeof(data));
|
||||
/*Page addresses*/
|
||||
ili9341_send_cmd(0x2B);
|
||||
data[0] = (area->y1 >> 8) & 0xFF;
|
||||
data[1] = area->y1 & 0xFF;
|
||||
data[2] = (area->y2 >> 8) & 0xFF;
|
||||
data[3] = area->y2 & 0xFF;
|
||||
ili9341_send_data(data, 4);
|
||||
|
||||
/* Page addresses */
|
||||
data[0] = (area->y1 >> 8) & 0xFF;
|
||||
data[1] = area->y1 & 0xFF;
|
||||
data[2] = (area->y2 >> 8) & 0xFF;
|
||||
data[3] = area->y2 & 0xFF;
|
||||
|
||||
display_interface_send_cmd(drv, 0x2B, CMD_WIDTH_8BITS, data, sizeof(data));
|
||||
|
||||
/* Memory write */
|
||||
display_interface_send_cmd(drv, 0x2C, CMD_WIDTH_8BITS, NULL, 0);
|
||||
display_interface_send_data(drv, color_map, size);
|
||||
/*Memory write*/
|
||||
ili9341_send_cmd(0x2C);
|
||||
uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);
|
||||
ili9341_send_color((void*)color_map, size * 2);
|
||||
}
|
||||
|
||||
void ili9341_sleep_in(lv_disp_drv_t * drv)
|
||||
void ili9341_sleep_in()
|
||||
{
|
||||
uint8_t data[] = {0x08};
|
||||
display_interface_send_cmd(drv, 0x10, CMD_WIDTH_8BITS, data, 1);
|
||||
uint8_t data[] = {0x08};
|
||||
ili9341_send_cmd(0x10);
|
||||
ili9341_send_data(&data, 1);
|
||||
}
|
||||
|
||||
void ili9341_sleep_out(lv_disp_drv_t * drv)
|
||||
void ili9341_sleep_out()
|
||||
{
|
||||
uint8_t data[] = {0x08};
|
||||
display_interface_send_cmd(drv, 0x11, CMD_WIDTH_8BITS, data, 1);
|
||||
uint8_t data[] = {0x08};
|
||||
ili9341_send_cmd(0x11);
|
||||
ili9341_send_data(&data, 1);
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
static void ili9341_set_orientation(lv_disp_drv_t *drv, uint8_t orientation)
|
||||
|
||||
|
||||
static void ili9341_send_cmd(uint8_t cmd)
|
||||
{
|
||||
assert(orientation < 4);
|
||||
disp_wait_for_pending_transactions();
|
||||
gpio_set_level(ILI9341_DC, 0); /*Command mode*/
|
||||
disp_spi_send_data(&cmd, 1);
|
||||
}
|
||||
|
||||
static void ili9341_send_data(void * data, uint16_t length)
|
||||
{
|
||||
disp_wait_for_pending_transactions();
|
||||
gpio_set_level(ILI9341_DC, 1); /*Data mode*/
|
||||
disp_spi_send_data(data, length);
|
||||
}
|
||||
|
||||
static void ili9341_send_color(void * data, uint16_t length)
|
||||
{
|
||||
disp_wait_for_pending_transactions();
|
||||
gpio_set_level(ILI9341_DC, 1); /*Data mode*/
|
||||
disp_spi_send_colors(data, length);
|
||||
}
|
||||
|
||||
static void ili9341_set_orientation(uint8_t orientation)
|
||||
{
|
||||
// ESP_ASSERT(orientation < 4);
|
||||
|
||||
const char *orientation_str[] = {
|
||||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"
|
||||
};
|
||||
|
||||
ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
#if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK
|
||||
const uint8_t data[] = {0x68, 0x68, 0x08, 0x08};
|
||||
uint8_t data[] = {0x68, 0x68, 0x08, 0x08};
|
||||
#elif defined (CONFIG_LV_PREDEFINED_DISPLAY_M5CORE2)
|
||||
const uint8_t data[] = {0x08, 0x88, 0x28, 0xE8};
|
||||
uint8_t data[] = {0x08, 0x88, 0x28, 0xE8};
|
||||
#elif defined (CONFIG_LV_PREDEFINED_DISPLAY_WROVER4)
|
||||
const uint8_t data[] = {0x6C, 0xEC, 0xCC, 0x4C};
|
||||
#else
|
||||
const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
uint8_t data[] = {0x6C, 0xEC, 0xCC, 0x4C};
|
||||
#elif defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE)
|
||||
uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
#endif
|
||||
|
||||
display_interface_send_cmd(drv, MEMORY_ACCESS_CONTROL_REG, CMD_WIDTH_8BITS, &data[orientation], 1);
|
||||
}
|
||||
ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]);
|
||||
|
||||
/* Reset the display, if we don't have a reset pin we use software reset */
|
||||
static void ili9341_reset(lv_disp_drv_t *drv)
|
||||
{
|
||||
#if defined(ILI9341_USE_RST)
|
||||
display_port_gpio_rst(drv, 0);
|
||||
display_port_delay(drv, 100);
|
||||
display_port_gpio_rst(drv, 1);
|
||||
display_port_delay(drv, 100);
|
||||
#else
|
||||
display_interface_send_cmd(drv, SOFTWARE_RESET_REG, CMD_WIDTH_8BITS, NULL, 0);
|
||||
display_port_delay(drv, 5);
|
||||
#endif
|
||||
ili9341_send_cmd(0x36);
|
||||
ili9341_send_data((void *) &data[orientation], 1);
|
||||
}
|
||||
|
|
|
@ -13,17 +13,23 @@ extern "C" {
|
|||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#include "display_config.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define ILI9341_DC CONFIG_LV_DISP_PIN_DC
|
||||
#define ILI9341_USE_RST CONFIG_LV_DISP_USE_RST
|
||||
#define ILI9341_RST CONFIG_LV_DISP_PIN_RST
|
||||
#define ILI9341_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
@ -33,10 +39,10 @@ extern "C" {
|
|||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
void ili9341_init(lv_disp_drv_t * drv);
|
||||
void ili9341_init(void);
|
||||
void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
||||
void ili9341_sleep_in(lv_disp_drv_t * drv);
|
||||
void ili9341_sleep_out(lv_disp_drv_t *drv);
|
||||
void ili9341_sleep_in(void);
|
||||
void ili9341_sleep_out(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
|
|
|
@ -8,13 +8,16 @@
|
|||
#include "ili9481.h"
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_heap_caps.h"
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "ILI9481"
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
@ -85,7 +88,7 @@ void ili9481_init(void)
|
|||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("Initialization.");
|
||||
ESP_LOGI(TAG, "ILI9481 initialization.");
|
||||
|
||||
// Exit sleep
|
||||
ili9481_send_cmd(0x01); /* Software reset */
|
||||
|
@ -114,7 +117,7 @@ void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col
|
|||
uint8_t *mybuf;
|
||||
do {
|
||||
mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA);
|
||||
if (mybuf == NULL) LV_LOG_WARN("Could not allocate enough DMA memory!");
|
||||
if (mybuf == NULL) ESP_LOGW(TAG, "Could not allocate enough DMA memory!");
|
||||
} while (mybuf == NULL);
|
||||
|
||||
uint32_t LD = 0;
|
||||
|
@ -193,7 +196,7 @@ static void ili9481_set_orientation(uint8_t orientation)
|
|||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"
|
||||
};
|
||||
|
||||
LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]);
|
||||
ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
uint8_t data[] = {0x48, 0x4B, 0x28, 0x2B};
|
||||
ili9481_send_cmd(ILI9481_CMD_MEMORY_ACCESS_CONTROL);
|
||||
|
|
|
@ -9,12 +9,14 @@
|
|||
#include "ili9486.h"
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "ILI9486"
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
@ -78,7 +80,7 @@ void ili9486_init(void)
|
|||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("ILI9486 Initialization.");
|
||||
ESP_LOGI(TAG, "ILI9486 Initialization.");
|
||||
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
|
@ -163,17 +165,19 @@ static void ili9486_send_color(void * data, uint16_t length)
|
|||
|
||||
static void ili9486_set_orientation(uint8_t orientation)
|
||||
{
|
||||
assert(orientation < 4);
|
||||
// ESP_ASSERT(orientation < 4);
|
||||
|
||||
const char *orientation_str[] = {
|
||||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"
|
||||
};
|
||||
|
||||
LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]);
|
||||
ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
#if defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE)
|
||||
uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]);
|
||||
ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]);
|
||||
|
||||
ili9486_send_cmd(0x36);
|
||||
ili9486_send_data((void *) &data[orientation], 1);
|
||||
|
|
|
@ -6,14 +6,18 @@
|
|||
* INCLUDES
|
||||
*********************/
|
||||
#include "ili9488.h"
|
||||
|
||||
#include "disp_spi.h"
|
||||
#include "display_port.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_heap_caps.h"
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "ILI9488"
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
@ -29,12 +33,11 @@ typedef struct {
|
|||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void ili9488_set_orientation(lv_disp_drv_t * drv, uint8_t orientation);
|
||||
static void ili9488_set_orientation(uint8_t orientation);
|
||||
|
||||
static void ili9488_send_cmd(lv_disp_drv_t * drv, uint8_t cmd);
|
||||
static void ili9488_send_data(lv_disp_drv_t * drv, void * data, uint16_t length);
|
||||
static void ili9488_send_color(lv_disp_drv_t * drv, void * data, uint16_t length);
|
||||
static void ili9488_reset(lv_disp_drv_t * drv);
|
||||
static void ili9488_send_cmd(uint8_t cmd);
|
||||
static void ili9488_send_data(void * data, uint16_t length);
|
||||
static void ili9488_send_color(void * data, uint16_t length);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
|
@ -49,47 +52,62 @@ static void ili9488_reset(lv_disp_drv_t * drv);
|
|||
**********************/
|
||||
// From github.com/jeremyjh/ESP32_TFT_library
|
||||
// From github.com/mvturnho/ILI9488-lvgl-ESP32-WROVER-B
|
||||
void ili9488_init(lv_disp_drv_t * drv)
|
||||
void ili9488_init(void)
|
||||
{
|
||||
lcd_init_cmd_t ili_init_cmds[]={
|
||||
{ILI9488_CMD_SLEEP_OUT, {0x00}, 0x80},
|
||||
{ILI9488_CMD_POSITIVE_GAMMA_CORRECTION, {0x00, 0x03, 0x09, 0x08, 0x16, 0x0A, 0x3F, 0x78, 0x4C, 0x09, 0x0A, 0x08, 0x16, 0x1A, 0x0F}, 15},
|
||||
{ILI9488_CMD_NEGATIVE_GAMMA_CORRECTION, {0x00, 0x16, 0x19, 0x03, 0x0F, 0x05, 0x32, 0x45, 0x46, 0x04, 0x0E, 0x0D, 0x35, 0x37, 0x0F}, 15},
|
||||
{ILI9488_CMD_POWER_CONTROL_1, {0x17, 0x15}, 2},
|
||||
{ILI9488_CMD_POWER_CONTROL_2, {0x41}, 1},
|
||||
{ILI9488_CMD_VCOM_CONTROL_1, {0x00, 0x12, 0x80}, 3},
|
||||
{ILI9488_CMD_MEMORY_ACCESS_CONTROL, {(0x20 | 0x08)}, 1},
|
||||
{ILI9488_CMD_COLMOD_PIXEL_FORMAT_SET, {0x66}, 1},
|
||||
{ILI9488_CMD_INTERFACE_MODE_CONTROL, {0x00}, 1},
|
||||
{ILI9488_CMD_FRAME_RATE_CONTROL_NORMAL, {0xA0}, 1},
|
||||
{ILI9488_CMD_DISPLAY_INVERSION_CONTROL, {0x02}, 1},
|
||||
{ILI9488_CMD_DISPLAY_FUNCTION_CONTROL, {0x02, 0x02}, 2},
|
||||
{ILI9488_CMD_SET_IMAGE_FUNCTION, {0x00}, 1},
|
||||
{ILI9488_CMD_WRITE_CTRL_DISPLAY, {0x28}, 1},
|
||||
{ILI9488_CMD_WRITE_DISPLAY_BRIGHTNESS, {0x7F}, 1},
|
||||
{ILI9488_CMD_ADJUST_CONTROL_3, {0xA9, 0x51, 0x2C, 0x02}, 4},
|
||||
{ILI9488_CMD_DISPLAY_ON, {0x00}, 0x80},
|
||||
{0, {0}, 0xff},
|
||||
};
|
||||
lcd_init_cmd_t ili_init_cmds[]={
|
||||
{ILI9488_CMD_SLEEP_OUT, {0x00}, 0x80},
|
||||
{ILI9488_CMD_POSITIVE_GAMMA_CORRECTION, {0x00, 0x03, 0x09, 0x08, 0x16, 0x0A, 0x3F, 0x78, 0x4C, 0x09, 0x0A, 0x08, 0x16, 0x1A, 0x0F}, 15},
|
||||
{ILI9488_CMD_NEGATIVE_GAMMA_CORRECTION, {0x00, 0x16, 0x19, 0x03, 0x0F, 0x05, 0x32, 0x45, 0x46, 0x04, 0x0E, 0x0D, 0x35, 0x37, 0x0F}, 15},
|
||||
{ILI9488_CMD_POWER_CONTROL_1, {0x17, 0x15}, 2},
|
||||
{ILI9488_CMD_POWER_CONTROL_2, {0x41}, 1},
|
||||
{ILI9488_CMD_VCOM_CONTROL_1, {0x00, 0x12, 0x80}, 3},
|
||||
{ILI9488_CMD_MEMORY_ACCESS_CONTROL, {(0x20 | 0x08)}, 1},
|
||||
{ILI9488_CMD_COLMOD_PIXEL_FORMAT_SET, {0x66}, 1},
|
||||
{ILI9488_CMD_INTERFACE_MODE_CONTROL, {0x00}, 1},
|
||||
{ILI9488_CMD_FRAME_RATE_CONTROL_NORMAL, {0xA0}, 1},
|
||||
{ILI9488_CMD_DISPLAY_INVERSION_CONTROL, {0x02}, 1},
|
||||
{ILI9488_CMD_DISPLAY_FUNCTION_CONTROL, {0x02, 0x02}, 2},
|
||||
{ILI9488_CMD_SET_IMAGE_FUNCTION, {0x00}, 1},
|
||||
{ILI9488_CMD_WRITE_CTRL_DISPLAY, {0x28}, 1},
|
||||
{ILI9488_CMD_WRITE_DISPLAY_BRIGHTNESS, {0x7F}, 1},
|
||||
{ILI9488_CMD_ADJUST_CONTROL_3, {0xA9, 0x51, 0x2C, 0x02}, 4},
|
||||
{ILI9488_CMD_DISPLAY_ON, {0x00}, 0x80},
|
||||
{0, {0}, 0xff},
|
||||
};
|
||||
|
||||
ili9488_reset(drv);
|
||||
//Initialize non-SPI GPIOs
|
||||
gpio_pad_select_gpio(ILI9488_DC);
|
||||
gpio_set_direction(ILI9488_DC, GPIO_MODE_OUTPUT);
|
||||
|
||||
LV_LOG_INFO("ILI9488 initialization.");
|
||||
#if ILI9488_USE_RST
|
||||
gpio_pad_select_gpio(ILI9488_RST);
|
||||
gpio_set_direction(ILI9488_RST, GPIO_MODE_OUTPUT);
|
||||
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
while (ili_init_cmds[cmd].databytes!=0xff) {
|
||||
ili9488_send_cmd(drv, ili_init_cmds[cmd].cmd);
|
||||
ili9488_send_data(drv, ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes&0x1F);
|
||||
|
||||
if (ili_init_cmds[cmd].databytes & 0x80) {
|
||||
display_port_delay(drv, 100);
|
||||
}
|
||||
//Reset the display
|
||||
gpio_set_level(ILI9488_RST, 0);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
gpio_set_level(ILI9488_RST, 1);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
#endif
|
||||
|
||||
cmd++;
|
||||
}
|
||||
ESP_LOGI(TAG, "ILI9488 initialization.");
|
||||
|
||||
ili9488_set_orientation(drv, ILI9488_INITIAL_ORIENTATION);
|
||||
// Exit sleep
|
||||
ili9488_send_cmd(0x01); /* Software reset */
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
while (ili_init_cmds[cmd].databytes!=0xff) {
|
||||
ili9488_send_cmd(ili_init_cmds[cmd].cmd);
|
||||
ili9488_send_data(ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes&0x1F);
|
||||
if (ili_init_cmds[cmd].databytes & 0x80) {
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
}
|
||||
cmd++;
|
||||
}
|
||||
|
||||
ili9488_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||
}
|
||||
|
||||
// Flush function based on mvturnho repo
|
||||
|
@ -101,9 +119,7 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col
|
|||
uint8_t *mybuf;
|
||||
do {
|
||||
mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA);
|
||||
if (mybuf == NULL) {
|
||||
LV_LOG_WARN("Could not allocate enough DMA memory!");
|
||||
}
|
||||
if (mybuf == NULL) ESP_LOGW(TAG, "Could not allocate enough DMA memory!");
|
||||
} while (mybuf == NULL);
|
||||
|
||||
uint32_t LD = 0;
|
||||
|
@ -136,17 +152,17 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col
|
|||
};
|
||||
|
||||
/*Column addresses*/
|
||||
ili9488_send_cmd(drv, ILI9488_CMD_COLUMN_ADDRESS_SET);
|
||||
ili9488_send_data(drv, xb, 4);
|
||||
ili9488_send_cmd(ILI9488_CMD_COLUMN_ADDRESS_SET);
|
||||
ili9488_send_data(xb, 4);
|
||||
|
||||
/*Page addresses*/
|
||||
ili9488_send_cmd(drv, ILI9488_CMD_PAGE_ADDRESS_SET);
|
||||
ili9488_send_data(drv, yb, 4);
|
||||
ili9488_send_cmd(ILI9488_CMD_PAGE_ADDRESS_SET);
|
||||
ili9488_send_data(yb, 4);
|
||||
|
||||
/*Memory write*/
|
||||
ili9488_send_cmd(drv, ILI9488_CMD_MEMORY_WRITE);
|
||||
ili9488_send_cmd(ILI9488_CMD_MEMORY_WRITE);
|
||||
|
||||
ili9488_send_color(drv, (void *) mybuf, size * 3);
|
||||
ili9488_send_color((void *) mybuf, size * 3);
|
||||
heap_caps_free(mybuf);
|
||||
}
|
||||
|
||||
|
@ -154,65 +170,44 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col
|
|||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static inline void set_cmd_mode(lv_disp_drv_t * drv)
|
||||
{
|
||||
display_port_gpio_dc(drv, 0);
|
||||
}
|
||||
|
||||
static inline void set_data_mode(lv_disp_drv_t * drv)
|
||||
{
|
||||
display_port_gpio_dc(drv, 1);
|
||||
}
|
||||
|
||||
static void ili9488_send_cmd(lv_disp_drv_t * drv, uint8_t cmd)
|
||||
static void ili9488_send_cmd(uint8_t cmd)
|
||||
{
|
||||
disp_wait_for_pending_transactions();
|
||||
set_cmd_mode(drv);
|
||||
gpio_set_level(ILI9488_DC, 0); /*Command mode*/
|
||||
disp_spi_send_data(&cmd, 1);
|
||||
}
|
||||
|
||||
static void ili9488_send_data(lv_disp_drv_t * drv, void * data, uint16_t length)
|
||||
static void ili9488_send_data(void * data, uint16_t length)
|
||||
{
|
||||
disp_wait_for_pending_transactions();
|
||||
set_data_mode(drv);
|
||||
gpio_set_level(ILI9488_DC, 1); /*Data mode*/
|
||||
disp_spi_send_data(data, length);
|
||||
}
|
||||
|
||||
static void ili9488_send_color(lv_disp_drv_t * drv, void * data, uint16_t length)
|
||||
static void ili9488_send_color(void * data, uint16_t length)
|
||||
{
|
||||
disp_wait_for_pending_transactions();
|
||||
set_data_mode(drv);
|
||||
gpio_set_level(ILI9488_DC, 1); /*Data mode*/
|
||||
disp_spi_send_colors(data, length);
|
||||
}
|
||||
|
||||
static void ili9488_set_orientation(lv_disp_drv_t * drv, uint8_t orientation)
|
||||
static void ili9488_set_orientation(uint8_t orientation)
|
||||
{
|
||||
assert(orientation < 4);
|
||||
// ESP_ASSERT(orientation < 4);
|
||||
|
||||
const char *orientation_str[] = {
|
||||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"
|
||||
};
|
||||
|
||||
LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]);
|
||||
ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
|
||||
LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]);
|
||||
|
||||
ili9488_send_cmd(drv, 0x36);
|
||||
ili9488_send_data(drv, (void *) &data[orientation], 1);
|
||||
}
|
||||
|
||||
/* Reset the display, if we don't have a reset pin we use software reset */
|
||||
static void ili9488_reset(lv_disp_drv_t *drv)
|
||||
{
|
||||
#if defined(ILI9488_USE_RST)
|
||||
display_port_gpio_rst(drv, 0);
|
||||
display_port_delay(drv, 100);
|
||||
display_port_gpio_rst(drv, 1);
|
||||
display_port_delay(drv, 100);
|
||||
#else
|
||||
ili9341_send_cmd(drv, 0x01);
|
||||
display_port_delay(drv, 5);
|
||||
#if defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE)
|
||||
uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
#endif
|
||||
|
||||
ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]);
|
||||
|
||||
ili9488_send_cmd(0x36);
|
||||
ili9488_send_data((void *) &data[orientation], 1);
|
||||
}
|
||||
|
|
|
@ -20,13 +20,14 @@ extern "C" {
|
|||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#include "../lvgl_helpers.h"
|
||||
#include "display_config.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define ILI9488_DC CONFIG_LV_DISP_PIN_DC
|
||||
#define ILI9488_RST CONFIG_LV_DISP_PIN_RST
|
||||
#define ILI9488_USE_RST CONFIG_LV_DISP_USE_RSTS
|
||||
|
||||
/*******************
|
||||
* ILI9488 REGS
|
||||
|
@ -143,7 +144,7 @@ typedef struct {
|
|||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
void ili9488_init(lv_disp_drv_t * drv);
|
||||
void ili9488_init(void);
|
||||
void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
||||
|
||||
/**********************
|
||||
|
|
|
@ -29,18 +29,17 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
#include <freertos/task.h>
|
||||
#include <freertos/event_groups.h>
|
||||
#include <driver/gpio.h>
|
||||
#include <esp_log.h>
|
||||
|
||||
#include "disp_spi.h"
|
||||
#include "jd79653a.h"
|
||||
|
||||
#define TAG "lv_jd79653a"
|
||||
|
||||
#define PIN_DC CONFIG_LV_DISP_PIN_DC
|
||||
#define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_DC)))
|
||||
|
||||
#if defined CONFIG_LV_DISP_PIN_RST
|
||||
#define PIN_RST CONFIG_LV_DISP_PIN_RST
|
||||
#define PIN_RST_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_RST)))
|
||||
#endif
|
||||
|
||||
#define PIN_BUSY CONFIG_LV_DISP_PIN_BUSY
|
||||
#define PIN_BUSY_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_BUSY)))
|
||||
#define EVT_BUSY (1UL << 0UL)
|
||||
|
@ -124,9 +123,10 @@ static const uint8_t lut_bb1[] = {
|
|||
static const jd79653a_seq_t init_seq[] = {
|
||||
#if defined (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED)
|
||||
{0x00, {0xd3, 0x0e}, 2}, // Panel settings
|
||||
//#elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT)
|
||||
#else
|
||||
#elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT)
|
||||
{0x00, {0xdf, 0x0e}, 2}, // Panel settings
|
||||
#else
|
||||
#error "Unsupported orientation - only portrait modes are supported for now"
|
||||
#endif
|
||||
{0x4d, {0x55}, 1}, // Undocumented secret from demo code
|
||||
{0xaa, {0x0f}, 1}, // Undocumented secret from demo code
|
||||
|
@ -185,7 +185,7 @@ static void jd79653a_spi_send_fb(uint8_t *data, size_t len)
|
|||
|
||||
static void jd79653a_spi_send_seq(const jd79653a_seq_t *seq, size_t len)
|
||||
{
|
||||
LV_LOG_INFO("Writing cmd/data sequence, count %u", len);
|
||||
ESP_LOGD(TAG, "Writing cmd/data sequence, count %u", len);
|
||||
|
||||
if (!seq || len < 1) return;
|
||||
for (size_t cmd_idx = 0; cmd_idx < len; cmd_idx++) {
|
||||
|
@ -241,7 +241,7 @@ static void jd79653a_load_partial_lut()
|
|||
|
||||
static void jd79653a_partial_in()
|
||||
{
|
||||
LV_LOG_INFO("Partial in!");
|
||||
ESP_LOGD(TAG, "Partial in!");
|
||||
|
||||
// Panel setting: accept LUT from registers instead of OTP
|
||||
#if defined (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED)
|
||||
|
@ -249,8 +249,7 @@ static void jd79653a_partial_in()
|
|||
#elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT)
|
||||
uint8_t pst_use_reg_lut[] = { 0xff, 0x0e };
|
||||
#else
|
||||
assert(false); // Unsupported orientation configured. Crash if we get here, but allow compilation for CI
|
||||
uint8_t pst_use_reg_lut[] = { 0,0 };
|
||||
#error "Unsupported orientation - only portrait modes are supported for now"
|
||||
#endif
|
||||
jd79653a_spi_send_cmd(0x00);
|
||||
jd79653a_spi_send_data(pst_use_reg_lut, sizeof(pst_use_reg_lut));
|
||||
|
@ -269,7 +268,7 @@ static void jd79653a_partial_in()
|
|||
|
||||
static void jd79653a_partial_out()
|
||||
{
|
||||
LV_LOG_INFO("Partial out!");
|
||||
ESP_LOGD(TAG, "Partial out!");
|
||||
|
||||
// Panel setting: use LUT from OTP
|
||||
#if defined (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED)
|
||||
|
@ -277,8 +276,7 @@ static void jd79653a_partial_out()
|
|||
#elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT)
|
||||
uint8_t pst_use_otp_lut[] = { 0xdf, 0x0e };
|
||||
#else
|
||||
assert(false); // Unsupported orientation configured. Crash if we get here, but allow compilation for CI
|
||||
uint8_t pst_use_otp_lut[] = { 0,0 };
|
||||
#error "Unsupported orientation - only portrait modes are supported for now"
|
||||
#endif
|
||||
jd79653a_spi_send_cmd(0x00);
|
||||
jd79653a_spi_send_data(pst_use_otp_lut, sizeof(pst_use_otp_lut));
|
||||
|
@ -296,10 +294,10 @@ static void jd79653a_update_partial(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t
|
|||
{
|
||||
jd79653a_power_on();
|
||||
jd79653a_partial_in();
|
||||
LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", x1, x2, y1, y2);
|
||||
ESP_LOGD(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", x1, x2, y1, y2);
|
||||
|
||||
size_t len = ((x2 - x1 + 1) * (y2 - y1 + 1)) / 8;
|
||||
LV_LOG_INFO("Writing PARTIAL LVGL fb with len: %u", len);
|
||||
ESP_LOGD(TAG, "Writing PARTIAL LVGL fb with len: %u", len);
|
||||
|
||||
// Set partial window
|
||||
uint8_t ptl_setting[7] = { x1, x2, 0, y1, 0, y2, 0x01 };
|
||||
|
@ -315,18 +313,16 @@ static void jd79653a_update_partial(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t
|
|||
len -= EPD_ROW_LEN;
|
||||
}
|
||||
|
||||
LV_LOG_INFO("Partial wait start");
|
||||
ESP_LOGD(TAG, "Partial wait start");
|
||||
|
||||
jd79653a_spi_send_cmd(0x12);
|
||||
jd79653a_wait_busy(0);
|
||||
|
||||
LV_LOG_INFO("Partial updated");
|
||||
ESP_LOGD(TAG, "Partial updated");
|
||||
jd79653a_partial_out();
|
||||
jd79653a_power_off();
|
||||
}
|
||||
|
||||
static void jd79653a_reset(void);
|
||||
|
||||
void jd79653a_fb_set_full_color(uint8_t color)
|
||||
{
|
||||
jd79653a_power_on();
|
||||
|
@ -357,7 +353,7 @@ void jd79653a_fb_set_full_color(uint8_t color)
|
|||
void jd79653a_fb_full_update(uint8_t *data, size_t len)
|
||||
{
|
||||
jd79653a_power_on();
|
||||
LV_LOG_INFO("Performing full update, len: %u", len);
|
||||
ESP_LOGD(TAG, "Performing full update, len: %u", len);
|
||||
|
||||
uint8_t *data_ptr = data;
|
||||
|
||||
|
@ -376,7 +372,7 @@ void jd79653a_fb_full_update(uint8_t *data, size_t len)
|
|||
len -= EPD_ROW_LEN;
|
||||
}
|
||||
|
||||
LV_LOG_INFO("Rest len: %u", len);
|
||||
ESP_LOGD(TAG, "Rest len: %u", len);
|
||||
|
||||
jd79653a_spi_send_cmd(0x12); // Issue refresh command
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
|
@ -411,13 +407,13 @@ void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t
|
|||
{
|
||||
size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8;
|
||||
|
||||
LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2);
|
||||
LV_LOG_INFO("Writing LVGL fb with len: %u, partial counter: %u", len, partial_counter);
|
||||
ESP_LOGD(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2);
|
||||
ESP_LOGD(TAG, "Writing LVGL fb with len: %u, partial counter: %u", len, partial_counter);
|
||||
|
||||
uint8_t *buf = (uint8_t *) color_map;
|
||||
|
||||
if (partial_counter == 0) {
|
||||
LV_LOG_INFO("Refreshing in FULL");
|
||||
ESP_LOGD(TAG, "Refreshing in FULL");
|
||||
jd79653a_fb_full_update(buf, ((EPD_HEIGHT * EPD_WIDTH) / 8));
|
||||
partial_counter = EPD_PARTIAL_CNT; // Reset partial counter here
|
||||
} else {
|
||||
|
@ -443,10 +439,20 @@ void jd79653a_init()
|
|||
// Initialise event group
|
||||
jd79653a_evts = xEventGroupCreate();
|
||||
if (!jd79653a_evts) {
|
||||
LV_LOG_ERROR("Failed when initialising event group!");
|
||||
ESP_LOGE(TAG, "Failed when initialising event group!");
|
||||
return;
|
||||
}
|
||||
|
||||
// Setup output pins, output (PP)
|
||||
gpio_config_t out_io_conf = {
|
||||
.intr_type = GPIO_INTR_DISABLE,
|
||||
.mode = GPIO_MODE_OUTPUT,
|
||||
.pin_bit_mask = PIN_DC_BIT | PIN_RST_BIT,
|
||||
.pull_down_en = 0,
|
||||
.pull_up_en = 0,
|
||||
};
|
||||
ESP_ERROR_CHECK(gpio_config(&out_io_conf));
|
||||
|
||||
// Setup input pin, pull-up, input
|
||||
gpio_config_t in_io_conf = {
|
||||
.intr_type = GPIO_INTR_POSEDGE,
|
||||
|
@ -459,25 +465,18 @@ void jd79653a_init()
|
|||
gpio_install_isr_service(0);
|
||||
gpio_isr_handler_add(PIN_BUSY, jd79653a_busy_intr, (void *) PIN_BUSY);
|
||||
|
||||
jd79653a_reset();
|
||||
// Hardware reset
|
||||
gpio_set_level(PIN_RST, 0);
|
||||
vTaskDelay(pdMS_TO_TICKS(15)); // At least 10ms, leave 15ms for now just in case...
|
||||
gpio_set_level(PIN_RST, 1);
|
||||
vTaskDelay(pdMS_TO_TICKS(120));
|
||||
|
||||
// Dump in initialise sequence
|
||||
jd79653a_spi_send_seq(init_seq, EPD_SEQ_LEN(init_seq));
|
||||
LV_LOG_INFO("Panel init sequence sent");
|
||||
ESP_LOGI(TAG, "Panel init sequence sent");
|
||||
|
||||
// Check BUSY status here
|
||||
jd79653a_wait_busy(0);
|
||||
|
||||
LV_LOG_INFO("Panel is up!");
|
||||
}
|
||||
|
||||
static void jd79653a_reset(void)
|
||||
{
|
||||
#if defined CONFIG_LV_DISP_PIN_RST
|
||||
gpio_set_level(PIN_RST, 0);
|
||||
// At least 10ms, leave 15ms for now just in case...
|
||||
vTaskDelay(pdMS_TO_TICKS(15));
|
||||
gpio_set_level(PIN_RST, 1);
|
||||
vTaskDelay(pdMS_TO_TICKS(120));
|
||||
#endif
|
||||
ESP_LOGI(TAG, "Panel is up!");
|
||||
}
|
||||
|
|
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*/
|
|
@ -9,12 +9,16 @@
|
|||
#include "ra8875.h"
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define DEBUG false
|
||||
#define TAG "RA8875"
|
||||
|
||||
#define DIV_ROUND_UP(n, d) (((n)+(d)-1)/(d))
|
||||
|
||||
#define SPI_CLOCK_SPEED_SLOW_HZ 1000000
|
||||
|
@ -24,34 +28,6 @@
|
|||
#define RA8875_MODE_CMD_WRITE (0x80)
|
||||
#define RA8875_MODE_STATUS_READ (0xC0)
|
||||
|
||||
#define BYTES_PER_PIXEL (LV_COLOR_DEPTH / 8)
|
||||
|
||||
#define HDWR_VAL (LV_HOR_RES_MAX/8 - 1)
|
||||
#define VDHR_VAL (LV_VER_RES_MAX - 1)
|
||||
|
||||
#define VDIR_MASK (1 << 2)
|
||||
#define HDIR_MASK (1 << 3)
|
||||
|
||||
#ifndef CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875
|
||||
// Use this settings if there is no Kconfig settings defined
|
||||
#define SYSR_VAL (0x00)
|
||||
#define DPCR_VAL (0x00)
|
||||
#define PCSR_VAL (0x00)
|
||||
#define HNDR_VAL (0x00)
|
||||
#define HNDFTR_VAL (0x00)
|
||||
#define HSTR_VAL (0x00)
|
||||
#define HPW (0x00)
|
||||
#define HPWR_VAL (0x00)
|
||||
#define VNDR_VAL (0x00)
|
||||
#define VSTR_VAL (0x00)
|
||||
#define VPW (0x00)
|
||||
#define VPWR_VAL (0x00)
|
||||
#define CONFIG_LV_DISP_RA8875_PLLDIVM (0x00)
|
||||
#define CONFIG_LV_DISP_RA8875_PLLDIVN (0x00)
|
||||
#define CONFIG_LV_DISP_RA8875_PLLDIVK (0x00)
|
||||
|
||||
#else
|
||||
|
||||
#if (LV_COLOR_DEPTH == 8)
|
||||
#define SYSR_VAL (0x00)
|
||||
#elif (LV_COLOR_DEPTH == 16)
|
||||
|
@ -59,6 +35,13 @@
|
|||
#else
|
||||
#error "Unsupported color depth (LV_COLOR_DEPTH)"
|
||||
#endif
|
||||
#define BYTES_PER_PIXEL (LV_COLOR_DEPTH / 8)
|
||||
|
||||
#define HDWR_VAL (LV_HOR_RES_MAX/8 - 1)
|
||||
#define VDHR_VAL (LV_VER_RES_MAX - 1)
|
||||
|
||||
#define VDIR_MASK (1 << 2)
|
||||
#define HDIR_MASK (1 << 3)
|
||||
|
||||
#if ( CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED || CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED )
|
||||
#if CONFIG_LV_INVERT_DISPLAY
|
||||
|
@ -109,7 +92,6 @@
|
|||
#else
|
||||
#define VPWR_VAL (VPW)
|
||||
#endif
|
||||
#endif // CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
@ -137,9 +119,6 @@ static void ra8875_send_buffer(uint8_t * data, size_t length, bool signal_flush)
|
|||
|
||||
void ra8875_init(void)
|
||||
{
|
||||
#ifndef CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875
|
||||
assert(false); // This driver is not properly configured
|
||||
#endif
|
||||
unsigned int i = 0;
|
||||
|
||||
struct {
|
||||
|
@ -167,7 +146,7 @@ void ra8875_init(void)
|
|||
};
|
||||
#define INIT_CMDS_SIZE (sizeof(init_cmds)/sizeof(init_cmds[0]))
|
||||
|
||||
LV_LOG_INFO("Initializing RA8875...");
|
||||
ESP_LOGI(TAG, "Initializing RA8875...");
|
||||
|
||||
// Initialize non-SPI GPIOs
|
||||
|
||||
|
@ -201,7 +180,7 @@ void ra8875_init(void)
|
|||
vTaskDelay(1);
|
||||
}
|
||||
if (i == 0) {
|
||||
LV_LOG_WARN("WARNING: Memory clear timed out; RA8875 may be unresponsive.");
|
||||
ESP_LOGW(TAG, "WARNING: Memory clear timed out; RA8875 may be unresponsive.");
|
||||
}
|
||||
|
||||
// Enable the display
|
||||
|
@ -210,7 +189,7 @@ void ra8875_init(void)
|
|||
|
||||
void ra8875_enable_display(bool enable)
|
||||
{
|
||||
LV_LOG_INFO("%s display.", enable ? "Enabling" : "Disabling");
|
||||
ESP_LOGI(TAG, "%s display.", enable ? "Enabling" : "Disabling");
|
||||
uint8_t val = enable ? (0x80) : (0x00);
|
||||
ra8875_write_cmd(RA8875_REG_PWRR, val); // Power and Display Control Register (PWRR)
|
||||
}
|
||||
|
@ -226,14 +205,18 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo
|
|||
size_t linelen = (area->x2 - area->x1 + 1);
|
||||
uint8_t * buffer = (uint8_t*)color_map;
|
||||
|
||||
LV_LOG_INFO("flush: %d,%d at %d,%d", area->x1, area->x2, area->y1, area->y2 );
|
||||
#if DEBUG
|
||||
ESP_LOGI(TAG, "flush: %d,%d at %d,%d", area->x1, area->x2, area->y1, area->y2 );
|
||||
#endif
|
||||
|
||||
// Get lock
|
||||
disp_spi_acquire();
|
||||
|
||||
// Set window if needed
|
||||
if ((x1 != area->x1) || (x2 != area->x2)) {
|
||||
LV_LOG_INFO("flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2);
|
||||
#if DEBUG
|
||||
ESP_LOGI(TAG, "flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2);
|
||||
#endif
|
||||
ra8875_set_window(area->x1, area->x2, 0, LV_VER_RES_MAX-1);
|
||||
x1 = area->x1;
|
||||
x2 = area->x2;
|
||||
|
@ -241,7 +224,9 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo
|
|||
|
||||
// Set cursor if needed
|
||||
if ((x != area->x1) || (y != area->y1)) {
|
||||
LV_LOG_INFO("flush: set cursor (x,y): %d,%d -> %d,%d", x, y, area->x1, area->y1);
|
||||
#if DEBUG
|
||||
ESP_LOGI(TAG, "flush: set cursor (x,y): %d,%d -> %d,%d", x, y, area->x1, area->y1);
|
||||
#endif
|
||||
ra8875_set_memory_write_cursor(area->x1, area->y1);
|
||||
x = area->x1;
|
||||
}
|
||||
|
|
27
lvgl_tft/schmitt.c
Normal file
27
lvgl_tft/schmitt.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#include "schmitt.h"
|
||||
#include "disp_spi.h"
|
||||
|
||||
#include "esp_log.h"
|
||||
|
||||
static const char* TAG = "SCHMITT_DIS";
|
||||
|
||||
void schmitt_init(void)
|
||||
{
|
||||
disp_spi_acquire();
|
||||
// Do things
|
||||
ESP_LOGI(TAG, "schmitt_init() called");
|
||||
disp_spi_release();
|
||||
}
|
||||
|
||||
void schmitt_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
|
||||
{
|
||||
disp_spi_acquire();
|
||||
// Do things
|
||||
uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);
|
||||
disp_spi_send_colors(color_map, size * 4);
|
||||
ESP_LOGI(TAG, "schmitt_flush() called");
|
||||
disp_spi_release();
|
||||
lv_disp_flush_ready(drv);
|
||||
}
|
20
lvgl_tft/schmitt.h
Normal file
20
lvgl_tft/schmitt.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
#ifndef SCHMITT_H_
|
||||
#define SCHMITT_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
#include "../lvgl_helpers.h"
|
||||
|
||||
#define LV_HOR_RES_MAX 64
|
||||
#define LV_VER_RES_MAX 64
|
||||
|
||||
void schmitt_init(void);
|
||||
|
||||
void schmitt_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
||||
|
||||
#endif /* SCHMITT_H_ */
|
|
@ -16,6 +16,7 @@
|
|||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "SH1107"
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
|
|
@ -15,13 +15,18 @@
|
|||
*********************/
|
||||
#include "assert.h"
|
||||
|
||||
#include "lvgl_i2c/i2c_manager.h"
|
||||
|
||||
#include "ssd1306.h"
|
||||
#include "display_port.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "SSD1306"
|
||||
|
||||
#define OLED_I2C_PORT (CONFIG_LV_I2C_DISPLAY_PORT)
|
||||
// SLA (0x3C) + WRITE_MODE (0x00) = 0x78 (0b01111000)
|
||||
#define OLED_I2C_ADDRESS 0x3C
|
||||
#define OLED_WIDTH 128
|
||||
#define OLED_HEIGHT 64
|
||||
#define OLED_COLUMNS 128
|
||||
|
@ -72,6 +77,8 @@
|
|||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static uint8_t send_data(lv_disp_drv_t *disp_drv, void *bytes, size_t bytes_len);
|
||||
static uint8_t send_pixels(lv_disp_drv_t *disp_drv, void *color_buffer, size_t buffer_len);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
|
@ -87,7 +94,7 @@
|
|||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
void ssd1306_init(lv_disp_drv_t *disp_drv)
|
||||
void ssd1306_init(void)
|
||||
{
|
||||
uint8_t orientation_1 = 0;
|
||||
uint8_t orientation_2 = 0;
|
||||
|
@ -99,7 +106,7 @@ void ssd1306_init(lv_disp_drv_t *disp_drv)
|
|||
orientation_1 = 0xA0;
|
||||
orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_NORMAL;
|
||||
#else
|
||||
assert(false); // Invalid configuration of SSD1306 driver
|
||||
#error "Unsupported orientation"
|
||||
#endif
|
||||
|
||||
uint8_t display_mode = 0;
|
||||
|
@ -122,7 +129,8 @@ void ssd1306_init(lv_disp_drv_t *disp_drv)
|
|||
OLED_CMD_DISPLAY_ON
|
||||
};
|
||||
|
||||
display_interface_send_cmd(disp_drv, OLED_CONTROL_BYTE_CMD_STREAM, &conf[1], sizeof(conf) - 1);
|
||||
uint8_t err = send_data(NULL, conf, sizeof(conf));
|
||||
assert(0 == err);
|
||||
}
|
||||
|
||||
void ssd1306_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,
|
||||
|
@ -156,8 +164,10 @@ void ssd1306_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t
|
|||
row2,
|
||||
};
|
||||
|
||||
display_interface_send_cmd(disp_drv, OLED_CONTROL_BYTE_CMD_STREAM, &conf[1], sizeof(conf) - 1);
|
||||
display_interface_send_data(disp_drv, color_p, OLED_COLUMNS * (1 + row2 - row1));
|
||||
uint8_t err = send_data(disp_drv, conf, sizeof(conf));
|
||||
assert(0 == err);
|
||||
err = send_pixels(disp_drv, color_p, OLED_COLUMNS * (1 + row2 - row1));
|
||||
assert(0 == err);
|
||||
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
}
|
||||
|
@ -180,7 +190,8 @@ void ssd1306_sleep_in(void)
|
|||
OLED_CMD_DISPLAY_OFF
|
||||
};
|
||||
|
||||
display_interface_send_cmd(NULL, OLED_CONTROL_BYTE_CMD_STREAM, &conf[1], 1);
|
||||
uint8_t err = send_data(NULL, conf, sizeof(conf));
|
||||
assert(0 == err);
|
||||
}
|
||||
|
||||
void ssd1306_sleep_out(void)
|
||||
|
@ -190,5 +201,25 @@ void ssd1306_sleep_out(void)
|
|||
OLED_CMD_DISPLAY_ON
|
||||
};
|
||||
|
||||
display_interface_send_cmd(NULL, OLED_CONTROL_BYTE_CMD_STREAM, &conf[1], 1);
|
||||
uint8_t err = send_data(NULL, conf, sizeof(conf));
|
||||
assert(0 == err);
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
static uint8_t send_data(lv_disp_drv_t *disp_drv, void *bytes, size_t bytes_len)
|
||||
{
|
||||
(void) disp_drv;
|
||||
|
||||
uint8_t *data = (uint8_t *) bytes;
|
||||
|
||||
return lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, data[0], data + 1, bytes_len - 1 );
|
||||
}
|
||||
|
||||
static uint8_t send_pixels(lv_disp_drv_t *disp_drv, void *color_buffer, size_t buffer_len)
|
||||
{
|
||||
(void) disp_drv;
|
||||
|
||||
return lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, OLED_CONTROL_BYTE_DATA_STREAM, color_buffer, buffer_len);
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ extern "C" {
|
|||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void ssd1306_init(lv_disp_drv_t *disp_drv);
|
||||
void ssd1306_init(void);
|
||||
void ssd1306_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
|
||||
void ssd1306_rounder(lv_disp_drv_t * disp_drv, lv_area_t *area);
|
||||
void ssd1306_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,
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "st7735s.h"
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
|
@ -19,6 +20,7 @@
|
|||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "ST7735S"
|
||||
#define AXP192_I2C_ADDRESS 0x34
|
||||
|
||||
/**********************
|
||||
|
@ -39,13 +41,10 @@ static void st7735s_send_cmd(uint8_t cmd);
|
|||
static void st7735s_send_data(void * data, uint16_t length);
|
||||
static void st7735s_send_color(void * data, uint16_t length);
|
||||
static void st7735s_set_orientation(uint8_t orientation);
|
||||
|
||||
#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192
|
||||
static void axp192_write_byte(uint8_t addr, uint8_t data);
|
||||
static void axp192_init();
|
||||
static void axp192_sleep_in();
|
||||
static void axp192_sleep_out();
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
|
@ -113,7 +112,7 @@ void st7735s_init(void)
|
|||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("ST7735S initialization.");
|
||||
ESP_LOGI(TAG, "ST7735S initialization.");
|
||||
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
|
@ -209,7 +208,7 @@ static void st7735s_set_orientation(uint8_t orientation)
|
|||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"
|
||||
};
|
||||
|
||||
LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]);
|
||||
ESP_LOGD(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
/*
|
||||
Portrait: 0xC8 = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_BGR
|
||||
|
@ -218,7 +217,7 @@ static void st7735s_set_orientation(uint8_t orientation)
|
|||
*/
|
||||
uint8_t data[] = {0xC8, 0xC8, 0xA8, 0xA8};
|
||||
|
||||
LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]);
|
||||
ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]);
|
||||
|
||||
st7735s_send_cmd(ST7735_MADCTL);
|
||||
st7735s_send_data((void *) &data[orientation], 1);
|
||||
|
@ -226,33 +225,33 @@ static void st7735s_set_orientation(uint8_t orientation)
|
|||
|
||||
#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192
|
||||
|
||||
static void axp192_write_byte(uint8_t addr, uint8_t data)
|
||||
{
|
||||
err = lvgl_i2c_write(CONFIG_LV_I2C_DISPLAY_PORT, AXP192_I2C_ADDRESS, addr, &data, 1);
|
||||
if (ret != ESP_OK) {
|
||||
LV_LOG_ERROR("AXP192 send failed. code: 0x%.2X", ret);
|
||||
static void axp192_write_byte(uint8_t addr, uint8_t data)
|
||||
{
|
||||
err = lvgl_i2c_write(CONFIG_LV_I2C_DISPLAY_PORT, AXP192_I2C_ADDRESS, addr, &data, 1);
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "AXP192 send failed. code: 0x%.2X", ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void axp192_init()
|
||||
{
|
||||
// information on how to init and use AXP192 ifor M5StickC taken from
|
||||
// https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely
|
||||
static void axp192_init()
|
||||
{
|
||||
// information on how to init and use AXP192 ifor M5StickC taken from
|
||||
// https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely
|
||||
|
||||
axp192_write_byte(0x10, 0xFF); // OLED_VPP Enable
|
||||
axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V
|
||||
axp192_sleep_out();
|
||||
LV_LOG_INFO("AXP192 initialized, power enabled for LDO2 and LDO3");
|
||||
}
|
||||
axp192_write_byte(0x10, 0xFF); // OLED_VPP Enable
|
||||
axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V
|
||||
axp192_sleep_out();
|
||||
ESP_LOGI(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3");
|
||||
}
|
||||
|
||||
static void axp192_sleep_in()
|
||||
{
|
||||
axp192_write_byte(0x12, 0x4b);
|
||||
}
|
||||
static void axp192_sleep_in()
|
||||
{
|
||||
axp192_write_byte(0x12, 0x4b);
|
||||
}
|
||||
|
||||
static void axp192_sleep_out()
|
||||
{
|
||||
axp192_write_byte(0x12, 0x4d);
|
||||
}
|
||||
static void axp192_sleep_out()
|
||||
{
|
||||
axp192_write_byte(0x12, 0x4d);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -4,15 +4,21 @@
|
|||
* Mostly taken from lbthomsen/esp-idf-littlevgl github.
|
||||
*/
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#include "esp_log.h"
|
||||
|
||||
#include "st7789.h"
|
||||
|
||||
#include "disp_spi.h"
|
||||
#include "display_port.h"
|
||||
#include "driver/gpio.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
#define TAG "st7789"
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
@ -27,13 +33,10 @@ typedef struct {
|
|||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation);
|
||||
static void st7789_set_orientation(uint8_t orientation);
|
||||
|
||||
static void st7789_send_cmd(lv_disp_drv_t * drv, uint8_t cmd);
|
||||
static void st7789_send_data(lv_disp_drv_t * drv, void *data, uint16_t length);
|
||||
static void st7789_send_color(lv_disp_drv_t * drv, void *data, uint16_t length);
|
||||
static void st7789_send_color(void *data, size_t length);
|
||||
|
||||
static void st7789_reset(lv_disp_drv_t * drv);
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
@ -45,7 +48,7 @@ static void st7789_reset(lv_disp_drv_t * drv);
|
|||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
void st7789_init(lv_disp_drv_t *drv)
|
||||
void st7789_init(void)
|
||||
{
|
||||
lcd_init_cmd_t st7789_init_cmds[] = {
|
||||
{0xCF, {0x00, 0x83, 0X30}, 3},
|
||||
|
@ -82,26 +85,44 @@ void st7789_init(lv_disp_drv_t *drv)
|
|||
{0, {0}, 0xff},
|
||||
};
|
||||
|
||||
st7789_reset(drv);
|
||||
//Initialize non-SPI GPIOs
|
||||
gpio_pad_select_gpio(ST7789_DC);
|
||||
gpio_set_direction(ST7789_DC, GPIO_MODE_OUTPUT);
|
||||
|
||||
#if !defined(ST7789_SOFT_RST)
|
||||
gpio_pad_select_gpio(ST7789_RST);
|
||||
gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT);
|
||||
#endif
|
||||
|
||||
//Reset the display
|
||||
#if !defined(ST7789_SOFT_RST)
|
||||
gpio_set_level(ST7789_RST, 0);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
gpio_set_level(ST7789_RST, 1);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
#else
|
||||
st7789_send_cmd(ST7789_SWRESET);
|
||||
#endif
|
||||
|
||||
printf("ST7789 initialization.\n");
|
||||
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
while (st7789_init_cmds[cmd].databytes!=0xff) {
|
||||
st7789_send_cmd(drv, st7789_init_cmds[cmd].cmd);
|
||||
st7789_send_data(drv, st7789_init_cmds[cmd].data, st7789_init_cmds[cmd].databytes&0x1F);
|
||||
st7789_send_cmd(st7789_init_cmds[cmd].cmd);
|
||||
st7789_send_data(st7789_init_cmds[cmd].data, st7789_init_cmds[cmd].databytes&0x1F);
|
||||
if (st7789_init_cmds[cmd].databytes & 0x80) {
|
||||
display_port_delay(drv, 100);
|
||||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
}
|
||||
cmd++;
|
||||
}
|
||||
|
||||
/* FIXME We're setting up the initial orientation in the cmd array */
|
||||
st7789_set_orientation(drv, ST7789_INITIAL_ORIENTATION);
|
||||
st7789_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION);
|
||||
}
|
||||
|
||||
/* The ST7789 display controller can drive 320*240 displays, when using a 240*240
|
||||
* display there's a gap of 80px, we need to edit the coordinates to take into
|
||||
* account that gap, this is not necessary in all orientations. */
|
||||
/* The ST7789 display controller can drive up to 320*240 displays, when using a 240*240 or 240*135
|
||||
* displays there's a gap of 80px or 40/52/53px respectively. 52px or 53x offset depends on display orientation.
|
||||
* We need to edit the coordinates to take into account those gaps, this is not necessary in all orientations. */
|
||||
void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
|
||||
{
|
||||
uint8_t data[4] = {0};
|
||||
|
@ -110,7 +131,6 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo
|
|||
uint16_t offsetx2 = area->x2;
|
||||
uint16_t offsety1 = area->y1;
|
||||
uint16_t offsety2 = area->y2;
|
||||
uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);
|
||||
|
||||
#if (CONFIG_LV_TFT_DISPLAY_OFFSETS)
|
||||
offsetx1 += CONFIG_LV_TFT_DISPLAY_X_OFFSET;
|
||||
|
@ -119,76 +139,90 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo
|
|||
offsety2 += CONFIG_LV_TFT_DISPLAY_Y_OFFSET;
|
||||
|
||||
#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240)
|
||||
#if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT)
|
||||
offsetx1 += 80;
|
||||
offsetx2 += 80;
|
||||
#elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED)
|
||||
offsety1 += 80;
|
||||
offsety2 += 80;
|
||||
#endif
|
||||
#if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT)
|
||||
offsetx1 += 80;
|
||||
offsetx2 += 80;
|
||||
#elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED)
|
||||
offsety1 += 80;
|
||||
offsety2 += 80;
|
||||
#endif
|
||||
#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 135)
|
||||
#if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) || \
|
||||
(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED)
|
||||
offsetx1 += 40;
|
||||
offsetx2 += 40;
|
||||
offsety1 += 53;
|
||||
offsety2 += 53;
|
||||
#endif
|
||||
#elif (LV_HOR_RES_MAX == 135) && (LV_VER_RES_MAX == 240)
|
||||
#if (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE) || \
|
||||
(CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED)
|
||||
offsetx1 += 52;
|
||||
offsetx2 += 52;
|
||||
offsety1 += 40;
|
||||
offsety2 += 40;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*Column addresses*/
|
||||
st7789_send_cmd(drv, ST7789_CASET);
|
||||
st7789_send_cmd(ST7789_CASET);
|
||||
data[0] = (offsetx1 >> 8) & 0xFF;
|
||||
data[1] = offsetx1 & 0xFF;
|
||||
data[2] = (offsetx2 >> 8) & 0xFF;
|
||||
data[3] = offsetx2 & 0xFF;
|
||||
st7789_send_data(drv, data, 4);
|
||||
st7789_send_data(data, 4);
|
||||
|
||||
/*Page addresses*/
|
||||
st7789_send_cmd(drv, ST7789_RASET);
|
||||
st7789_send_cmd(ST7789_RASET);
|
||||
data[0] = (offsety1 >> 8) & 0xFF;
|
||||
data[1] = offsety1 & 0xFF;
|
||||
data[2] = (offsety2 >> 8) & 0xFF;
|
||||
data[3] = offsety2 & 0xFF;
|
||||
st7789_send_data(drv, data, 4);
|
||||
st7789_send_data(data, 4);
|
||||
|
||||
/*Memory write*/
|
||||
st7789_send_cmd(drv, ST7789_RAMWR);
|
||||
st7789_send_color(drv, (void*) color_map, size * 2);
|
||||
st7789_send_cmd(ST7789_RAMWR);
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
static void st7789_send_cmd(lv_disp_drv_t *drv, uint8_t cmd)
|
||||
void st7789_send_cmd(uint8_t cmd)
|
||||
{
|
||||
disp_wait_for_pending_transactions();
|
||||
display_port_gpio_dc(drv, 0);
|
||||
gpio_set_level(ST7789_DC, 0);
|
||||
disp_spi_send_data(&cmd, 1);
|
||||
}
|
||||
|
||||
static void st7789_send_data(lv_disp_drv_t *drv, void * data, uint16_t length)
|
||||
void st7789_send_data(void * data, uint16_t length)
|
||||
{
|
||||
disp_wait_for_pending_transactions();
|
||||
display_port_gpio_dc(drv, 1);
|
||||
gpio_set_level(ST7789_DC, 1);
|
||||
disp_spi_send_data(data, length);
|
||||
}
|
||||
|
||||
static void st7789_send_color(lv_disp_drv_t *drv, void * data, uint16_t length)
|
||||
static void st7789_send_color(void * data, size_t length)
|
||||
{
|
||||
disp_wait_for_pending_transactions();
|
||||
display_port_gpio_dc(drv, 1);
|
||||
gpio_set_level(ST7789_DC, 1);
|
||||
disp_spi_send_colors(data, length);
|
||||
}
|
||||
|
||||
/* Reset the display, if we don't have a reset pin we use software reset */
|
||||
static void st7789_reset(lv_disp_drv_t *drv)
|
||||
static void st7789_set_orientation(uint8_t orientation)
|
||||
{
|
||||
#if !defined(ST7789_SOFT_RST)
|
||||
display_port_gpio_rst(drv, 0);
|
||||
display_port_delay(drv, 100);
|
||||
display_port_gpio_rst(drv, 1);
|
||||
display_port_delay(drv, 100);
|
||||
#else
|
||||
st7789_send_cmd(drv, ST7789_SWRESET);
|
||||
display_port_delay(drv, 5);
|
||||
#endif
|
||||
}
|
||||
// ESP_ASSERT(orientation < 4);
|
||||
|
||||
const char *orientation_str[] = {
|
||||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"
|
||||
};
|
||||
|
||||
ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation)
|
||||
{
|
||||
uint8_t data[] =
|
||||
{
|
||||
#if CONFIG_LV_PREDEFINED_DISPLAY_TTGO
|
||||
|
@ -198,13 +232,8 @@ static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation)
|
|||
#endif
|
||||
};
|
||||
|
||||
st7789_send_cmd(drv, ST7789_MADCTL);
|
||||
st7789_send_data(drv, (void *) &data[orientation], 1);
|
||||
}
|
||||
ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]);
|
||||
|
||||
/* Display update callback, we could update the orientation in here
|
||||
* NOTE Available only for LVGL v8 */
|
||||
void st7789_update_cb(lv_disp_drv_t *drv)
|
||||
{
|
||||
(void) drv;
|
||||
st7789_send_cmd(ST7789_MADCTL);
|
||||
st7789_send_data((void *) &data[orientation], 1);
|
||||
}
|
||||
|
|
|
@ -17,11 +17,22 @@ extern "C"
|
|||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
#include "../lvgl_helpers.h"
|
||||
|
||||
/* For SPI transfers */
|
||||
#include "lvgl_helpers.h"
|
||||
/* For ST7789 particular configurations */
|
||||
#include "display_config.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#define ST7789_DC CONFIG_LV_DISP_PIN_DC
|
||||
#define ST7789_RST CONFIG_LV_DISP_PIN_RST
|
||||
|
||||
#if CONFIG_LV_DISP_USE_RST
|
||||
#if CONFIG_LV_DISP_ST7789_SOFT_RESET
|
||||
#define ST7789_SOFT_RST
|
||||
#endif
|
||||
#else
|
||||
#define ST7789_SOFT_RST
|
||||
#endif
|
||||
|
||||
#define ST7789_INVERT_COLORS CONFIG_LV_INVERT_COLORS
|
||||
|
||||
/* ST7789 commands */
|
||||
#define ST7789_NOP 0x00
|
||||
|
@ -99,28 +110,11 @@ extern "C"
|
|||
#define ST7789_NVMSET 0xFC // NVM setting
|
||||
#define ST7789_PROMACT 0xFE // Program action
|
||||
|
||||
/**
|
||||
* Initialize the ST7789 display controller with default configuration
|
||||
*
|
||||
* @param drv Pointer to lv_disp_drv_t being used
|
||||
*/
|
||||
void st7789_init(lv_disp_drv_t *drv);
|
||||
|
||||
/**
|
||||
* Send buffer content to display
|
||||
*
|
||||
* @param drv Pointer to lv_disp_drv_t being used
|
||||
* @param area Pointer to area to be sent
|
||||
* @param color_map Pointer to color map
|
||||
*/
|
||||
void st7789_init(void);
|
||||
void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
|
||||
|
||||
/**
|
||||
* Display updated callback
|
||||
*
|
||||
* @param drv Pointer to lv_disp_drv_t being used
|
||||
*/
|
||||
void st7789_update_cb(lv_disp_drv_t *drv);
|
||||
void st7789_send_cmd(uint8_t cmd);
|
||||
void st7789_send_data(void *data, uint16_t length);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
|
|
|
@ -9,12 +9,14 @@
|
|||
#include "st7796s.h"
|
||||
#include "disp_spi.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "ST7796S"
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
@ -94,7 +96,7 @@ void st7796s_init(void)
|
|||
vTaskDelay(100 / portTICK_RATE_MS);
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("Initialization.");
|
||||
ESP_LOGI(TAG, "Initialization.");
|
||||
|
||||
//Send all the commands
|
||||
uint16_t cmd = 0;
|
||||
|
@ -187,24 +189,24 @@ static void st7796s_send_color(void *data, uint16_t length)
|
|||
|
||||
static void st7796s_set_orientation(uint8_t orientation)
|
||||
{
|
||||
assert(orientation < 4);
|
||||
// ESP_ASSERT(orientation < 4);
|
||||
|
||||
const char *orientation_str[] = {
|
||||
"PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"};
|
||||
|
||||
LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]);
|
||||
ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]);
|
||||
|
||||
#if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK
|
||||
const uint8_t data[] = {0x68, 0x68, 0x08, 0x08};
|
||||
uint8_t data[] = {0x68, 0x68, 0x08, 0x08};
|
||||
#elif defined(CONFIG_LV_PREDEFINED_DISPLAY_WROVER4)
|
||||
const uint8_t data[] = {0x4C, 0x88, 0x28, 0xE8};
|
||||
uint8_t data[] = {0x4C, 0x88, 0x28, 0xE8};
|
||||
#elif defined(CONFIG_LV_PREDEFINED_DISPLAY_WT32_SC01)
|
||||
const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
#else
|
||||
const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
#elif defined(CONFIG_LV_PREDEFINED_DISPLAY_NONE)
|
||||
uint8_t data[] = {0x48, 0x88, 0x28, 0xE8};
|
||||
#endif
|
||||
|
||||
LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]);
|
||||
ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]);
|
||||
|
||||
st7796s_send_cmd(0x36);
|
||||
st7796s_send_data((void *)&data[orientation], 1);
|
||||
|
|
|
@ -29,19 +29,18 @@
|
|||
#include <freertos/task.h>
|
||||
#include <freertos/event_groups.h>
|
||||
#include <driver/gpio.h>
|
||||
#include <esp_log.h>
|
||||
|
||||
#include "disp_spi.h"
|
||||
#include "disp_driver.h"
|
||||
#include "uc8151d.h"
|
||||
|
||||
#define TAG "lv_uc8151d"
|
||||
|
||||
#define PIN_DC CONFIG_LV_DISP_PIN_DC
|
||||
#define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_DC)))
|
||||
|
||||
#if defined CONFIG_LV_DISP_PIN_RST
|
||||
#define PIN_RST CONFIG_LV_DISP_PIN_RST
|
||||
#define PIN_RST_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_RST)))
|
||||
#endif
|
||||
|
||||
#define PIN_BUSY CONFIG_LV_DISP_PIN_BUSY
|
||||
#define PIN_BUSY_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_BUSY)))
|
||||
#define EVT_BUSY (1UL << 0UL)
|
||||
|
@ -103,7 +102,7 @@ static void uc8151d_spi_send_fb(uint8_t *data, size_t len)
|
|||
|
||||
static void uc8151d_spi_send_seq(const uc8151d_seq_t *seq, size_t len)
|
||||
{
|
||||
LV_LOG_INFO("Writing cmd/data sequence, count %u", len);
|
||||
ESP_LOGD(TAG, "Writing cmd/data sequence, count %u", len);
|
||||
|
||||
if (!seq || len < 1) return;
|
||||
for (size_t cmd_idx = 0; cmd_idx < len; cmd_idx++) {
|
||||
|
@ -140,13 +139,14 @@ static void uc8151d_sleep()
|
|||
uc8151d_spi_send_data_byte(0xa5);
|
||||
}
|
||||
|
||||
static void uc8151d_reset(void);
|
||||
|
||||
static void uc8151d_panel_init()
|
||||
{
|
||||
// Hardware reset for 3 times - not sure why but it's from official demo code
|
||||
for (uint8_t cnt = 0; cnt < 3; cnt++) {
|
||||
uc8151d_reset();
|
||||
gpio_set_level(PIN_RST, 0);
|
||||
vTaskDelay(pdMS_TO_TICKS(10)); // At least 10ms, leave 20ms for now just in case...
|
||||
gpio_set_level(PIN_RST, 1);
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
}
|
||||
|
||||
// Power up
|
||||
|
@ -198,14 +198,14 @@ void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *
|
|||
{
|
||||
size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8;
|
||||
|
||||
LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2);
|
||||
LV_LOG_INFO("Writing LVGL fb with len: %u", len);
|
||||
ESP_LOGD(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2);
|
||||
ESP_LOGD(TAG, "Writing LVGL fb with len: %u", len);
|
||||
|
||||
uint8_t *buf = (uint8_t *) color_map;
|
||||
uc8151d_full_update(buf);
|
||||
|
||||
lv_disp_flush_ready(drv);
|
||||
LV_LOG_INFO("Ready");
|
||||
ESP_LOGD(TAG, "Ready");
|
||||
}
|
||||
|
||||
void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
|
||||
|
@ -217,7 +217,7 @@ void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t
|
|||
if (color.full) {
|
||||
BIT_SET(buf[byte_index], 7 - bit_index);
|
||||
} else {
|
||||
LV_LOG_INFO("Clear at x: %u, y: %u", x, y);
|
||||
ESP_LOGD(TAG, "Clear at x: %u, y: %u", x, y);
|
||||
BIT_CLEAR(buf[byte_index], 7 - bit_index);
|
||||
}
|
||||
}
|
||||
|
@ -236,10 +236,20 @@ void uc8151d_init()
|
|||
// Initialise event group
|
||||
uc8151d_evts = xEventGroupCreate();
|
||||
if (!uc8151d_evts) {
|
||||
LV_LOG_ERROR("Failed when initialising event group!");
|
||||
ESP_LOGE(TAG, "Failed when initialising event group!");
|
||||
return;
|
||||
}
|
||||
|
||||
// Setup output pins, output (PP)
|
||||
gpio_config_t out_io_conf = {
|
||||
.intr_type = GPIO_INTR_DISABLE,
|
||||
.mode = GPIO_MODE_OUTPUT,
|
||||
.pin_bit_mask = PIN_DC_BIT | PIN_RST_BIT,
|
||||
.pull_down_en = 0,
|
||||
.pull_up_en = 0,
|
||||
};
|
||||
ESP_ERROR_CHECK(gpio_config(&out_io_conf));
|
||||
|
||||
// Setup input pin, pull-up, input
|
||||
gpio_config_t in_io_conf = {
|
||||
.intr_type = GPIO_INTR_POSEDGE,
|
||||
|
@ -252,18 +262,7 @@ void uc8151d_init()
|
|||
gpio_install_isr_service(0);
|
||||
gpio_isr_handler_add(PIN_BUSY, uc8151d_busy_intr, (void *) PIN_BUSY);
|
||||
|
||||
LV_LOG_INFO("IO init finished");
|
||||
ESP_LOGI(TAG, "IO init finished");
|
||||
uc8151d_panel_init();
|
||||
LV_LOG_INFO("Panel initialised");
|
||||
}
|
||||
|
||||
static void uc8151d_reset(void)
|
||||
{
|
||||
#if defined CONFIG_LV_DISP_USE_RST
|
||||
gpio_set_level(PIN_RST, 0);
|
||||
// At least 10ms, leave 20ms for now just in case...
|
||||
vTaskDelay(pdMS_TO_TICKS(20));
|
||||
gpio_set_level(PIN_RST, 1);
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
#endif
|
||||
ESP_LOGI(TAG, "Panel initialised");
|
||||
}
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
menu "LVGL Touch controller"
|
||||
|
||||
config LV_TOUCH_CONTROLLER
|
||||
int
|
||||
default 0 if LV_TOUCH_CONTROLLER_NONE
|
||||
default 1 if LV_TOUCH_CONTROLLER_XPT2046
|
||||
default 2 if LV_TOUCH_CONTROLLER_FT6X06
|
||||
default 3 if LV_TOUCH_CONTROLLER_STMPE610
|
||||
int
|
||||
default 0 if LV_TOUCH_CONTROLLER_NONE
|
||||
default 1 if LV_TOUCH_CONTROLLER_XPT2046
|
||||
default 2 if LV_TOUCH_CONTROLLER_FT6X06
|
||||
default 3 if LV_TOUCH_CONTROLLER_STMPE610
|
||||
default 4 if LV_TOUCH_CONTROLLER_ADCRAW
|
||||
default 5 if LV_TOUCH_CONTROLLER_FT81X
|
||||
default 6 if LV_TOUCH_CONTROLLER_RA8875
|
||||
default 7 if LV_TOUCH_CONTROLLER_GT911
|
||||
|
||||
choice
|
||||
prompt "Select a touch panel controller model."
|
||||
default LV_TOUCH_CONTROLLER_NONE
|
||||
help
|
||||
Select the controller for your touch panel.
|
||||
prompt "Select a touch panel controller model."
|
||||
default LV_TOUCH_CONTROLLER_NONE
|
||||
help
|
||||
Select the controller for your touch panel.
|
||||
|
||||
config LV_TOUCH_CONTROLLER_NONE
|
||||
bool "None"
|
||||
config LV_TOUCH_CONTROLLER_XPT2046
|
||||
config LV_TOUCH_CONTROLLER_NONE
|
||||
bool "None"
|
||||
config LV_TOUCH_CONTROLLER_XPT2046
|
||||
select LV_TOUCH_DRIVER_PROTOCOL_SPI
|
||||
bool "XPT2046"
|
||||
config LV_TOUCH_CONTROLLER_FT6X06
|
||||
config LV_TOUCH_CONTROLLER_FT6X06
|
||||
select LV_I2C_TOUCH
|
||||
bool "FT6X06"
|
||||
config LV_TOUCH_CONTROLLER_STMPE610
|
||||
|
@ -61,23 +61,20 @@ menu "LVGL Touch controller"
|
|||
bool
|
||||
help
|
||||
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 Controller SPI Bus."
|
||||
depends on LV_TOUCH_DRIVER_PROTOCOL_SPI
|
||||
|
||||
default LV_TOUCH_CONTROLLER_SPI_VSPI if !IDF_TARGET_ESP32S2
|
||||
default LV_TOUCH_CONTROLLER_SPI_FSPI if IDF_TARGET_ESP32S2
|
||||
default LV_TOUCH_CONTROLLER_SPI2_HOST
|
||||
help
|
||||
Select the SPI Bus the TFT Display is attached to.
|
||||
Select the SPI Bus the touch controller is attached to.
|
||||
|
||||
config LV_TOUCH_CONTROLLER_SPI_HSPI
|
||||
bool "HSPI"
|
||||
config LV_TOUCH_CONTROLLER_SPI_VSPI
|
||||
bool "VSPI" if !IDF_TARGET_ESP32S2
|
||||
config LV_TOUCH_CONTROLLER_SPI_FSPI
|
||||
bool "FSPI" if IDF_TARGET_ESP32S2
|
||||
config LV_TOUCH_CONTROLLER_SPI2_HOST
|
||||
bool "SPI2_HOST"
|
||||
config LV_TOUCH_CONTROLLER_SPI3_HOST
|
||||
bool "SPI3_HOST"
|
||||
endchoice
|
||||
|
||||
menu "Touchpanel (XPT2046) Pin Assignments"
|
||||
|
@ -86,7 +83,7 @@ menu "LVGL Touch controller"
|
|||
config LV_TOUCH_SPI_MISO
|
||||
int
|
||||
prompt "GPIO for MISO (Master In Slave Out)"
|
||||
|
||||
|
||||
default 35 if LV_PREDEFINED_PINS_38V1
|
||||
default 19
|
||||
help
|
||||
|
@ -103,7 +100,7 @@ menu "LVGL Touch controller"
|
|||
|
||||
config LV_TOUCH_SPI_CLK
|
||||
int "GPIO for CLK (SCK / Serial Clock)"
|
||||
|
||||
|
||||
default 26 if LV_PREDEFINED_PINS_38V1
|
||||
default 18
|
||||
help
|
||||
|
@ -119,7 +116,7 @@ menu "LVGL Touch controller"
|
|||
|
||||
config LV_TOUCH_PIN_IRQ
|
||||
int "GPIO for IRQ (Interrupt Request)"
|
||||
|
||||
|
||||
default 27 if LV_PREDEFINED_PINS_38V4
|
||||
default 25
|
||||
help
|
||||
|
@ -153,10 +150,10 @@ menu "LVGL Touch controller"
|
|||
default 4095 if LV_PREDEFINED_PINS_38V4
|
||||
default 1900
|
||||
|
||||
config LV_TOUCH_XY_SWAP
|
||||
bool
|
||||
prompt "Swap XY."
|
||||
default y
|
||||
config LV_TOUCH_XY_SWAP
|
||||
bool
|
||||
prompt "Swap XY."
|
||||
default y
|
||||
|
||||
config LV_TOUCH_INVERT_X
|
||||
bool
|
||||
|
@ -216,7 +213,7 @@ menu "LVGL Touch controller"
|
|||
config LV_TOUCH_SPI_MISO
|
||||
int
|
||||
prompt "GPIO for MISO (Master In Slave Out)"
|
||||
|
||||
|
||||
default 35 if LV_PREDEFINED_PINS_38V1
|
||||
default 19 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING
|
||||
default 19
|
||||
|
@ -278,9 +275,9 @@ menu "LVGL Touch controller"
|
|||
default 3800
|
||||
|
||||
config LV_TOUCH_XY_SWAP
|
||||
bool
|
||||
prompt "Swap XY."
|
||||
default n
|
||||
bool
|
||||
prompt "Swap XY."
|
||||
default n
|
||||
|
||||
config LV_TOUCH_INVERT_X
|
||||
bool
|
||||
|
@ -379,25 +376,25 @@ menu "LVGL Touch controller"
|
|||
config LV_TOUCH_X_MIN
|
||||
int
|
||||
prompt "Minimum X coordinate ADC value"
|
||||
range 0 1023
|
||||
range 0 1023
|
||||
default 0
|
||||
|
||||
config LV_TOUCH_Y_MIN
|
||||
int
|
||||
prompt "Minimum Y coordinate ADC value"
|
||||
range 0 1023
|
||||
range 0 1023
|
||||
default 0
|
||||
|
||||
config LV_TOUCH_X_MAX
|
||||
int
|
||||
prompt "Maximum X coordinate ADC value"
|
||||
range 0 1023
|
||||
range 0 1023
|
||||
default 1023
|
||||
|
||||
config LV_TOUCH_Y_MAX
|
||||
int
|
||||
prompt "Maximum Y coordinate ADC value"
|
||||
range 0 1023
|
||||
range 0 1023
|
||||
default 1023
|
||||
|
||||
config LV_TOUCH_XY_SWAP
|
||||
|
@ -418,13 +415,13 @@ menu "LVGL Touch controller"
|
|||
config LV_TOUCH_RA8875_SAMPLE_TIME
|
||||
int
|
||||
prompt "TP Sample Time Adjusting"
|
||||
range 0 7
|
||||
range 0 7
|
||||
default 0
|
||||
|
||||
config LV_TOUCH_RA8875_ADC_CLOCK
|
||||
int
|
||||
prompt "ADC Clock Setting"
|
||||
range 0 7
|
||||
range 0 7
|
||||
default 0
|
||||
|
||||
config LV_TOUCH_RA8875_WAKEUP_ENABLE
|
||||
|
@ -447,10 +444,10 @@ menu "LVGL Touch controller"
|
|||
menu "Touchpanel Configuration (GT911)"
|
||||
depends on LV_TOUCH_CONTROLLER_GT911
|
||||
|
||||
config LV_GT911_SWAPXY
|
||||
bool
|
||||
prompt "Swap X with Y coordinate."
|
||||
default y
|
||||
config LV_GT911_SWAPXY
|
||||
bool
|
||||
prompt "Swap X with Y coordinate."
|
||||
default y
|
||||
|
||||
config LV_GT911_INVERT_X
|
||||
bool
|
||||
|
@ -472,14 +469,14 @@ menu "LVGL Touch controller"
|
|||
config LV_I2C_TOUCH_PORT_0
|
||||
bool
|
||||
prompt "I2C port 0"
|
||||
help
|
||||
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
|
||||
help
|
||||
I2C is shared peripheral managed by I2C Manager. In order to configure I2C Manager (pinout, etc.) see menu
|
||||
Component config->I2C Port Settings.
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#if CONFIG_LV_TOUCH_CONTROLLER_ADCRAW
|
||||
|
||||
#define TAG "ADCRAW"
|
||||
#define CALIBRATIONINSET 1 // range 0 <= CALIBRATIONINSET <= 40
|
||||
#define SAMPLE_CALIBRATION_POINTS 4
|
||||
// use this scale factor to avoid working in floating point numbers
|
||||
|
|
|
@ -18,24 +18,22 @@
|
|||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <esp_log.h>
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include <lvgl.h>
|
||||
#else
|
||||
#include <lvgl/lvgl.h>
|
||||
#endif
|
||||
|
||||
#include "ft6x36.h"
|
||||
#include "lvgl_i2c/i2c_manager.h"
|
||||
|
||||
#define TAG "FT6X36"
|
||||
#define FT6X36_TOUCH_QUEUE_ELEMENTS 1
|
||||
|
||||
static ft6x36_status_t ft6x36_status;
|
||||
/* Set during initialization */
|
||||
static uint8_t current_dev_addr;
|
||||
/* -1 coordinates to designate it was never touched */
|
||||
static ft6x36_touch_t touch_inputs = { -1, -1, LV_INDEV_STATE_REL };
|
||||
|
||||
static ft6x36_status_t ft6x36_status;
|
||||
static uint8_t current_dev_addr; // set during init
|
||||
static ft6x36_touch_t touch_inputs = { -1, -1, LV_INDEV_STATE_REL }; // -1 coordinates to designate it was never touched
|
||||
#if CONFIG_LV_FT6X36_COORDINATES_QUEUE
|
||||
QueueHandle_t ft6x36_touch_queue_handle;
|
||||
#endif
|
||||
|
@ -51,13 +49,13 @@ static esp_err_t ft6x06_i2c_read8(uint8_t slave_addr, uint8_t register_addr, uin
|
|||
*/
|
||||
uint8_t ft6x36_get_gesture_id() {
|
||||
if (!ft6x36_status.inited) {
|
||||
LV_LOG_ERROR("Init first!");
|
||||
ESP_LOGE(TAG, "Init first!");
|
||||
return 0x00;
|
||||
}
|
||||
uint8_t data_buf;
|
||||
esp_err_t ret;
|
||||
if ((ret = ft6x06_i2c_read8(current_dev_addr, FT6X36_GEST_ID_REG, &data_buf) != ESP_OK))
|
||||
LV_LOG_ERROR("Error reading from device: %s", esp_err_to_name(ret));
|
||||
ESP_LOGE(TAG, "Error reading from device: %s", esp_err_to_name(ret));
|
||||
return data_buf;
|
||||
}
|
||||
|
||||
|
@ -72,29 +70,29 @@ void ft6x06_init(uint16_t dev_addr) {
|
|||
current_dev_addr = dev_addr;
|
||||
uint8_t data_buf;
|
||||
esp_err_t ret;
|
||||
LV_LOG_INFO("Found touch panel controller");
|
||||
ESP_LOGI(TAG, "Found touch panel controller");
|
||||
if ((ret = ft6x06_i2c_read8(dev_addr, FT6X36_PANEL_ID_REG, &data_buf) != ESP_OK))
|
||||
LV_LOG_ERROR("Error reading from device: %s",
|
||||
ESP_LOGE(TAG, "Error reading from device: %s",
|
||||
esp_err_to_name(ret)); // Only show error the first time
|
||||
LV_LOG_INFO("\tDevice ID: 0x%02x", data_buf);
|
||||
ESP_LOGI(TAG, "\tDevice ID: 0x%02x", data_buf);
|
||||
|
||||
ft6x06_i2c_read8(dev_addr, FT6X36_CHIPSELECT_REG, &data_buf);
|
||||
LV_LOG_INFO("\tChip ID: 0x%02x", data_buf);
|
||||
ESP_LOGI(TAG, "\tChip ID: 0x%02x", data_buf);
|
||||
|
||||
ft6x06_i2c_read8(dev_addr, FT6X36_DEV_MODE_REG, &data_buf);
|
||||
LV_LOG_INFO("\tDevice mode: 0x%02x", data_buf);
|
||||
ESP_LOGI(TAG, "\tDevice mode: 0x%02x", data_buf);
|
||||
|
||||
ft6x06_i2c_read8(dev_addr, FT6X36_FIRMWARE_ID_REG, &data_buf);
|
||||
LV_LOG_INFO("\tFirmware ID: 0x%02x", data_buf);
|
||||
ESP_LOGI(TAG, "\tFirmware ID: 0x%02x", data_buf);
|
||||
|
||||
ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf);
|
||||
LV_LOG_INFO("\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 )
|
||||
{
|
||||
LV_LOG_ERROR("\tError creating touch input FreeRTOS queue" );
|
||||
ESP_LOGE( TAG, "\tError creating touch input FreeRTOS queue" );
|
||||
return;
|
||||
}
|
||||
xQueueSend( ft6x36_touch_queue_handle, &touch_inputs, 0 );
|
||||
|
@ -109,14 +107,14 @@ void ft6x06_init(uint16_t dev_addr) {
|
|||
*/
|
||||
bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
|
||||
if (!ft6x36_status.inited) {
|
||||
LV_LOG_ERROR("Init first!");
|
||||
ESP_LOGE(TAG, "Init first!");
|
||||
return 0x00;
|
||||
}
|
||||
uint8_t data_buf[5]; // 1 byte status, 2 bytes X, 2 bytes Y
|
||||
|
||||
esp_err_t ret = lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, current_dev_addr, FT6X36_TD_STAT_REG, &data_buf[0], 5);
|
||||
if (ret != ESP_OK) {
|
||||
LV_LOG_ERROR("Error talking to touch IC: %s", esp_err_to_name(ret));
|
||||
ESP_LOGE(TAG, "Error talking to touch IC: %s", esp_err_to_name(ret));
|
||||
}
|
||||
uint8_t touch_pnt_cnt = data_buf[0]; // Number of detected touch points
|
||||
|
||||
|
@ -152,7 +150,7 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
|
|||
data->point.x = touch_inputs.last_x;
|
||||
data->point.y = touch_inputs.last_y;
|
||||
data->state = touch_inputs.current_state;
|
||||
LV_LOG_INFO("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 );
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <esp_log.h>
|
||||
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
|
||||
#include <lvgl.h>
|
||||
#else
|
||||
|
@ -27,6 +28,8 @@
|
|||
|
||||
#include "lvgl_i2c/i2c_manager.h"
|
||||
|
||||
#define TAG "GT911"
|
||||
|
||||
gt911_status_t gt911_status;
|
||||
|
||||
//TODO: handle multibyte read and refactor to just one read transaction
|
||||
|
@ -50,9 +53,9 @@ void gt911_init(uint8_t dev_addr) {
|
|||
uint8_t data_buf;
|
||||
esp_err_t ret;
|
||||
|
||||
LV_LOG_INFO("Checking for GT911 Touch Controller");
|
||||
ESP_LOGI(TAG, "Checking for GT911 Touch Controller");
|
||||
if ((ret = gt911_i2c_read(dev_addr, GT911_PRODUCT_ID1, &data_buf, 1) != ESP_OK)) {
|
||||
LV_LOG_ERROR("Error reading from device: %s",
|
||||
ESP_LOGE(TAG, "Error reading from device: %s",
|
||||
esp_err_to_name(ret)); // Only show error the first time
|
||||
return;
|
||||
}
|
||||
|
@ -61,22 +64,22 @@ void gt911_init(uint8_t dev_addr) {
|
|||
for (int i = 0; i < GT911_PRODUCT_ID_LEN; i++) {
|
||||
gt911_i2c_read(dev_addr, (GT911_PRODUCT_ID1 + i), (uint8_t *)&(gt911_status.product_id[i]), 1);
|
||||
}
|
||||
LV_LOG_INFO("\tProduct ID: %s", gt911_status.product_id);
|
||||
ESP_LOGI(TAG, "\tProduct ID: %s", gt911_status.product_id);
|
||||
|
||||
gt911_i2c_read(dev_addr, GT911_VENDOR_ID, &data_buf, 1);
|
||||
LV_LOG_INFO("\tVendor ID: 0x%02x", data_buf);
|
||||
ESP_LOGI(TAG, "\tVendor ID: 0x%02x", data_buf);
|
||||
|
||||
gt911_i2c_read(dev_addr, GT911_X_COORD_RES_L, &data_buf, 1);
|
||||
gt911_status.max_x_coord = data_buf;
|
||||
gt911_i2c_read(dev_addr, GT911_X_COORD_RES_H, &data_buf, 1);
|
||||
gt911_status.max_x_coord |= ((uint16_t)data_buf << 8);
|
||||
LV_LOG_INFO("\tX Resolution: %d", gt911_status.max_x_coord);
|
||||
ESP_LOGI(TAG, "\tX Resolution: %d", gt911_status.max_x_coord);
|
||||
|
||||
gt911_i2c_read(dev_addr, GT911_Y_COORD_RES_L, &data_buf, 1);
|
||||
gt911_status.max_y_coord = data_buf;
|
||||
gt911_i2c_read(dev_addr, GT911_Y_COORD_RES_H, &data_buf, 1);
|
||||
gt911_status.max_y_coord |= ((uint16_t)data_buf << 8);
|
||||
LV_LOG_INFO("\tY Resolution: %d", gt911_status.max_y_coord);
|
||||
ESP_LOGI(TAG, "\tY Resolution: %d", gt911_status.max_y_coord);
|
||||
gt911_status.inited = true;
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +98,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
|
|||
uint8_t status_reg;
|
||||
|
||||
gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_STATUS_REG, &status_reg, 1);
|
||||
// LV_LOG_INFO("\tstatus: 0x%02x", status_reg);
|
||||
// ESP_LOGI(TAG, "\tstatus: 0x%02x", status_reg);
|
||||
touch_pnt_cnt = status_reg & 0x0F;
|
||||
if ((status_reg & 0x80) || (touch_pnt_cnt < 6)) {
|
||||
//Reset Status Reg Value
|
||||
|
@ -109,7 +112,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
|
|||
}
|
||||
|
||||
// gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_TRACK_ID1, &data_buf, 1);
|
||||
// LV_LOG_INFO("\ttrack_id: %d", data_buf);
|
||||
// ESP_LOGI(TAG, "\ttrack_id: %d", data_buf);
|
||||
|
||||
gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_PT1_X_COORD_L, &data_buf, 1);
|
||||
last_x = data_buf;
|
||||
|
@ -135,7 +138,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
|
|||
data->point.x = last_x;
|
||||
data->point.y = last_y;
|
||||
data->state = LV_INDEV_STATE_PR;
|
||||
LV_LOG_INFO("X=%u Y=%u", data->point.x, data->point.y);
|
||||
LV_LOG_INFO("X=%u Y=%u", data->point.x, data->point.y);
|
||||
ESP_LOGI(TAG, "X=%u Y=%u", data->point.x, data->point.y);
|
||||
ESP_LOGV(TAG, "X=%u Y=%u", data->point.x, data->point.y);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
|
@ -22,6 +23,7 @@
|
|||
* DEFINES
|
||||
*********************/
|
||||
#define DEBUG false
|
||||
#define TAG "RA8875-Touch"
|
||||
|
||||
#define DIV_ROUND_UP(n, d) (((n)+(d)-1)/(d))
|
||||
|
||||
|
@ -81,7 +83,7 @@ void ra8875_touch_init(void)
|
|||
};
|
||||
#define INIT_CMDS_SIZE (sizeof(init_cmds)/sizeof(init_cmds[0]))
|
||||
|
||||
LV_LOG_INFO("Initializing RA8875 Touch...");
|
||||
ESP_LOGI(TAG, "Initializing RA8875 Touch...");
|
||||
|
||||
// Send all the commands
|
||||
for (unsigned int i = 0; i < INIT_CMDS_SIZE; i++) {
|
||||
|
@ -92,7 +94,7 @@ void ra8875_touch_init(void)
|
|||
|
||||
void ra8875_touch_enable(bool enable)
|
||||
{
|
||||
LV_LOG_INFO("%s touch.", enable ? "Enabling" : "Disabling");
|
||||
ESP_LOGI(TAG, "%s touch.", enable ? "Enabling" : "Disabling");
|
||||
uint8_t val = enable ? (0x80 | TPCR0_VAL) : (TPCR0_VAL);
|
||||
ra8875_write_cmd(RA8875_REG_TPCR0, val);
|
||||
}
|
||||
|
@ -120,7 +122,7 @@ bool ra8875_touch_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
|
|||
y = (y << 2) | ((xy >> 2) & 0x03);
|
||||
|
||||
#if DEBUG
|
||||
LV_LOG_INFO("Touch Poll Raw: %d,%d", x, y);
|
||||
ESP_LOGI(TAG, "Touch Poll Raw: %d,%d", x, y);
|
||||
#endif
|
||||
|
||||
// Convert to display coordinates
|
||||
|
@ -134,7 +136,7 @@ bool ra8875_touch_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
|
|||
data->point.y = y;
|
||||
|
||||
#if DEBUG
|
||||
LV_LOG_INFO("Touch Poll - Event: %d; %d,%d", data->state, data->point.x, data->point.y);
|
||||
ESP_LOGI(TAG, "Touch Poll - Event: %d; %d,%d", data->state, data->point.x, data->point.y);
|
||||
#endif
|
||||
|
||||
return false;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
*********************/
|
||||
#include "stmpe610.h"
|
||||
#include "esp_system.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "driver/gpio.h"
|
||||
|
@ -16,6 +17,8 @@
|
|||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "STMPE610"
|
||||
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
@ -52,11 +55,11 @@ void stmpe610_init(void)
|
|||
uint8_t u8;
|
||||
uint16_t u16;
|
||||
|
||||
LV_LOG_INFO("Initialization.");
|
||||
ESP_LOGI(TAG, "Initialization.");
|
||||
|
||||
// Get the initial SPI configuration
|
||||
//u8 = read_8bit_reg(STMPE_SPI_CFG);
|
||||
//LV_LOG_INFO("SPI_CFG = 0x%x", u8);
|
||||
//ESP_LOGI(TAG, "SPI_CFG = 0x%x", u8);
|
||||
|
||||
// Attempt a software reset
|
||||
write_8bit_reg(STMPE_SYS_CTRL1, STMPE_SYS_CTRL1_RESET);
|
||||
|
@ -66,12 +69,12 @@ void stmpe610_init(void)
|
|||
u8 = read_8bit_reg(STMPE_SPI_CFG);
|
||||
write_8bit_reg(STMPE_SPI_CFG, u8 | STMPE_SPI_CFG_AA);
|
||||
u8 = read_8bit_reg(STMPE_SPI_CFG);
|
||||
LV_LOG_INFO("SPI_CFG = 0x%x", u8);
|
||||
ESP_LOGI(TAG, "SPI_CFG = 0x%x", u8);
|
||||
|
||||
// Verify SPI communication
|
||||
u16 = read_16bit_reg(STMPE_CHIP_ID);
|
||||
if (u16 != 0x811) {
|
||||
LV_LOG_ERROR("Incorrect version: 0x%x", u16);
|
||||
ESP_LOGE(TAG, "Incorrect version: 0x%x", u16);
|
||||
}
|
||||
|
||||
write_8bit_reg(STMPE_SYS_CTRL2, 0x00); // Disable clocks
|
||||
|
@ -127,12 +130,12 @@ bool stmpe610_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
|
|||
}
|
||||
|
||||
if (c > 0) {
|
||||
//LV_LOG_INFO("%d: %d %d %d", c, x, y, z);
|
||||
//ESP_LOGI(TAG, "%d: %d %d %d", c, x, y, z);
|
||||
|
||||
adjust_data(&x, &y);
|
||||
last_x = x;
|
||||
last_y = y;
|
||||
//LV_LOG_INFO(" ==> %d %d", x, y);
|
||||
//ESP_LOGI(TAG, " ==> %d %d", x, y);
|
||||
}
|
||||
|
||||
z = read_8bit_reg(STMPE_INT_STA); // Clear interrupts
|
||||
|
@ -141,7 +144,7 @@ bool stmpe610_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
|
|||
// Clear the FIFO if we discover an overflow
|
||||
write_8bit_reg(STMPE_FIFO_STA, STMPE_FIFO_STA_RESET);
|
||||
write_8bit_reg(STMPE_FIFO_STA, 0); // unreset
|
||||
LV_LOG_ERROR("Fifo overflow");
|
||||
ESP_LOGE(TAG, "Fifo overflow");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
*********************/
|
||||
#include "xpt2046.h"
|
||||
#include "esp_system.h"
|
||||
#include "esp_log.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "tp_spi.h"
|
||||
#include <stddef.h>
|
||||
|
@ -15,6 +16,8 @@
|
|||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define TAG "XPT2046"
|
||||
|
||||
#define CMD_X_READ 0b10010000 // NOTE: XPT2046 data sheet says this is actually Y
|
||||
#define CMD_Y_READ 0b11010000 // NOTE: XPT2046 data sheet says this is actually X
|
||||
#define CMD_Z1_READ 0b10110000
|
||||
|
@ -56,7 +59,7 @@ uint8_t avg_last;
|
|||
*/
|
||||
void xpt2046_init(void)
|
||||
{
|
||||
LV_LOG_INFO("Initialization");
|
||||
ESP_LOGI(TAG, "XPT2046 Initialization");
|
||||
|
||||
#if XPT2046_TOUCH_IRQ || XPT2046_TOUCH_IRQ_PRESS
|
||||
gpio_config_t irq_config = {
|
||||
|
@ -91,19 +94,19 @@ bool xpt2046_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
|
|||
|
||||
x = xpt2046_cmd(CMD_X_READ);
|
||||
y = xpt2046_cmd(CMD_Y_READ);
|
||||
LV_LOG_INFO("P(%d,%d)", x, y);
|
||||
ESP_LOGI(TAG, "P(%d,%d)", x, y);
|
||||
|
||||
/*Normalize Data back to 12-bits*/
|
||||
x = x >> 4;
|
||||
y = y >> 4;
|
||||
LV_LOG_INFO("P_norm(%d,%d)", x, y);
|
||||
ESP_LOGI(TAG, "P_norm(%d,%d)", x, y);
|
||||
|
||||
xpt2046_corr(&x, &y);
|
||||
xpt2046_avg(&x, &y);
|
||||
last_x = x;
|
||||
last_y = y;
|
||||
|
||||
LV_LOG_INFO("x = %d, y = %d", x, y);
|
||||
ESP_LOGI(TAG, "x = %d, y = %d", x, y);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue