From 454c2e692eea28e09769971ea672569e3a01be0a Mon Sep 17 00:00:00 2001 From: Jackson Ming Hu Date: Wed, 2 Sep 2020 21:07:02 +1000 Subject: [PATCH 1/6] uc8151d: init --- .../lvgl_tft/CMakeLists.txt | 2 + .../lvgl_esp32_drivers/lvgl_tft/Kconfig | 16 ++- .../lvgl_esp32_drivers/lvgl_tft/uc8151d.c | 121 ++++++++++++++++++ .../lvgl_esp32_drivers/lvgl_tft/uc8151d.h | 32 +++++ 4 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c create mode 100644 components/lvgl_esp32_drivers/lvgl_tft/uc8151d.h diff --git a/components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt b/components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt index 6fcb1784..79814b13 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt +++ b/components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt @@ -27,6 +27,8 @@ elseif(CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_IL3820) list(APPEND SOURCES "il3820.c") elseif(CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_JD79653A) list(APPEND SOURCES "jd79653a.c") +elseif(CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_UC8151D) + list(APPEND SOURCES "uc8151d.c") elseif(CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_RA8875) list(APPEND SOURCES "ra8875.c") elseif(CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_GC9A01) diff --git a/components/lvgl_esp32_drivers/lvgl_tft/Kconfig b/components/lvgl_esp32_drivers/lvgl_tft/Kconfig index 3a6ac1a7..cbe4dae2 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/Kconfig +++ b/components/lvgl_esp32_drivers/lvgl_tft/Kconfig @@ -146,6 +146,11 @@ menu "LVGL TFT Display controller" help FitiPower JD79653A display controller for GoodDisplay GDEW0154M09 e-paper panel + config LVGL_TFT_DISPLAY_CONTROLLER_UC8151D + bool + help + UltraChip UC8151D display controller with GoodDisplay GDEW0154M10 DES e-paper panel + config LVGL_TFT_DISPLAY_CONTROLLER_RA8875 bool help @@ -278,6 +283,11 @@ menu "LVGL TFT Display controller" select LVGL_TFT_DISPLAY_CONTROLLER_JD79653A select LVGL_TFT_DISPLAY_PROTOCOL_SPI select LVGL_TFT_DISPLAY_MONOCHROME + config LVGL_TFT_DISPLAY_USER_CONTROLLER_UC8151D + bool "UC8151D" + select LVGL_TFT_DISPLAY_CONTROLLER_UC8151D + select LVGL_TFT_DISPLAY_PROTOCOL_SPI + select LVGL_TFT_DISPLAY_MONOCHROME config LVGL_TFT_DISPLAY_USER_CONTROLLER_RA8875 bool "RA8875" select LVGL_TFT_DISPLAY_CONTROLLER_RA8875 @@ -407,7 +417,7 @@ menu "LVGL TFT Display controller" default LVGL_TFT_SPI_CLK_DIVIDER_5 if LVGL_TFT_DISPLAY_CONTROLLER_ILI9481 default LVGL_TFT_SPI_CLK_DIVIDER_3 if LVGL_TFT_DISPLAY_CONTROLLER_HX8357 default LVGL_TFT_SPI_CLK_DIVIDER_10 if LVGL_TFT_DISPLAY_CONTROLLER_SH1107 - default LVGL_TFT_SPI_CLK_DIVIDER_16 if LVGL_TFT_DISPLAY_CONTROLLER_JD79653A + default LVGL_TFT_SPI_CLK_DIVIDER_16 if LVGL_TFT_DISPLAY_CONTROLLER_JD79653A || LVGL_TFT_DISPLAY_CONTROLLER_UC8151D default LVGL_TFT_SPI_CLK_DIVIDER_2 config LVGL_TFT_SPI_CLK_DIVIDER_1 @@ -758,9 +768,9 @@ menu "LVGL TFT Display controller" Configure the display Reset pin here. config LVGL_DISP_PIN_BUSY - int "GPIO for Busy" if LVGL_TFT_DISPLAY_CONTROLLER_IL3820 || LVGL_TFT_DISPLAY_CONTROLLER_JD79653A + int "GPIO for Busy" if LVGL_TFT_DISPLAY_CONTROLLER_IL3820 || LVGL_TFT_DISPLAY_CONTROLLER_JD79653A || LVGL_TFT_DISPLAY_CONTROLLER_UC8151D range 0 39 - default 35 if LVGL_TFT_DISPLAY_CONTROLLER_IL3820 || LVGL_TFT_DISPLAY_CONTROLLER_JD79653A + default 35 if LVGL_TFT_DISPLAY_CONTROLLER_IL3820 || LVGL_TFT_DISPLAY_CONTROLLER_JD79653A || LVGL_TFT_DISPLAY_CONTROLLER_UC8151D default 35 help diff --git a/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c new file mode 100644 index 00000000..a606d70b --- /dev/null +++ b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c @@ -0,0 +1,121 @@ +/** + @file uc8151d.c + @brief GoodDisplay GDEW0154M10 DES e-paper display w/ UltraChip UC8151D + @version 1.0 + @date 2020-08-28 + @author Jackson Ming Hu + + + @section LICENSE + + MIT License + + Copyright (c) 2020 Jackson Ming Hu + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#include +#include +#include +#include +#include + +#include "disp_driver.h" +#include "uc8151d.h" + +#define TAG "lv_uc8151d" + +#define PIN_DC CONFIG_LVGL_DISP_PIN_DC +#define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LVGL_DISP_PIN_DC))) +#define PIN_RST CONFIG_LVGL_DISP_PIN_RST +#define PIN_RST_BIT ((1ULL << (uint8_t)(CONFIG_LVGL_DISP_PIN_RST))) +#define PIN_BUSY CONFIG_LVGL_DISP_PIN_BUSY +#define PIN_BUSY_BIT ((1ULL << (uint8_t)(CONFIG_LVGL_DISP_PIN_BUSY))) +#define EVT_BUSY (1UL << 0UL) +#define EPD_WIDTH CONFIG_LVGL_DISPLAY_WIDTH +#define EPD_HEIGHT CONFIG_LVGL_DISPLAY_HEIGHT +#define EPD_ROW_LEN (EPD_HEIGHT / 8u) + +#define BIT_SET(a, b) ((a) |= (1U << (b))) +#define BIT_CLEAR(a, b) ((a) &= ~(1U << (b))) + +typedef struct +{ + uint8_t cmd; + uint8_t data[3]; + size_t len; +} uc8151d_seq_t; + +#define EPD_SEQ_LEN(x) ((sizeof(x) / sizeof(uc8151d_seq_t))) + +static EventGroupHandle_t uc8151d_evts = NULL; + +static void IRAM_ATTR uc8151d_busy_intr(void *arg) +{ + BaseType_t xResult; + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xResult = xEventGroupSetBitsFromISR(uc8151d_evts, EVT_BUSY, &xHigherPriorityTaskWoken); + if (xResult == pdPASS) { + portYIELD_FROM_ISR(); + } +} + +static esp_err_t uc8151d_wait_busy(uint32_t timeout_ms) +{ + uint32_t wait_ticks = (timeout_ms == 0 ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms)); + EventBits_t bits = xEventGroupWaitBits(uc8151d_evts, + EVT_BUSY, // Wait for busy bit + pdTRUE, pdTRUE, // Clear on exit, wait for all + wait_ticks); // Timeout + + return ((bits & EVT_BUSY) != 0) ? ESP_OK : ESP_ERR_TIMEOUT; +} + +void uc8151d_init() +{ + // Initialise event group + uc8151d_evts = xEventGroupCreate(); + if (!uc8151d_evts) { + 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, + .mode = GPIO_MODE_INPUT, + .pin_bit_mask = PIN_BUSY_BIT, + .pull_down_en = 0, + .pull_up_en = 1, + }; + ESP_ERROR_CHECK(gpio_config(&in_io_conf)); + gpio_install_isr_service(0); + gpio_isr_handler_add(PIN_BUSY, uc8151d_busy_intr, (void *) PIN_BUSY); + + // Hardware reset + gpio_set_level(PIN_RST, 0); + vTaskDelay(pdMS_TO_TICKS(20)); // At least 10ms, leave 15ms for now just in case... + gpio_set_level(PIN_RST, 1); + vTaskDelay(pdMS_TO_TICKS(20)); +} diff --git a/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.h b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.h new file mode 100644 index 00000000..0f282979 --- /dev/null +++ b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.h @@ -0,0 +1,32 @@ +/** + @file uc8151d.h + @brief GoodDisplay GDEW0154M09 e-paper display w/ FitiPower JD79653A + @version 1.0 + @date 2020-08-28 + @author Jackson Ming Hu + + + @section LICENSE + + MIT License + + Copyright (c) 2020 Jackson Ming Hu + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LVGL_DEMO_UC8151D_H +#define LVGL_DEMO_UC8151D_H + +void uc8151d_init(); + +#endif //LVGL_DEMO_UC8151D_H From 32202b0be74f9d0abcf5f2c660ff47bc0ccc5a53 Mon Sep 17 00:00:00 2001 From: Jackson Ming Hu Date: Wed, 2 Sep 2020 21:54:21 +1000 Subject: [PATCH 2/6] uc8151d: implement basic functionalities --- .../lvgl_esp32_drivers/lvgl_tft/uc8151d.c | 153 +++++++++++++++++- .../lvgl_esp32_drivers/lvgl_tft/uc8151d.h | 7 + 2 files changed, 155 insertions(+), 5 deletions(-) diff --git a/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c index a606d70b..852c828d 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c +++ b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c @@ -31,6 +31,7 @@ #include #include +#include "disp_spi.h" #include "disp_driver.h" #include "uc8151d.h" @@ -71,6 +72,47 @@ static void IRAM_ATTR uc8151d_busy_intr(void *arg) } } +static void uc8151d_spi_send_cmd(uint8_t cmd) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(PIN_DC, 0); // DC = 0 for command + disp_spi_send_data(&cmd, 1); +} + +static void uc8151d_spi_send_data(uint8_t *data, size_t len) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(PIN_DC, 1); // DC = 1 for data + disp_spi_send_data(data, len); +} + +static void uc8151d_spi_send_data_byte(uint8_t data) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(PIN_DC, 1); // DC = 1 for data + disp_spi_send_data(&data, 1); +} + +static void uc8151d_spi_send_fb(uint8_t *data, size_t len) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(PIN_DC, 1); // DC = 1 for data + disp_spi_send_colors(data, len); +} + +static void uc8151d_spi_send_seq(const uc8151d_seq_t *seq, size_t 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++) { + uc8151d_spi_send_cmd(seq[cmd_idx].cmd); + if (seq[cmd_idx].len > 0) { + uc8151d_spi_send_data((uint8_t *) seq[cmd_idx].data, seq[cmd_idx].len); + } + } +} + static esp_err_t uc8151d_wait_busy(uint32_t timeout_ms) { uint32_t wait_ticks = (timeout_ms == 0 ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms)); @@ -82,6 +124,109 @@ static esp_err_t uc8151d_wait_busy(uint32_t timeout_ms) return ((bits & EVT_BUSY) != 0) ? ESP_OK : ESP_ERR_TIMEOUT; } +static void uc8151d_sleep() +{ + // Set VCOM to 0xf7 + uc8151d_spi_send_cmd(0x50); + uc8151d_spi_send_data_byte(0xf7); + + // Power off + uc8151d_spi_send_cmd(0x02); + uc8151d_wait_busy(0); + + // Go to sleep + uc8151d_spi_send_cmd(0x07); + uc8151d_spi_send_data_byte(0xa5); +} + +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++) { + 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 + uc8151d_spi_send_cmd(0x04); + uc8151d_wait_busy(0); + + // Panel settings + uc8151d_spi_send_cmd(0x00); + uc8151d_spi_send_data_byte(0x1f); + + // VCOM & Data intervals + uc8151d_spi_send_cmd(0x50); + uc8151d_spi_send_data_byte(0x97); +} + +static void uc8151d_full_update(uint8_t *buf) +{ + uc8151d_panel_init(); + + uint8_t *buf_ptr = buf; + uint8_t old_data[EPD_ROW_LEN] = { 0 }; + + // Fill old data + uc8151d_spi_send_cmd(0x10); + for (size_t h_idx = 0; h_idx < EPD_HEIGHT; h_idx++) { + uc8151d_spi_send_data(old_data, EPD_ROW_LEN); + } + + // Fill new data + uc8151d_spi_send_cmd(0x13); + for (size_t h_idx = 0; h_idx < EPD_HEIGHT; h_idx++) { + uc8151d_spi_send_data(buf_ptr, EPD_ROW_LEN); + buf_ptr += EPD_ROW_LEN; + } + + // Issue refresh + uc8151d_spi_send_cmd(0x12); + vTaskDelay(pdMS_TO_TICKS(10)); + uc8151d_wait_busy(0); + + uc8151d_sleep(); +} + +void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; + + 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); + 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, + lv_color_t color, lv_opa_t opa) +{ + uint16_t byte_index = (x >> 3u) + (y * EPD_ROW_LEN); + uint8_t bit_index = x & 0x07u; + + if (color.full) { + BIT_SET(buf[byte_index], 7 - bit_index); + } else { + ESP_LOGD(TAG, "Clear at x: %u, y: %u", x, y); + BIT_CLEAR(buf[byte_index], 7 - bit_index); + } +} + +void uc8151d_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area) +{ + // Always send full framebuffer if it's not in partial mode + area->x1 = 0; + area->y1 = 0; + area->x2 = EPD_WIDTH - 1; + area->y2 = EPD_HEIGHT - 1; +} + void uc8151d_init() { // Initialise event group @@ -113,9 +258,7 @@ void uc8151d_init() gpio_install_isr_service(0); gpio_isr_handler_add(PIN_BUSY, uc8151d_busy_intr, (void *) PIN_BUSY); - // Hardware reset - gpio_set_level(PIN_RST, 0); - vTaskDelay(pdMS_TO_TICKS(20)); // At least 10ms, leave 15ms for now just in case... - gpio_set_level(PIN_RST, 1); - vTaskDelay(pdMS_TO_TICKS(20)); + ESP_LOGI(TAG, "IO init finished"); + uc8151d_panel_init(); + ESP_LOGI(TAG, "Panel initialised"); } diff --git a/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.h b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.h index 0f282979..e637f0e7 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.h +++ b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.h @@ -27,6 +27,13 @@ #ifndef LVGL_DEMO_UC8151D_H #define LVGL_DEMO_UC8151D_H +#include + void uc8151d_init(); +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, + lv_color_t color, lv_opa_t opa); + +void uc8151d_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area); +void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); #endif //LVGL_DEMO_UC8151D_H From 20cb4dd66e7194721a7dfbdd959f1622c0202d75 Mon Sep 17 00:00:00 2001 From: Jackson Ming Hu Date: Wed, 2 Sep 2020 21:54:53 +1000 Subject: [PATCH 3/6] uc8151d: bring in to lvgl_esp32 family! --- components/lvgl_esp32_drivers/lvgl_helpers.h | 2 ++ components/lvgl_esp32_drivers/lvgl_tft/disp_driver.c | 8 ++++++++ components/lvgl_esp32_drivers/lvgl_tft/disp_driver.h | 2 ++ 3 files changed, 12 insertions(+) diff --git a/components/lvgl_esp32_drivers/lvgl_helpers.h b/components/lvgl_esp32_drivers/lvgl_helpers.h index 1be90150..ae907a0b 100644 --- a/components/lvgl_esp32_drivers/lvgl_helpers.h +++ b/components/lvgl_esp32_drivers/lvgl_helpers.h @@ -50,6 +50,8 @@ extern "C" { #define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) #elif defined (CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_JD79653A) #define DISP_BUF_SIZE ((CONFIG_LVGL_DISPLAY_HEIGHT * CONFIG_LVGL_DISPLAY_WIDTH) / 8) // 5KB +#elif defined (CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_UC8151D) +#define DISP_BUF_SIZE ((CONFIG_LVGL_DISPLAY_HEIGHT * CONFIG_LVGL_DISPLAY_WIDTH) / 8) // 2888 bytes #else #error "No display controller selected" #endif diff --git a/components/lvgl_esp32_drivers/lvgl_tft/disp_driver.c b/components/lvgl_esp32_drivers/lvgl_tft/disp_driver.c index 886e2922..36d65cf0 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/disp_driver.c +++ b/components/lvgl_esp32_drivers/lvgl_tft/disp_driver.c @@ -35,6 +35,8 @@ void disp_driver_init(void) GC9A01_init(); #elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_JD79653A jd79653a_init(); +#elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_UC8151D + uc8151d_init(); #endif } @@ -68,6 +70,8 @@ void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * GC9A01_flush(drv, area, color_map); #elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_JD79653A jd79653a_lv_fb_flush(drv, area, color_map); +#elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_UC8151D + uc8151d_lv_fb_flush(drv, area, color_map); #endif } @@ -81,6 +85,8 @@ void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area) il3820_rounder(disp_drv, area); #elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_JD79653A jd79653a_lv_rounder_cb(disp_drv, area); +#elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_UC8151D + uc8151d_lv_rounder_cb(disp_drv, area); #endif } @@ -95,5 +101,7 @@ void disp_driver_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_ il3820_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa); #elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_JD79653A jd79653a_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa); +#elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_UC8151D + uc8151d_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa); #endif } diff --git a/components/lvgl_esp32_drivers/lvgl_tft/disp_driver.h b/components/lvgl_esp32_drivers/lvgl_tft/disp_driver.h index ba567332..fbba8cde 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/disp_driver.h +++ b/components/lvgl_esp32_drivers/lvgl_tft/disp_driver.h @@ -42,6 +42,8 @@ extern "C" { #include "GC9A01.h" #elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_JD79653A #include "jd79653a.h" +#elif defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_UC8151D +#include "uc8151d.h" #endif /********************* From a3bba65ca988ec2318586dc0479af63ca6ee6a36 Mon Sep 17 00:00:00 2001 From: Jackson Ming Hu Date: Wed, 2 Sep 2020 22:36:53 +1000 Subject: [PATCH 4/6] main: add supports for e-paper panel demos --- main/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main/main.c b/main/main.c index a5210715..74e73329 100644 --- a/main/main.c +++ b/main/main.c @@ -79,7 +79,9 @@ static void guiTask(void *pvParameter) { /* Initialize the working buffer depending on the selected display */ -#if defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_IL3820 +#if defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_IL3820 \ + || defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_JD79653A \ + || defined CONFIG_LVGL_TFT_DISPLAY_CONTROLLER_UC8151D /* Actual size in pixel, not bytes and use single buffer */ size_in_px *= 8; lv_disp_buf_init(&disp_buf, buf1, NULL, size_in_px); From b2d5082b5889fd37c30a367947abb00def5ab3da Mon Sep 17 00:00:00 2001 From: Jackson Ming Hu Date: Wed, 2 Sep 2020 22:45:53 +1000 Subject: [PATCH 5/6] uc8151d: add 180deg rotation support --- components/lvgl_esp32_drivers/lvgl_tft/Kconfig | 10 ++++++++-- components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/components/lvgl_esp32_drivers/lvgl_tft/Kconfig b/components/lvgl_esp32_drivers/lvgl_tft/Kconfig index cbe4dae2..b8e3bb9c 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/Kconfig +++ b/components/lvgl_esp32_drivers/lvgl_tft/Kconfig @@ -334,8 +334,12 @@ menu "LVGL TFT Display controller" LVGL_TFT_DISPLAY_CONTROLLER_ST7735S || \ LVGL_TFT_DISPLAY_CONTROLLER_IL3820 || \ LVGL_TFT_DISPLAY_CONTROLLER_RA8875 || \ - LVGL_TFT_DISPLAY_CONTROLLER_JD79653A - default LVGL_DISPLAY_ORIENTATION_LANDSCAPE + LVGL_TFT_DISPLAY_CONTROLLER_JD79653A || \ + LVGL_TFT_DISPLAY_CONTROLLER_UC8151D + default LVGL_DISPLAY_ORIENTATION_LANDSCAPE \ + if !LVGL_TFT_DISPLAY_CONTROLLER_JD79653A || \ + !LVGL_TFT_DISPLAY_CONTROLLER_UC8151D + default LVGL_DISPLAY_ORIENTATION_PORTRAIT if LVGL_TFT_DISPLAY_CONTROLLER_JD79653A || LVGL_TFT_DISPLAY_CONTROLLER_UC8151D help Display orientation. @@ -347,10 +351,12 @@ menu "LVGL TFT Display controller" config LVGL_DISPLAY_ORIENTATION_LANDSCAPE bool "Landscape" depends on !LVGL_TFT_DISPLAY_CONTROLLER_JD79653A + depends on !LVGL_TFT_DISPLAY_CONTROLLER_UC8151D config LVGL_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED bool "Inverted Landscape" depends on !LVGL_TFT_DISPLAY_CONTROLLER_IL3820 depends on !LVGL_TFT_DISPLAY_CONTROLLER_JD79653A + depends on !LVGL_TFT_DISPLAY_CONTROLLER_UC8151D endchoice diff --git a/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c index 852c828d..3fc03b88 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c +++ b/components/lvgl_esp32_drivers/lvgl_tft/uc8151d.c @@ -155,7 +155,11 @@ static void uc8151d_panel_init() // Panel settings uc8151d_spi_send_cmd(0x00); +#if defined (CONFIG_LVGL_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + uc8151d_spi_send_data_byte(0x13); +#elif defined (CONFIG_LVGL_DISPLAY_ORIENTATION_PORTRAIT) uc8151d_spi_send_data_byte(0x1f); +#endif // VCOM & Data intervals uc8151d_spi_send_cmd(0x50); From 06f0817320fa0624029c103c4b6a2eff4fd4c1a4 Mon Sep 17 00:00:00 2001 From: Jackson Ming Hu Date: Thu, 3 Sep 2020 09:10:06 +1000 Subject: [PATCH 6/6] Wrap conditional branch for ESP-IDF --- components/lvgl/CMakeLists.txt | 4 ++++ components/lvgl_esp32_drivers/CMakeLists.txt | 4 ++++ components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt | 4 ++++ components/lvgl_esp32_drivers/lvgl_touch/CMakeLists.txt | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/components/lvgl/CMakeLists.txt b/components/lvgl/CMakeLists.txt index 5550ee45..444d3151 100644 --- a/components/lvgl/CMakeLists.txt +++ b/components/lvgl/CMakeLists.txt @@ -1,5 +1,9 @@ +if(ESP_PLATFORM) + file(GLOB_RECURSE SOURCES lvgl/src/*.c) idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS . lvgl) target_compile_definitions(${COMPONENT_LIB} INTERFACE LV_CONF_INCLUDE_SIMPLE=1) + +endif() \ No newline at end of file diff --git a/components/lvgl_esp32_drivers/CMakeLists.txt b/components/lvgl_esp32_drivers/CMakeLists.txt index f6bb3ebc..1145abae 100644 --- a/components/lvgl_esp32_drivers/CMakeLists.txt +++ b/components/lvgl_esp32_drivers/CMakeLists.txt @@ -1,5 +1,9 @@ +if(ESP_PLATFORM) + file(GLOB SOURCES *.c) idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS . REQUIRES lvgl) + +endif() \ No newline at end of file diff --git a/components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt b/components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt index 79814b13..cc599ace 100644 --- a/components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt +++ b/components/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt @@ -1,3 +1,5 @@ +if (ESP_PLATFORM) + set(SOURCES "disp_driver.c") # Include only the source file of the selected @@ -47,3 +49,5 @@ message("SOURCES contents: " "${SOURCES}") idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS . REQUIRES lvgl) + +endif() \ No newline at end of file diff --git a/components/lvgl_esp32_drivers/lvgl_touch/CMakeLists.txt b/components/lvgl_esp32_drivers/lvgl_touch/CMakeLists.txt index 84dbcb43..db2618a3 100644 --- a/components/lvgl_esp32_drivers/lvgl_touch/CMakeLists.txt +++ b/components/lvgl_esp32_drivers/lvgl_touch/CMakeLists.txt @@ -1,3 +1,5 @@ +if(ESP_PLATFORM) + set(SOURCES "touch_driver.c") # Include only the source file of the selected @@ -28,3 +30,5 @@ message("SOURCES contents: " "${SOURCES}") idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS . REQUIRES lvgl) + +endif() \ No newline at end of file