mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'bugfix/remove_dc_as_cmd_phase' into 'master'
spi_lcd: don't support dc_as_cmd_phase Closes IDFGH-7026 See merge request espressif/esp-idf!18694
This commit is contained in:
commit
85ab06440b
@ -114,7 +114,6 @@ typedef struct {
|
|||||||
int lcd_cmd_bits; /*!< Bit-width of LCD command */
|
int lcd_cmd_bits; /*!< Bit-width of LCD command */
|
||||||
int lcd_param_bits; /*!< Bit-width of LCD parameter */
|
int lcd_param_bits; /*!< Bit-width of LCD parameter */
|
||||||
struct {
|
struct {
|
||||||
unsigned int dc_as_cmd_phase: 1; /*!< D/C line value is encoded into SPI transaction command phase */
|
|
||||||
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 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 octal_mode: 1; /*!< transmit with octal mode (8 data lines), this mode is used to simulate Intel 8080 timing */
|
||||||
unsigned int lsb_first: 1; /*!< transmit LSB bit first */
|
unsigned int lsb_first: 1; /*!< transmit LSB bit first */
|
||||||
|
@ -51,7 +51,6 @@ typedef struct {
|
|||||||
int lcd_cmd_bits; // Bit width of LCD command
|
int lcd_cmd_bits; // Bit width of LCD command
|
||||||
int lcd_param_bits; // Bit width of LCD parameter
|
int lcd_param_bits; // Bit width of LCD parameter
|
||||||
struct {
|
struct {
|
||||||
unsigned int dc_as_cmd_phase: 1; // D/C line value is encoded into SPI transaction command phase
|
|
||||||
unsigned int dc_data_level: 1; // Indicates the level of DC line when tranfering data
|
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 octal_mode: 1; // Indicates whether the transmitting is enabled with octal mode (8 data lines)
|
||||||
} flags;
|
} flags;
|
||||||
@ -66,8 +65,9 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p
|
|||||||
esp_err_t ret = ESP_OK;
|
esp_err_t ret = ESP_OK;
|
||||||
esp_lcd_panel_io_spi_t *spi_panel_io = NULL;
|
esp_lcd_panel_io_spi_t *spi_panel_io = NULL;
|
||||||
ESP_GOTO_ON_FALSE(bus && io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");
|
ESP_GOTO_ON_FALSE(bus && io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");
|
||||||
ESP_GOTO_ON_FALSE(!(io_config->flags.dc_as_cmd_phase && io_config->dc_gpio_num >= 0),
|
// at the moment, the hardware doesn't support 9-bit SPI LCD, but in the future, there will be such a feature
|
||||||
ESP_ERR_INVALID_ARG, err, TAG, "invalid DC mode");
|
// so for now, we will force the user to use the GPIO to control the LCD's D/C line.
|
||||||
|
ESP_GOTO_ON_FALSE(io_config->dc_gpio_num >= 0, ESP_ERR_INVALID_ARG, err, TAG, "invalid DC mode");
|
||||||
spi_panel_io = calloc(1, sizeof(esp_lcd_panel_io_spi_t) + sizeof(lcd_spi_trans_descriptor_t) * io_config->trans_queue_depth);
|
spi_panel_io = calloc(1, sizeof(esp_lcd_panel_io_spi_t) + sizeof(lcd_spi_trans_descriptor_t) * io_config->trans_queue_depth);
|
||||||
ESP_GOTO_ON_FALSE(spi_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for spi panel io");
|
ESP_GOTO_ON_FALSE(spi_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for spi panel io");
|
||||||
|
|
||||||
@ -78,7 +78,6 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p
|
|||||||
.mode = io_config->spi_mode,
|
.mode = io_config->spi_mode,
|
||||||
.spics_io_num = io_config->cs_gpio_num,
|
.spics_io_num = io_config->cs_gpio_num,
|
||||||
.queue_size = io_config->trans_queue_depth,
|
.queue_size = io_config->trans_queue_depth,
|
||||||
.command_bits = io_config->flags.dc_as_cmd_phase ? 1 : 0, // whether to encode DC line into command transaction
|
|
||||||
.pre_cb = lcd_spi_pre_trans_cb, // pre-transaction callback, mainly control DC gpio level
|
.pre_cb = lcd_spi_pre_trans_cb, // pre-transaction callback, mainly control DC gpio level
|
||||||
.post_cb = io_config->on_color_trans_done ? lcd_spi_post_trans_color_cb : NULL, // post-transaction, where we invoke user registered "on_color_trans_done()"
|
.post_cb = io_config->on_color_trans_done ? lcd_spi_post_trans_color_cb : NULL, // post-transaction, where we invoke user registered "on_color_trans_done()"
|
||||||
};
|
};
|
||||||
@ -94,7 +93,6 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p
|
|||||||
ESP_GOTO_ON_ERROR(gpio_config(&io_conf), err, TAG, "configure GPIO for D/C line failed");
|
ESP_GOTO_ON_ERROR(gpio_config(&io_conf), err, TAG, "configure GPIO for D/C line failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
spi_panel_io->flags.dc_as_cmd_phase = io_config->flags.dc_as_cmd_phase;
|
|
||||||
spi_panel_io->flags.dc_data_level = !io_config->flags.dc_low_on_data;
|
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.octal_mode = io_config->flags.octal_mode;
|
||||||
spi_panel_io->on_color_trans_done = io_config->on_color_trans_done;
|
spi_panel_io->on_color_trans_done = io_config->on_color_trans_done;
|
||||||
@ -198,9 +196,6 @@ static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, cons
|
|||||||
// use 8 lines for transmitting command, address and data
|
// 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);
|
lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT);
|
||||||
}
|
}
|
||||||
if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary
|
|
||||||
lcd_trans->base.cmd = !spi_panel_io->flags.dc_data_level;
|
|
||||||
}
|
|
||||||
// command is short, using polling mode
|
// command is short, using polling mode
|
||||||
ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base);
|
ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base);
|
||||||
ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) command failed");
|
ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) command failed");
|
||||||
@ -210,9 +205,6 @@ static esp_err_t panel_io_spi_tx_param(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 data mode
|
lcd_trans->flags.dc_gpio_level = spi_panel_io->flags.dc_data_level; // set D/C line to data mode
|
||||||
lcd_trans->base.length = param_size * 8; // transaction length is in bits
|
lcd_trans->base.length = param_size * 8; // transaction length is in bits
|
||||||
lcd_trans->base.tx_buffer = param;
|
lcd_trans->base.tx_buffer = param;
|
||||||
if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary
|
|
||||||
lcd_trans->base.cmd = spi_panel_io->flags.dc_data_level;
|
|
||||||
}
|
|
||||||
// parameter is usually short, using polling mode
|
// parameter is usually short, using polling mode
|
||||||
ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base);
|
ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base);
|
||||||
ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) param failed");
|
ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) param failed");
|
||||||
@ -243,9 +235,6 @@ 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->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.length = spi_panel_io->lcd_cmd_bits;
|
||||||
lcd_trans->base.tx_buffer = &lcd_cmd;
|
lcd_trans->base.tx_buffer = &lcd_cmd;
|
||||||
if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary
|
|
||||||
lcd_trans->base.cmd = !spi_panel_io->flags.dc_data_level;
|
|
||||||
}
|
|
||||||
if (spi_panel_io->flags.octal_mode) {
|
if (spi_panel_io->flags.octal_mode) {
|
||||||
// use 8 lines for transmitting command, address and data
|
// 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);
|
lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT);
|
||||||
@ -284,9 +273,6 @@ 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 data mode
|
lcd_trans->flags.dc_gpio_level = spi_panel_io->flags.dc_data_level; // set D/C line to data mode
|
||||||
lcd_trans->base.length = chunk_size * 8; // transaction length is in bits
|
lcd_trans->base.length = chunk_size * 8; // transaction length is in bits
|
||||||
lcd_trans->base.tx_buffer = color;
|
lcd_trans->base.tx_buffer = color;
|
||||||
if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary
|
|
||||||
lcd_trans->base.cmd = spi_panel_io->flags.dc_data_level;
|
|
||||||
}
|
|
||||||
if (spi_panel_io->flags.octal_mode) {
|
if (spi_panel_io->flags.octal_mode) {
|
||||||
// use 8 lines for transmitting command, address and data
|
// 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);
|
lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT);
|
||||||
|
@ -239,6 +239,7 @@ LCD
|
|||||||
|
|
||||||
- The LCD panel initialization flow is slightly changed. Now the :cpp:func:`esp_lcd_panel_init` won't turn on the display automatically. User needs to call :cpp:func:`esp_lcd_panel_disp_on_off` to manually turn on the display. Note, this is different from turning on backlight. With this breaking change, user can flush a predefined pattern to the screen before turning on the screen. This can help avoid random noise on the screen after a power on reset.
|
- The LCD panel initialization flow is slightly changed. Now the :cpp:func:`esp_lcd_panel_init` won't turn on the display automatically. User needs to call :cpp:func:`esp_lcd_panel_disp_on_off` to manually turn on the display. Note, this is different from turning on backlight. With this breaking change, user can flush a predefined pattern to the screen before turning on the screen. This can help avoid random noise on the screen after a power on reset.
|
||||||
- :cpp:func:`esp_lcd_panel_disp_off` is deprecated, please use :cpp:func:`esp_lcd_panel_disp_on_off` instead.
|
- :cpp:func:`esp_lcd_panel_disp_off` is deprecated, please use :cpp:func:`esp_lcd_panel_disp_on_off` instead.
|
||||||
|
- ``dc_as_cmd_phase`` is removed. The SPI LCD driver currently doesn't support a 9bit SPI LCD. Please always use a dedicated GPIO to control the LCD D/C line.
|
||||||
|
|
||||||
.. only:: SOC_MCPWM_SUPPORTED
|
.. only:: SOC_MCPWM_SUPPORTED
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user