From 197f9163832b753764c5e1e161d8d58af4d28ba9 Mon Sep 17 00:00:00 2001 From: Slamy Date: Wed, 22 Jun 2022 21:10:21 +0200 Subject: [PATCH] fixed misaligned data transfer for ssd1306 (cherry picked from commit 46a2bf8ac9d309b80d8d6e7f3a0a8813593b6644) (cherry picked from commit b95304829af55174c0c8ac1b9c561e0319896d5b) --- components/esp_lcd/src/esp_lcd_panel_io_i2c.c | 13 +++++++++---- components/esp_lcd/src/esp_lcd_panel_ssd1306.c | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i2c.c b/components/esp_lcd/src/esp_lcd_panel_io_i2c.c index bb05192e72..17f5605fc5 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i2c.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i2c.c @@ -134,10 +134,15 @@ static esp_err_t panel_io_i2c_tx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, con ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, is_param ? i2c_panel_io->control_phase_cmd : i2c_panel_io->control_phase_data, true), err, TAG, "write control phase failed"); // control phase } - uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; - size_t cmds_size = i2c_panel_io->lcd_cmd_bits / 8; - if (cmds_size > 0 && cmds_size <= sizeof(cmds)) { - ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, cmds + (sizeof(cmds) - cmds_size), cmds_size, true), err, TAG, "write LCD cmd failed"); + + // some displays don't want any additional commands on data transfers + if (lcd_cmd != -1) + { + uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; + size_t cmds_size = i2c_panel_io->lcd_cmd_bits / 8; + if (cmds_size > 0 && cmds_size <= sizeof(cmds)) { + ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, cmds + (sizeof(cmds) - cmds_size), cmds_size, true), err, TAG, "write LCD cmd failed"); + } } if (buffer) { diff --git a/components/esp_lcd/src/esp_lcd_panel_ssd1306.c b/components/esp_lcd/src/esp_lcd_panel_ssd1306.c index 9e56a1548b..323c1faac9 100644 --- a/components/esp_lcd/src/esp_lcd_panel_ssd1306.c +++ b/components/esp_lcd/src/esp_lcd_panel_ssd1306.c @@ -167,7 +167,7 @@ static esp_err_t panel_ssd1306_draw_bitmap(esp_lcd_panel_t *panel, int x_start, }, 2); // transfer frame buffer size_t len = (y_end - y_start) * (x_end - x_start) * ssd1306->bits_per_pixel / 8; - esp_lcd_panel_io_tx_color(io, 0, color_data, len); + esp_lcd_panel_io_tx_color(io, -1, color_data, len); return ESP_OK; }