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..73df970cd 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,7 +271,11 @@ 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; - // functions + epaper_panel->_rows = epaper_ssd1681_conf->rows ? + (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 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; @@ -383,7 +388,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/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: 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; /**