diff --git a/.gitignore b/.gitignore index c6127b3..38eeab7 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,9 @@ modules.order Module.symvers Mkfile.old dkms.conf + +# MacOS +.DS_Store + +# ESP-IDF build dir +build diff --git a/README.md b/README.md index 6aeec91..7ee9a6c 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ and sets the gpio numbers for the interface. |---------------------------|-----------------------|-----------|-----------|-----------| | ESP Wrover Kit v4.1 | ILI9341 | SPI | 240 | 320 | | M5Stack | ILI9341 | SPI | 240 | 320 | +| M5Core2 | ILI9341 | SPI | 240 | 320 | | M5Stick | SH1107 | SPI | - | - | | M5StickC | ST7735S | SPI | 80 | 160 | | Adafruit 3.5 Featherwing | HX8357 | SPI | 480 | 320 | diff --git a/lvgl_tft/EVE_commands.c b/lvgl_tft/EVE_commands.c index 9e458f4..2a93efa 100644 --- a/lvgl_tft/EVE_commands.c +++ b/lvgl_tft/EVE_commands.c @@ -144,7 +144,7 @@ void DELAY_MS(uint16_t ms) vTaskDelay(ms / portTICK_PERIOD_MS); } - +#if EVE_USE_PDN void EVE_pdn_set(void) { gpio_set_level(EVE_PDN, 0); /* Power-Down low */ @@ -155,7 +155,7 @@ void EVE_pdn_clear(void) { gpio_set_level(EVE_PDN, 1); /* Power-Down high */ } - +#endif void spi_acquire() { @@ -841,11 +841,13 @@ uint8_t EVE_init(void) uint8_t chipid = 0; uint16_t timeout = 0; +#if EVE_USE_PDN EVE_pdn_set(); DELAY_MS(6); /* minimum time for power-down is 5ms */ EVE_pdn_clear(); DELAY_MS(21); /* minimum time to allow from rising PD_N to first access is 20ms */ +#endif /* EVE_cmdWrite(EVE_CORERST,0); */ /* reset, only required for warm-start if PowerDown line is not used */ diff --git a/lvgl_tft/EVE_commands.h b/lvgl_tft/EVE_commands.h index 3c5c104..aa9d061 100644 --- a/lvgl_tft/EVE_commands.h +++ b/lvgl_tft/EVE_commands.h @@ -39,8 +39,12 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #define BLOCK_TRANSFER_SIZE 3840 // block transfer size when write data to CMD buffer void DELAY_MS(uint16_t ms); + +#if EVE_USE_PDN void EVE_pdn_set(void); void EVE_pdn_clear(void); +#endif + void spi_acquire(); void spi_release(); @@ -64,7 +68,7 @@ void EVE_get_cmdoffset(void); /* commands to operate on memory: */ void EVE_cmd_memzero(uint32_t ptr, uint32_t num); void EVE_cmd_memset(uint32_t ptr, uint8_t value, uint32_t num); -void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *data); +void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *data); void EVE_cmd_memcpy(uint32_t dest, uint32_t src, uint32_t num); #if FT81X_FULL diff --git a/lvgl_tft/EVE_config.h b/lvgl_tft/EVE_config.h index 53225a2..386edb9 100644 --- a/lvgl_tft/EVE_config.h +++ b/lvgl_tft/EVE_config.h @@ -44,11 +44,12 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #include "FT81x.h" -#define EVE_CLK DISP_SPI_CLK // orange -#define EVE_MISO DISP_SPI_MISO // yellow -#define EVE_MOSI DISP_SPI_MOSI // green -#define EVE_CS DISP_SPI_CS // blue -#define EVE_PDN CONFIG_LV_DISP_PIN_RST // grey +#define EVE_CLK DISP_SPI_CLK // orange +#define EVE_MISO DISP_SPI_MISO // yellow +#define EVE_MOSI DISP_SPI_MOSI // green +#define EVE_CS DISP_SPI_CS // blue +#define EVE_PDN CONFIG_LV_DISP_PIN_RST // grey +#define EVE_USE_PDN CONFIG_LV_DISP_USE_RST #define SPI_TRANSER_SIZE (DISP_BUF_SIZE * (LV_COLOR_DEPTH / 8)) diff --git a/lvgl_tft/FT81x.c b/lvgl_tft/FT81x.c index b004eba..63e0dee 100644 --- a/lvgl_tft/FT81x.c +++ b/lvgl_tft/FT81x.c @@ -250,7 +250,7 @@ void TFT_bitmap_display(void) EVE_cmd_dl(TAG(0)); EVE_cmd_dl(DL_DISPLAY); /* instruct the graphics processor to show the list */ - + EVE_cmd_dl(CMD_SWAP); /* make this list active */ EVE_end_cmd_burst(); /* stop writing to the cmd-fifo */ @@ -262,12 +262,18 @@ void TFT_bitmap_display(void) void FT81x_init(void) { +#if EVE_USE_PDN gpio_pad_select_gpio(EVE_PDN); +#endif + gpio_set_level(EVE_CS, 1); + +#if EVE_USE_PDN gpio_set_direction(EVE_PDN, GPIO_MODE_OUTPUT); +#endif spi_acquire(); - + if(EVE_init()) { tft_active = 1; @@ -278,7 +284,7 @@ void FT81x_init(void) EVE_cmd_memset(SCREEN_BITMAP_ADDR, BLACK, SCREEN_BUFFER_SIZE); // clear screen buffer EVE_cmd_execute(); - + TFT_bitmap_display(); // set DL for fullscreen bitmap display } @@ -320,4 +326,4 @@ void TFT_WriteBitmap(uint8_t* Bitmap, uint16_t X, uint16_t Y, uint16_t Width, ui void FT81x_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { TFT_WriteBitmap((uint8_t*)color_map, area->x1, area->y1, lv_area_get_width(area), lv_area_get_height(area)); -} \ No newline at end of file +} diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index 63687e3..6f32051 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -124,18 +124,24 @@ void GC9A01_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(GC9A01_DC); gpio_set_direction(GC9A01_DC, GPIO_MODE_OUTPUT); + +#if GC9A01_USE_RST gpio_pad_select_gpio(GC9A01_RST); gpio_set_direction(GC9A01_RST, GPIO_MODE_OUTPUT); +#endif #if GC9A01_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(GC9A01_BCKL); gpio_set_direction(GC9A01_BCKL, GPIO_MODE_OUTPUT); #endif + +#if GC9A01_USE_RST //Reset the display gpio_set_level(GC9A01_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(GC9A01_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "Initialization."); @@ -167,7 +173,7 @@ void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo uint8_t data[4]; /*Column addresses*/ - GC9A01_send_cmd(0x2A); //0x2A + GC9A01_send_cmd(0x2A); //0x2A data[0] = (area->x1 >> 8) & 0xFF; data[1] = area->x1 & 0xFF; data[2] = (area->x2 >> 8) & 0xFF; @@ -175,7 +181,7 @@ void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo GC9A01_send_data(data, 4); /*Page addresses*/ - GC9A01_send_cmd(0x2B); //0x2B + GC9A01_send_cmd(0x2B); //0x2B data[0] = (area->y1 >> 8) & 0xFF; data[1] = area->y1 & 0xFF; data[2] = (area->y2 >> 8) & 0xFF; @@ -183,7 +189,7 @@ void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo GC9A01_send_data(data, 4); /*Memory write*/ - GC9A01_send_cmd(0x2C); //0x2C + GC9A01_send_cmd(0x2C); //0x2C uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); @@ -211,7 +217,7 @@ void GC9A01_sleep_in() { uint8_t data[] = {0x08}; GC9A01_send_cmd(0x10); //0x10 Enter Sleep Mode - GC9A01_send_data(&data, 1); + GC9A01_send_data(&data, 1); } void GC9A01_sleep_out() diff --git a/lvgl_tft/GC9A01.h b/lvgl_tft/GC9A01.h index d462c8d..2995811 100644 --- a/lvgl_tft/GC9A01.h +++ b/lvgl_tft/GC9A01.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define GC9A01_DC CONFIG_LV_DISP_PIN_DC -#define GC9A01_RST CONFIG_LV_DISP_PIN_RST -#define GC9A01_BCKL CONFIG_LV_DISP_PIN_BCKL +#define GC9A01_DC CONFIG_LV_DISP_PIN_DC +#define GC9A01_RST CONFIG_LV_DISP_PIN_RST +#define GC9A01_USE_RST CONFIG_LV_DISP_USE_RST +#define GC9A01_BCKL CONFIG_LV_DISP_PIN_BCKL #define GC9A01_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index ddd7f51..47be8d1 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -21,6 +21,10 @@ menu "LVGL TFT Display controller" bool "M5Stack" select LV_TFT_DISPLAY_CONTROLLER_ILI9341 select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_M5CORE2 + bool "M5Core2" + select LV_TFT_DISPLAY_CONTROLLER_ILI9341 + select LV_TFT_DISPLAY_PROTOCOL_SPI config LV_PREDEFINED_DISPLAY_M5STICK bool "M5Stick" select LV_TFT_DISPLAY_CONTROLLER_SH1107 @@ -744,11 +748,11 @@ menu "LVGL TFT Display controller" config LV_DISP_ST7789_SOFT_RESET bool "Soft reset - use software reset instead of reset pin" - depends on LV_TFT_DISPLAY_CONTROLLER_ST7789 + depends on LV_TFT_DISPLAY_CONTROLLER_ST7789 default n help Use software reset and ignores configured reset pin (some hardware does not use a reset pin). - + endmenu # menu will be visible only when LV_PREDEFINED_DISPLAY_NONE is y @@ -763,6 +767,7 @@ menu "LVGL TFT Display controller" default 23 if LV_PREDEFINED_DISPLAY_WROVER4 default 23 if LV_PREDEFINED_DISPLAY_ATAG default 23 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 23 if LV_PREDEFINED_DISPLAY_M5CORE2 default 15 if LV_PREDEFINED_DISPLAY_M5STICKC default 18 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING default 23 if LV_PREDEFINED_PINS_TKOALA @@ -777,6 +782,7 @@ menu "LVGL TFT Display controller" config LV_DISPLAY_USE_SPI_MISO bool "GPIO for MISO (Master In Slave Out)" if LV_TFT_DISPLAY_PROTOCOL_SPI default y if LV_PREDEFINED_PINS_TKOALA + default y if LV_PREDEFINED_DISPLAY_M5CORE2 help Enable the MISO signal to control the display. You can disable it when the display does not need MISO signal to be controlled. @@ -788,6 +794,7 @@ menu "LVGL TFT Display controller" range 0 43 if IDF_TARGET_ESP32S2 default 19 if LV_PREDEFINED_PINS_TKOALA + default 38 if LV_PREDEFINED_DISPLAY_M5CORE2 default 0 help @@ -830,6 +837,7 @@ menu "LVGL TFT Display controller" range 0 43 if IDF_TARGET_ESP32S2 default 18 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 18 if LV_PREDEFINED_DISPLAY_M5CORE2 default 13 if LV_PREDEFINED_DISPLAY_M5STICKC default 18 if LV_PREDEFINED_DISPLAY_ATAG default 19 if LV_PREDEFINED_DISPLAY_WROVER4 @@ -858,6 +866,7 @@ menu "LVGL TFT Display controller" default 5 if LV_PREDEFINED_PINS_38V1 default 14 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 5 if LV_PREDEFINED_DISPLAY_M5CORE2 default 5 if LV_PREDEFINED_DISPLAY_M5STICKC default 22 if LV_PREDEFINED_DISPLAY_WROVER4 default 15 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING @@ -887,6 +896,7 @@ menu "LVGL TFT Display controller" default 19 if LV_PREDEFINED_PINS_38V1 default 17 if LV_PREDEFINED_PINS_38V4 default 27 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 15 if LV_PREDEFINED_DISPLAY_M5CORE2 default 23 if LV_PREDEFINED_DISPLAY_M5STICKC default 21 if LV_PREDEFINED_DISPLAY_WROVER4 default 21 if LV_PREDEFINED_DISPLAY_WT32_SC01 @@ -900,8 +910,22 @@ menu "LVGL TFT Display controller" help Configure the display DC pin here. + config LV_DISP_USE_RST + bool "Use a GPIO for resetting the display" if LV_TFT_DISPLAY_PROTOCOL_SPI + default n if LV_PREDEFINED_DISPLAY_M5CORE2 + default y + help + Enable display reset control. Set this if the reset pin of the + display is connected to the host. If this is not set, then it is + the user's responsibility to ensure that the display is reset + before initialisation. + You may want to disable this option because the reset pin is not + connected, or is connected to an external component such as the + power management IC. + config LV_DISP_PIN_RST int "GPIO for Reset" if LV_TFT_DISPLAY_PROTOCOL_SPI && !LV_DISP_ST7789_SOFT_RESET + depends on LV_DISP_USE_RST range 0 39 if IDF_TARGET_ESP32 range 0 43 if IDF_TARGET_ESP32S2 @@ -937,6 +961,7 @@ menu "LVGL TFT Display controller" ( LV_PREDEFINED_DISPLAY_NONE && ! ( LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 ) ) \ || LV_PREDEFINED_DISPLAY_RPI_MPI3501 default y if LV_PREDEFINED_DISPLAY_M5STACK + default n if LV_PREDEFINED_DISPLAY_M5CORE2 default y if LV_PREDEFINED_DISPLAY_WROVER4 default y if LV_PREDEFINED_DISPLAY_ERTFT0356 default y if LV_PREDEFINED_DISPLAY_TTGO diff --git a/lvgl_tft/hx8357.c b/lvgl_tft/hx8357.c index ad180fd..6b6cd34 100644 --- a/lvgl_tft/hx8357.c +++ b/lvgl_tft/hx8357.c @@ -162,19 +162,24 @@ void hx8357_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(HX8357_DC); gpio_set_direction(HX8357_DC, GPIO_MODE_OUTPUT); + +#if HX8357_USE_RST gpio_pad_select_gpio(HX8357_RST); gpio_set_direction(HX8357_RST, GPIO_MODE_OUTPUT); +#endif #if HX8357_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(HX8357_BCKL); gpio_set_direction(HX8357_BCKL, GPIO_MODE_OUTPUT); #endif +#if HX8357_USE_RST //Reset the display gpio_set_level(HX8357_RST, 0); vTaskDelay(10 / portTICK_RATE_MS); gpio_set_level(HX8357_RST, 1); vTaskDelay(120 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "Initialization."); diff --git a/lvgl_tft/hx8357.h b/lvgl_tft/hx8357.h index 6bad32d..1e54627 100644 --- a/lvgl_tft/hx8357.h +++ b/lvgl_tft/hx8357.h @@ -35,9 +35,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define HX8357_DC CONFIG_LV_DISP_PIN_DC -#define HX8357_RST CONFIG_LV_DISP_PIN_RST -#define HX8357_BCKL CONFIG_LV_DISP_PIN_BCKL +#define HX8357_DC CONFIG_LV_DISP_PIN_DC +#define HX8357_RST CONFIG_LV_DISP_PIN_RST +#define HX8357_USE_RST CONFIG_LV_DISP_USE_RST +#define HX8357_BCKL CONFIG_LV_DISP_PIN_BCKL #define HX8357_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define HX8357_INVERT_COLORS CONFIG_LV_INVERT_COLORS diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index 45ae276..fee39e2 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -73,9 +73,9 @@ static uint8_t il3820_lut_initial[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static uint8_t il3820_lut_default[] = { - 0x10, 0x18, 0x18, 0x08, 0x18, 0x18, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x18, 0x18, 0x08, 0x18, 0x18, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x14, 0x44, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -113,7 +113,7 @@ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_m uint8_t *buffer = (uint8_t*) color_map; uint16_t x_addr_counter = 0; uint16_t y_addr_counter = 0; - + /* Configure entry mode */ il3820_write_cmd(IL3820_CMD_ENTRY_MODE, &il3820_scan_mode, 1); @@ -131,7 +131,7 @@ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_m il3820_set_cursor(x_addr_counter, y_addr_counter); il3820_send_cmd(IL3820_CMD_WRITE_RAM); - + /* Write the pixel data to graphic RAM, linelen bytes at the time. */ for(size_t row = 0; row <= (EPD_PANEL_HEIGHT - 1); row++){ il3820_send_data(buffer, linelen); @@ -139,7 +139,7 @@ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_m } il3820_set_window(0, EPD_PANEL_WIDTH - 1, 0, EPD_PANEL_HEIGHT - 1); - + il3820_update_display(); /* IMPORTANT!!! @@ -152,7 +152,7 @@ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_m * BIT_SET(byte_index, bit_index) clears the bit_index pixel at byte_index of * the display buffer. * BIT_CLEAR(byte_index, bit_index) sets the bit_index pixel at the byte_index - * of the display buffer. */ + * of the display buffer. */ void il3820_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) @@ -198,20 +198,26 @@ void il3820_init(void) /* Initialize non-SPI GPIOs */ gpio_pad_select_gpio(IL3820_DC_PIN); gpio_set_direction(IL3820_DC_PIN, GPIO_MODE_OUTPUT); + +#if IL3820_USE_RST gpio_pad_select_gpio(IL3820_RST_PIN); gpio_set_direction(IL3820_RST_PIN, GPIO_MODE_OUTPUT); +#endif + gpio_pad_select_gpio(IL3820_BUSY_PIN); gpio_set_direction(IL3820_BUSY_PIN, GPIO_MODE_INPUT); +#if IL3820_USE_RST /* Harware reset */ gpio_set_level( IL3820_RST_PIN, 0); vTaskDelay(IL3820_RESET_DELAY / portTICK_RATE_MS); gpio_set_level( IL3820_RST_PIN, 1); vTaskDelay(IL3820_RESET_DELAY / portTICK_RATE_MS); +#endif /* Software reset */ il3820_write_cmd(IL3820_CMD_SW_RESET, NULL, 0); - + /* Busy wait for the BUSY signal to go low */ il3820_waitbusy(IL3820_WAIT); @@ -239,10 +245,10 @@ void il3820_init(void) // allow partial updates now il3820_partial = true; - + /* Update LUT */ il3820_write_cmd(IL3820_CMD_UPDATE_LUT, il3820_lut_default, sizeof(il3820_lut_default)); - + /* Clear control memory and update */ il3820_clear_cntlr_mem(IL3820_CMD_WRITE_RAM, true); } @@ -251,10 +257,10 @@ void il3820_init(void) void il3820_sleep_in(void) { uint8_t data[] = {0x01}; - + /* Wait for the BUSY signal to go low */ il3820_waitbusy(IL3820_WAIT); - + il3820_write_cmd(IL3820_CMD_SLEEP_MODE, data, 1); } @@ -264,15 +270,15 @@ static void il3820_waitbusy(int wait_ms) int i = 0; vTaskDelay(10 / portTICK_RATE_MS); // 10ms delay - + for(i = 0; i < (wait_ms * 10); i++) { if(gpio_get_level(IL3820_BUSY_PIN) != IL3820_BUSY_LEVEL) { return; } - + vTaskDelay(10 / portTICK_RATE_MS); } - + ESP_LOGE( TAG, "busy exceeded %dms", i*10 ); } @@ -288,10 +294,10 @@ static inline void il3820_data_mode(void) gpio_set_level(IL3820_DC_PIN, 1); } -static inline void il3820_write_cmd(uint8_t cmd, uint8_t *data, size_t len) +static inline void il3820_write_cmd(uint8_t cmd, uint8_t *data, size_t len) { disp_wait_for_pending_transactions(); - + il3820_command_mode(); disp_spi_send_data(&cmd, 1); @@ -302,10 +308,10 @@ static inline void il3820_write_cmd(uint8_t cmd, uint8_t *data, size_t len) } /* Send cmd to the display */ -static inline void il3820_send_cmd(uint8_t cmd) +static inline void il3820_send_cmd(uint8_t cmd) { disp_wait_for_pending_transactions(); - + il3820_command_mode(); disp_spi_send_data(&cmd, 1); } @@ -314,14 +320,14 @@ static inline void il3820_send_cmd(uint8_t cmd) static void il3820_send_data(uint8_t *data, uint16_t length) { disp_wait_for_pending_transactions(); - + il3820_data_mode(); disp_spi_send_colors(data, length); } /* Specify the start/end positions of the window address in the X and Y * directions by an address unit. - * + * * @param sx: X Start position. * @param ex: X End position. * @param ys: Y Start position. @@ -330,7 +336,7 @@ static void il3820_send_data(uint8_t *data, uint16_t length) static inline void il3820_set_window( uint16_t sx, uint16_t ex, uint16_t ys, uint16_t ye) { uint8_t tmp[4] = {0}; - + tmp[0] = sx / 8; tmp[1] = ex / 8; @@ -378,7 +384,7 @@ static void il3820_update_display(void) } else { tmp = (IL3820_CTRL2_ENABLE_CLK | IL3820_CTRL2_ENABLE_ANALOG | IL3820_CTRL2_TO_PATTERN); } - + il3820_write_cmd(IL3820_CMD_UPDATE_CTRL2, &tmp, 1); il3820_write_cmd(IL3820_CMD_MASTER_ACTIVATION, NULL, 0); @@ -394,10 +400,10 @@ static void il3820_clear_cntlr_mem(uint8_t ram_cmd, bool update) /* Arrays used by SPI must be word alligned */ WORD_ALIGNED_ATTR uint8_t clear_page[IL3820_COLUMNS]; memset(clear_page, 0xff, sizeof clear_page); - + /* Configure entry mode */ il3820_write_cmd(IL3820_CMD_ENTRY_MODE, &il3820_scan_mode, 1); - + /* Configure the window */ il3820_set_window(0, EPD_PANEL_WIDTH - 1, 0, EPD_PANEL_HEIGHT - 1); diff --git a/lvgl_tft/il3820.h b/lvgl_tft/il3820.h index e0b73cd..f77ffb4 100644 --- a/lvgl_tft/il3820.h +++ b/lvgl_tft/il3820.h @@ -28,6 +28,7 @@ extern "C" #define IL3820_DC_PIN CONFIG_LV_DISP_PIN_DC #define IL3820_RST_PIN CONFIG_LV_DISP_PIN_RST +#define IL3820_USE_RST CONFIG_LV_DISP_USE_RST #define IL3820_BUSY_PIN CONFIG_LV_DISP_PIN_BUSY #define IL3820_BUSY_LEVEL 1 diff --git a/lvgl_tft/ili9341.c b/lvgl_tft/ili9341.c index faf5546..23aba09 100644 --- a/lvgl_tft/ili9341.c +++ b/lvgl_tft/ili9341.c @@ -93,18 +93,23 @@ void ili9341_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ILI9341_DC); gpio_set_direction(ILI9341_DC, GPIO_MODE_OUTPUT); +#if ILI9341_USE_RST gpio_pad_select_gpio(ILI9341_RST); gpio_set_direction(ILI9341_RST, GPIO_MODE_OUTPUT); +#endif #if ILI9341_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ILI9341_BCKL); gpio_set_direction(ILI9341_BCKL, GPIO_MODE_OUTPUT); #endif + +#if ILI9341_USE_RST //Reset the display gpio_set_level(ILI9341_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ILI9341_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "Initialization."); @@ -228,6 +233,8 @@ static void ili9341_set_orientation(uint8_t orientation) #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; +#elif defined (CONFIG_LV_PREDEFINED_DISPLAY_M5CORE2) + uint8_t data[] = {0x08, 0x88, 0x28, 0xE8}; #elif defined (CONFIG_LV_PREDEFINED_DISPLAY_WROVER4) uint8_t data[] = {0x6C, 0xEC, 0xCC, 0x4C}; #elif defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE) diff --git a/lvgl_tft/ili9341.h b/lvgl_tft/ili9341.h index 4beb4f3..5768fbe 100644 --- a/lvgl_tft/ili9341.h +++ b/lvgl_tft/ili9341.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9341_DC CONFIG_LV_DISP_PIN_DC -#define ILI9341_RST CONFIG_LV_DISP_PIN_RST -#define ILI9341_BCKL CONFIG_LV_DISP_PIN_BCKL +#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_BCKL CONFIG_LV_DISP_PIN_BCKL #define ILI9341_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL diff --git a/lvgl_tft/ili9481.c b/lvgl_tft/ili9481.c index 6472a93..f80c810 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -76,19 +76,24 @@ void ili9481_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ILI9481_DC); gpio_set_direction(ILI9481_DC, GPIO_MODE_OUTPUT); + +#if ILI9481_USE_RST gpio_pad_select_gpio(ILI9481_RST); gpio_set_direction(ILI9481_RST, GPIO_MODE_OUTPUT); +#endif #if ILI9481_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ILI9481_BCKL); gpio_set_direction(ILI9481_BCKL, GPIO_MODE_OUTPUT); #endif +#if ILI9481_USE_RST //Reset the display gpio_set_level(ILI9481_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ILI9481_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "ILI9481 initialization."); diff --git a/lvgl_tft/ili9481.h b/lvgl_tft/ili9481.h index 7932190..c0d07fe 100644 --- a/lvgl_tft/ili9481.h +++ b/lvgl_tft/ili9481.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9481_DC CONFIG_LV_DISP_PIN_DC -#define ILI9481_RST CONFIG_LV_DISP_PIN_RST -#define ILI9481_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ILI9481_DC CONFIG_LV_DISP_PIN_DC +#define ILI9481_RST CONFIG_LV_DISP_PIN_RST +#define ILI9481_USE_RST CONFIG_LV_DISP_USE_RST +#define ILI9481_BCKL CONFIG_LV_DISP_PIN_BCKL #define ILI9481_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define ILI9481_INVERT_COLORS CONFIG_LV_INVERT_COLORS diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index e9b2b08..166bef8 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -60,8 +60,8 @@ void ili9486_init(void) {0xE0, {0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00}, 15}, {0XE1, {0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00}, 15}, {0x20, {0}, 0}, /* display inversion OFF */ - {0x36, {0x48}, 1}, - {0x29, {0}, 0x80}, /* display on */ + {0x36, {0x48}, 1}, + {0x29, {0}, 0x80}, /* display on */ {0x00, {0}, 0xff}, }; @@ -78,19 +78,24 @@ void ili9486_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ILI9486_DC); gpio_set_direction(ILI9486_DC, GPIO_MODE_OUTPUT); + +#if ILI9486_USE_RST gpio_pad_select_gpio(ILI9486_RST); gpio_set_direction(ILI9486_RST, GPIO_MODE_OUTPUT); +#endif #if ILI9486_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ILI9486_BCKL); gpio_set_direction(ILI9486_BCKL, GPIO_MODE_OUTPUT); #endif +#if ILI9486_USE_RST //Reset the display gpio_set_level(ILI9486_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ILI9486_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "ILI9486 Initialization."); @@ -135,7 +140,7 @@ void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col ili9486_send_cmd(0x2C); size = lv_area_get_width(area) * lv_area_get_height(area); - + ili9486_send_color((void*) color_map, size * 2); } diff --git a/lvgl_tft/ili9486.h b/lvgl_tft/ili9486.h index f65dd80..08e002f 100644 --- a/lvgl_tft/ili9486.h +++ b/lvgl_tft/ili9486.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9486_DC CONFIG_LV_DISP_PIN_DC -#define ILI9486_RST CONFIG_LV_DISP_PIN_RST -#define ILI9486_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ILI9486_DC CONFIG_LV_DISP_PIN_DC +#define ILI9486_RST CONFIG_LV_DISP_PIN_RST +#define ILI9486_USE_RST CONFIG_LV_DISP_USE_RST +#define ILI9486_BCKL CONFIG_LV_DISP_PIN_BCKL #define ILI9486_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index 74f7139..ce8bba0 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -50,7 +50,7 @@ static void ili9488_send_color(void * data, uint16_t length); /********************** * GLOBAL FUNCTIONS **********************/ -// From github.com/jeremyjh/ESP32_TFT_library +// From github.com/jeremyjh/ESP32_TFT_library // From github.com/mvturnho/ILI9488-lvgl-ESP32-WROVER-B void ili9488_init(void) { @@ -78,26 +78,31 @@ void ili9488_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ILI9488_DC); gpio_set_direction(ILI9488_DC, GPIO_MODE_OUTPUT); + +#if ILI9488_USE_RST gpio_pad_select_gpio(ILI9488_RST); gpio_set_direction(ILI9488_RST, GPIO_MODE_OUTPUT); +#endif #if ILI9488_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ILI9488_BCKL); gpio_set_direction(ILI9488_BCKL, GPIO_MODE_OUTPUT); #endif +#if ILI9488_USE_RST //Reset the display gpio_set_level(ILI9488_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ILI9488_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "ILI9488 initialization."); // 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) { @@ -146,7 +151,7 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col (uint8_t) (area->x2 >> 8) & 0xFF, (uint8_t) (area->x2) & 0xFF, }; - + /* Page addresses */ uint8_t yb[] = { (uint8_t) (area->y1 >> 8) & 0xFF, diff --git a/lvgl_tft/ili9488.h b/lvgl_tft/ili9488.h index 45a7045..2ecfd44 100644 --- a/lvgl_tft/ili9488.h +++ b/lvgl_tft/ili9488.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9488_DC CONFIG_LV_DISP_PIN_DC -#define ILI9488_RST CONFIG_LV_DISP_PIN_RST -#define ILI9488_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ILI9488_DC CONFIG_LV_DISP_PIN_DC +#define ILI9488_RST CONFIG_LV_DISP_PIN_RST +#define ILI9488_USE_RST CONFIG_LV_DISP_USE_RST +#define ILI9488_BCKL CONFIG_LV_DISP_PIN_BCKL #define ILI9488_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index 98eea02..c08ff88 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -159,18 +159,24 @@ void ra8875_init(void) #endif // Initialize non-SPI GPIOs + +#if RA8875_USE_RST gpio_pad_select_gpio(RA8875_RST); gpio_set_direction(RA8875_RST, GPIO_MODE_OUTPUT); +#endif + #ifdef CONFIG_LV_DISP_PIN_BCKL gpio_pad_select_gpio(CONFIG_LV_DISP_PIN_BCKL); gpio_set_direction(CONFIG_LV_DISP_PIN_BCKL, GPIO_MODE_OUTPUT); #endif +#if RA8875_USE_RST // Reset the RA8875 gpio_set_level(RA8875_RST, 0); vTaskDelay(DIV_ROUND_UP(100, portTICK_RATE_MS)); gpio_set_level(RA8875_RST, 1); vTaskDelay(DIV_ROUND_UP(100, portTICK_RATE_MS)); +#endif // Initalize RA8875 clocks (SPI must be decelerated before initializing clocks) disp_spi_change_device_speed(SPI_CLOCK_SPEED_SLOW_HZ); diff --git a/lvgl_tft/ra8875.h b/lvgl_tft/ra8875.h index a6d1fe5..6942c3e 100644 --- a/lvgl_tft/ra8875.h +++ b/lvgl_tft/ra8875.h @@ -24,7 +24,8 @@ extern "C" { /********************* * DEFINES *********************/ -#define RA8875_RST CONFIG_LV_DISP_PIN_RST +#define RA8875_RST CONFIG_LV_DISP_PIN_RST +#define RA8875_USE_RST CONFIG_LV_DISP_USE_RST // System & Configuration Registers #define RA8875_REG_PWRR (0x01) // Power and Display Control Register (PWRR) diff --git a/lvgl_tft/sh1107.c b/lvgl_tft/sh1107.c index d8d8c84..d7f6067 100644 --- a/lvgl_tft/sh1107.c +++ b/lvgl_tft/sh1107.c @@ -94,6 +94,8 @@ void sh1107_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(SH1107_DC); gpio_set_direction(SH1107_DC, GPIO_MODE_OUTPUT); + +#if SH1107_USE_RST gpio_pad_select_gpio(SH1107_RST); gpio_set_direction(SH1107_RST, GPIO_MODE_OUTPUT); @@ -102,6 +104,7 @@ void sh1107_init(void) vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(SH1107_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif //Send all the commands uint16_t cmd = 0; diff --git a/lvgl_tft/sh1107.h b/lvgl_tft/sh1107.h index 7a0db68..ba77a61 100644 --- a/lvgl_tft/sh1107.h +++ b/lvgl_tft/sh1107.h @@ -25,8 +25,9 @@ extern "C" { /********************* * DEFINES *********************/ -#define SH1107_DC CONFIG_LV_DISP_PIN_DC -#define SH1107_RST CONFIG_LV_DISP_PIN_RST +#define SH1107_DC CONFIG_LV_DISP_PIN_DC +#define SH1107_RST CONFIG_LV_DISP_PIN_RST +#define SH1107_USE_RST CONFIG_LV_DISP_USE_RST /********************** * TYPEDEFS diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index 861904c..2507118 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -99,6 +99,8 @@ void st7735s_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ST7735S_DC); gpio_set_direction(ST7735S_DC, GPIO_MODE_OUTPUT); + +#if ST7735S_USE_RST gpio_pad_select_gpio(ST7735S_RST); gpio_set_direction(ST7735S_RST, GPIO_MODE_OUTPUT); @@ -107,6 +109,7 @@ void st7735s_init(void) vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ST7735S_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "ST7735S initialization."); diff --git a/lvgl_tft/st7735s.h b/lvgl_tft/st7735s.h index de47140..71924bf 100644 --- a/lvgl_tft/st7735s.h +++ b/lvgl_tft/st7735s.h @@ -25,8 +25,9 @@ extern "C" { *********************/ #define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#define ST7735S_DC CONFIG_LV_DISP_PIN_DC -#define ST7735S_RST CONFIG_LV_DISP_PIN_RST +#define ST7735S_DC CONFIG_LV_DISP_PIN_DC +#define ST7735S_RST CONFIG_LV_DISP_PIN_RST +#define ST7735S_USE_RST CONFIG_LV_DISP_USE_RST #define AXP192_SDA CONFIG_LV_AXP192_PIN_SDA #define AXP192_SCL CONFIG_LV_AXP192_PIN_SCL diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 2b5bd7e..38bdb96 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -91,7 +91,7 @@ void st7789_init(void) gpio_pad_select_gpio(ST7789_DC); gpio_set_direction(ST7789_DC, GPIO_MODE_OUTPUT); -#if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) +#if !defined(ST7789_SOFT_RST) gpio_pad_select_gpio(ST7789_RST); gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT); #endif @@ -102,7 +102,7 @@ void st7789_init(void) #endif //Reset the display -#if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) +#if !defined(ST7789_SOFT_RST) gpio_set_level(ST7789_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ST7789_RST, 1); diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index 3175329..cccbd78 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -25,6 +25,15 @@ extern "C" #define ST7789_RST CONFIG_LV_DISP_PIN_RST #define ST7789_BCKL CONFIG_LV_DISP_PIN_BCKL +#if CONFIG_LV_DISP_USE_RST + #if CONFIG_LV_DISP_ST7789_SOFT_RESET + #define ST7789_SOFT_RST + #endif +#else + #define ST7789_SOFT_RST +#endif + + #define ST7789_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define ST7789_INVERT_COLORS CONFIG_LV_INVERT_COLORS diff --git a/lvgl_tft/st7796s.c b/lvgl_tft/st7796s.c index 457b707..44959f8 100644 --- a/lvgl_tft/st7796s.c +++ b/lvgl_tft/st7796s.c @@ -94,18 +94,24 @@ void st7796s_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ST7796S_DC); gpio_set_direction(ST7796S_DC, GPIO_MODE_OUTPUT); + +#if ST7796S_USE_RST gpio_pad_select_gpio(ST7796S_RST); gpio_set_direction(ST7796S_RST, GPIO_MODE_OUTPUT); +#endif #if ST7796S_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ST7796S_BCKL); gpio_set_direction(ST7796S_BCKL, GPIO_MODE_OUTPUT); #endif + +#if ST7796S_USE_RST //Reset the display gpio_set_level(ST7796S_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ST7796S_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "Initialization."); diff --git a/lvgl_tft/st7796s.h b/lvgl_tft/st7796s.h index 418ec9b..48e566d 100644 --- a/lvgl_tft/st7796s.h +++ b/lvgl_tft/st7796s.h @@ -26,9 +26,10 @@ extern "C" /********************* * DEFINES *********************/ -#define ST7796S_DC CONFIG_LV_DISP_PIN_DC -#define ST7796S_RST CONFIG_LV_DISP_PIN_RST -#define ST7796S_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ST7796S_DC CONFIG_LV_DISP_PIN_DC +#define ST7796S_RST CONFIG_LV_DISP_PIN_RST +#define ST7796S_USE_RST CONFIG_LV_DISP_USE_RST +#define ST7796S_BCKL CONFIG_LV_DISP_PIN_BCKL #define ST7796S_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define ST7796S_INVERT_COLORS CONFIG_LV_INVERT_COLORS