From 48b5e76ed2d214dfd662ac37c04ebee91b655815 Mon Sep 17 00:00:00 2001 From: Malachi Burke Date: Tue, 25 Feb 2025 09:08:10 -0800 Subject: [PATCH 1/4] feat(ssd1680): adding row override Still needs testing plus validation --- components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c | 6 +++++- components/lcd/esp_lcd_ssd1681/esp_lcd_ssd1681_commands.h | 3 ++- .../lcd/esp_lcd_ssd1681/include/esp_lcd_panel_ssd1681.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c b/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c index 2cec32e07..6b2634561 100644 --- a/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c +++ b/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c @@ -61,6 +61,7 @@ typedef struct { bool _mirror_x; uint8_t *_framebuffer; bool _invert_color; + int _rows; } epaper_panel_t; // --- Utility functions @@ -270,6 +271,9 @@ esp_lcd_new_panel_ssd1681(const esp_lcd_panel_io_handle_t io, const esp_lcd_pane epaper_panel->busy_gpio_num = epaper_ssd1681_conf->busy_gpio_num; epaper_panel->reset_level = panel_dev_config->flags.reset_active_high; epaper_panel->_non_copy_mode = epaper_ssd1681_conf->non_copy_mode; + epaper_panel->_rows = epaper_ssd1681_conf->rows ? + (epaper_ssd1681_conf->rows - 1) : (SSD1681_EPD_1IN54_V2_HEIGHT - 1); + // TODO: Reject config which specifies _rows != 200 && non_copy_mode == false // functions epaper_panel->base.del = epaper_panel_del; epaper_panel->base.reset = epaper_panel_reset; @@ -383,7 +387,7 @@ static esp_err_t epaper_panel_init(esp_lcd_panel_t *panel) panel_epaper_wait_busy(panel); // --- Driver Output Control ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(epaper_panel->io, SSD1681_CMD_OUTPUT_CTRL, - SSD1681_PARAM_OUTPUT_CTRL, 3), TAG, "SSD1681_CMD_OUTPUT_CTRL err"); + SSD1681_PARAM_OUTPUT_CTRL(epaper_panel->_rows), 3), TAG, "SSD1681_CMD_OUTPUT_CTRL err"); // --- Border Waveform Control ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(epaper_panel->io, SSD1681_CMD_SET_BORDER_WAVEFORM, (uint8_t[]) { diff --git a/components/lcd/esp_lcd_ssd1681/esp_lcd_ssd1681_commands.h b/components/lcd/esp_lcd_ssd1681/esp_lcd_ssd1681_commands.h index 2287c46b9..b18c29898 100644 --- a/components/lcd/esp_lcd_ssd1681/esp_lcd_ssd1681_commands.h +++ b/components/lcd/esp_lcd_ssd1681/esp_lcd_ssd1681_commands.h @@ -14,7 +14,8 @@ #define SSD1681_CMD_SWRST 0x12 // --- Driver output control #define SSD1681_CMD_OUTPUT_CTRL 0x01 -#define SSD1681_PARAM_OUTPUT_CTRL ((uint8_t[]) {0xc7, 0x00, 0x00}) +// Chipset wants (total row count - 1) i.e. 250 rows = 249 here +#define SSD1681_PARAM_OUTPUT_CTRL(rows) ((uint8_t[]) {(rows) & 0xFF, (rows) >> 8, 0x00}) // --- Data Entry Sequence Setting #define SSD1681_CMD_DATA_ENTRY_MODE 0x11 // A [1:0] = ID[1:0], A[2] = AM diff --git a/components/lcd/esp_lcd_ssd1681/include/esp_lcd_panel_ssd1681.h b/components/lcd/esp_lcd_ssd1681/include/esp_lcd_panel_ssd1681.h index 8cc357458..fe64e5f03 100644 --- a/components/lcd/esp_lcd_ssd1681/include/esp_lcd_panel_ssd1681.h +++ b/components/lcd/esp_lcd_ssd1681/include/esp_lcd_panel_ssd1681.h @@ -40,6 +40,7 @@ typedef struct { int busy_gpio_num; /*!< GPIO num of the BUSY pin */ bool non_copy_mode; /*!< If the bitmap would be copied or not. * Image rotation and mirror is limited when enabling. */ + int rows; /*!< Override rows count (0 = defaults to 200 rows) */ } esp_lcd_ssd1681_config_t; /** From 1c6e225aec94893bea2eaacaab6ecc606278bd67 Mon Sep 17 00:00:00 2001 From: Malachi Burke Date: Tue, 25 Feb 2025 12:59:25 -0800 Subject: [PATCH 2/4] feat(ssd1680): add warning when for undefined rows usage --- components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c b/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c index 6b2634561..042a74d06 100644 --- a/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c +++ b/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c @@ -273,8 +273,9 @@ esp_lcd_new_panel_ssd1681(const esp_lcd_panel_io_handle_t io, const esp_lcd_pane epaper_panel->_non_copy_mode = epaper_ssd1681_conf->non_copy_mode; epaper_panel->_rows = epaper_ssd1681_conf->rows ? (epaper_ssd1681_conf->rows - 1) : (SSD1681_EPD_1IN54_V2_HEIGHT - 1); - // TODO: Reject config which specifies _rows != 200 && non_copy_mode == false - // functions + if(epaper_panel->_rows != (SSD1681_EPD_1IN54_V2_HEIGHT - 1) && + epaper_panel->_non_copy_mode == false) + ESP_LOGW(TAG, "Overriding row count combined requires non_copy_mode, otherwise undefined behavior"); epaper_panel->base.del = epaper_panel_del; epaper_panel->base.reset = epaper_panel_reset; epaper_panel->base.init = epaper_panel_init; From 2d3b1e60a55a1653f20ebaf547f28759676973c8 Mon Sep 17 00:00:00 2001 From: Malachi Burke Date: Wed, 26 Feb 2025 14:53:29 -0800 Subject: [PATCH 3/4] build(ssd1681): bumping to v0.1.1 Reflects addition of row override, opening door to ssd1680 support --- components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c | 2 +- components/lcd/esp_lcd_ssd1681/idf_component.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c b/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c index 042a74d06..42f55ebfb 100644 --- a/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c +++ b/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c @@ -275,7 +275,7 @@ esp_lcd_new_panel_ssd1681(const esp_lcd_panel_io_handle_t io, const esp_lcd_pane (epaper_ssd1681_conf->rows - 1) : (SSD1681_EPD_1IN54_V2_HEIGHT - 1); if(epaper_panel->_rows != (SSD1681_EPD_1IN54_V2_HEIGHT - 1) && epaper_panel->_non_copy_mode == false) - ESP_LOGW(TAG, "Overriding row count combined requires non_copy_mode, otherwise undefined behavior"); + ESP_LOGE(TAG, "Overridden row count combined with non_copy_mode is unsupported"); epaper_panel->base.del = epaper_panel_del; epaper_panel->base.reset = epaper_panel_reset; epaper_panel->base.init = epaper_panel_init; diff --git a/components/lcd/esp_lcd_ssd1681/idf_component.yml b/components/lcd/esp_lcd_ssd1681/idf_component.yml index 008a7df4c..cb372c8d6 100644 --- a/components/lcd/esp_lcd_ssd1681/idf_component.yml +++ b/components/lcd/esp_lcd_ssd1681/idf_component.yml @@ -1,4 +1,4 @@ -version: "0.1.0~1" +version: "0.1.1" description: ESP LCD SSD1681 e-paper driver url: https://github.com/espressif/esp-bsp/tree/master/components/lcd/esp_lcd_ssd1681 dependencies: From 66badc7a75559802f44e49d1a4a1cf597b8594e2 Mon Sep 17 00:00:00 2001 From: Malachi Burke Date: Wed, 26 Feb 2025 22:24:30 -0800 Subject: [PATCH 4/4] fix: error message was incorrect --- components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c b/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c index 42f55ebfb..73df970cd 100644 --- a/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c +++ b/components/lcd/esp_lcd_ssd1681/esp_lcd_panel_ssd1681.c @@ -275,7 +275,7 @@ esp_lcd_new_panel_ssd1681(const esp_lcd_panel_io_handle_t io, const esp_lcd_pane (epaper_ssd1681_conf->rows - 1) : (SSD1681_EPD_1IN54_V2_HEIGHT - 1); if(epaper_panel->_rows != (SSD1681_EPD_1IN54_V2_HEIGHT - 1) && epaper_panel->_non_copy_mode == false) - ESP_LOGE(TAG, "Overridden row count combined with non_copy_mode is unsupported"); + ESP_LOGE(TAG, "Overridden row count requires non_copy_mode to be true"); epaper_panel->base.del = epaper_panel_del; epaper_panel->base.reset = epaper_panel_reset; epaper_panel->base.init = epaper_panel_init;