From 3c9f407c1d9e0977344cb5a68cdb84d36a38f9e0 Mon Sep 17 00:00:00 2001 From: Liu Zhongwei Date: Thu, 17 Aug 2023 13:57:21 +0800 Subject: [PATCH] feat(esp_lcd): spi add support for quad mode --- components/esp_lcd/include/esp_lcd_panel_io.h | 1 + components/esp_lcd/src/esp_lcd_panel_io_spi.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/components/esp_lcd/include/esp_lcd_panel_io.h b/components/esp_lcd/include/esp_lcd_panel_io.h index de7b434b5f..2c2cc086bb 100644 --- a/components/esp_lcd/include/esp_lcd_panel_io.h +++ b/components/esp_lcd/include/esp_lcd_panel_io.h @@ -136,6 +136,7 @@ typedef struct { struct { unsigned int dc_low_on_data: 1; /*!< If this flag is enabled, DC line = 0 means transfer data, DC line = 1 means transfer command; vice versa */ unsigned int octal_mode: 1; /*!< transmit with octal mode (8 data lines), this mode is used to simulate Intel 8080 timing */ + unsigned int quad_mode: 1; /*!< transmit with quad mode (4 data lines), this mode is useful when transmitting LCD parameters (Only use one line for command) */ unsigned int sio_mode: 1; /*!< Read and write through a single data line (MOSI) */ unsigned int lsb_first: 1; /*!< transmit LSB bit first */ unsigned int cs_high_active: 1; /*!< CS line is high active */ diff --git a/components/esp_lcd/src/esp_lcd_panel_io_spi.c b/components/esp_lcd/src/esp_lcd_panel_io_spi.c index e4a7ca730e..7f3e8084e1 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_spi.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_spi.c @@ -54,6 +54,7 @@ typedef struct { struct { unsigned int dc_data_level: 1; // Indicates the level of DC line when tranfering data unsigned int octal_mode: 1; // Indicates whether the transmitting is enabled with octal mode (8 data lines) + unsigned int quad_mode: 1; // Indicates whether the transmitting is enabled with quad mode (4 data lines) } flags; lcd_spi_trans_descriptor_t trans_pool[]; // Transaction pool } esp_lcd_panel_io_spi_t; @@ -95,6 +96,7 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p spi_panel_io->flags.dc_data_level = !io_config->flags.dc_low_on_data; spi_panel_io->flags.octal_mode = io_config->flags.octal_mode; + spi_panel_io->flags.quad_mode = io_config->flags.quad_mode; spi_panel_io->on_color_trans_done = io_config->on_color_trans_done; spi_panel_io->user_ctx = io_config->user_ctx; spi_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; @@ -329,6 +331,9 @@ static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, cons lcd_trans->flags.dc_gpio_level = !spi_panel_io->flags.dc_data_level; // set D/C line to command mode lcd_trans->base.length = spi_panel_io->lcd_cmd_bits; lcd_trans->base.tx_buffer = &lcd_cmd; + if(color && color_size) { + lcd_trans->base.flags |= SPI_TRANS_CS_KEEP_ACTIVE; + } if (spi_panel_io->flags.octal_mode) { // use 8 lines for transmitting command, address and data lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT); @@ -372,6 +377,9 @@ static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, cons if (spi_panel_io->flags.octal_mode) { // use 8 lines for transmitting command, address and data lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + } else if (spi_panel_io->flags.quad_mode) { + // use 4 lines only for transmitting data + lcd_trans->base.flags |= SPI_TRANS_MODE_QIO; } // color data is usually large, using queue+blocking mode