diff --git a/lv_port/lv_port_display_espressif.c b/lv_port/lv_port_display_espressif.c index cb8a222..284b28c 100644 --- a/lv_port/lv_port_display_espressif.c +++ b/lv_port/lv_port_display_espressif.c @@ -7,6 +7,11 @@ #include "driver/gpio.h" #include "disp_spi.h" +#include "lvgl_i2c/i2c_manager.h" + +/* TODO: This is ssd1306 specific */ +#define OLED_I2C_PORT (CONFIG_LV_I2C_DISPLAY_PORT) +#define OLED_I2C_ADDRESS 0x3C #define LV_DISPLAY_DC_CMD_MODE 0 #define LV_DISPLAY_DC_DATA_MODE 1 @@ -75,6 +80,9 @@ void display_interface_send_cmd(lv_disp_drv_t *drv, uint8_t cmd, void *args, siz disp_spi_send_data(args, args_len); } #elif defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) + (void) drv; + uint8_t *data = (uint8_t *) args; + lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, cmd, data, args_len); #endif } @@ -86,5 +94,20 @@ void display_interface_send_data_async(lv_disp_drv_t *drv, void *data, size_t le disp_spi_send_colors(data, len); #elif defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) + (void) drv; + lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, OLED_CONTROL_BYTE_DATA_STREAM, data, len); +#endif +} + +void display_interface_send_data(lv_disp_drv_t *drv, void *data, size_t len) +{ +#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI) + disp_wait_for_pending_transactions(); + display_port_gpio_dc(drv, LV_DISPLAY_DC_DATA_MODE); + + disp_spi_send_colors(data, len); +#elif defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) + (void) drv; + lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, OLED_CONTROL_BYTE_DATA_STREAM, data, len); #endif } diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index ea1d493..08db79a 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -28,7 +28,7 @@ void *disp_driver_init(lv_disp_drv_t *drv) #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 sh1107_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 - ssd1306_init(); + ssd1306_init(drv); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X FT81x_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820 diff --git a/lvgl_tft/display_port.h b/lvgl_tft/display_port.h index 0a6e16d..c72a7e8 100644 --- a/lvgl_tft/display_port.h +++ b/lvgl_tft/display_port.h @@ -57,6 +57,7 @@ void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state); bool display_port_gpio_is_busy(lv_disp_drv_t *drv); void display_interface_send_cmd(lv_disp_drv_t *drv, uint8_t cmd, void *args, size_t args_len); +void display_interface_send_data(lv_disp_drv_t *drv, void *data, size_t len); void display_interface_send_data_async(lv_disp_drv_t *drv, void *data, size_t len); #ifdef __cplusplus diff --git a/lvgl_tft/ssd1306.c b/lvgl_tft/ssd1306.c index 802842c..c223eb2 100644 --- a/lvgl_tft/ssd1306.c +++ b/lvgl_tft/ssd1306.c @@ -15,16 +15,13 @@ *********************/ #include "assert.h" -#include "lvgl_i2c/i2c_manager.h" - #include "ssd1306.h" +#include "display_port.h" /********************* * DEFINES *********************/ -#define OLED_I2C_PORT (CONFIG_LV_I2C_DISPLAY_PORT) // SLA (0x3C) + WRITE_MODE (0x00) = 0x78 (0b01111000) -#define OLED_I2C_ADDRESS 0x3C #define OLED_WIDTH 128 #define OLED_HEIGHT 64 #define OLED_COLUMNS 128 @@ -75,8 +72,6 @@ /********************** * STATIC PROTOTYPES **********************/ -static uint8_t send_data(lv_disp_drv_t *disp_drv, void *bytes, size_t bytes_len); -static uint8_t send_pixels(lv_disp_drv_t *disp_drv, void *color_buffer, size_t buffer_len); /********************** * STATIC VARIABLES @@ -92,7 +87,7 @@ static uint8_t send_pixels(lv_disp_drv_t *disp_drv, void *color_buffer, size_t b /********************** * GLOBAL FUNCTIONS **********************/ -void ssd1306_init(void) +void ssd1306_init(lv_disp_drv_t *disp_drv) { uint8_t orientation_1 = 0; uint8_t orientation_2 = 0; @@ -127,8 +122,7 @@ void ssd1306_init(void) OLED_CMD_DISPLAY_ON }; - uint8_t err = send_data(NULL, conf, sizeof(conf)); - assert(0 == err); + display_interface_send_cmd(disp_drv, OLED_CONTROL_BYTE_CMD_STREAM, &conf[1], sizeof(conf) - 1); } void ssd1306_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, @@ -162,10 +156,8 @@ void ssd1306_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t row2, }; - uint8_t err = send_data(disp_drv, conf, sizeof(conf)); - assert(0 == err); - err = send_pixels(disp_drv, color_p, OLED_COLUMNS * (1 + row2 - row1)); - assert(0 == err); + display_interface_send_cmd(disp_drv, OLED_CONTROL_BYTE_CMD_STREAM, &conf[1], sizeof(conf) - 1); + display_interface_send_data(disp_drv, color_p, OLED_COLUMNS * (1 + row2 - row1)); lv_disp_flush_ready(disp_drv); } @@ -188,8 +180,7 @@ void ssd1306_sleep_in(void) OLED_CMD_DISPLAY_OFF }; - uint8_t err = send_data(NULL, conf, sizeof(conf)); - assert(0 == err); + display_interface_send_cmd(NULL, OLED_CONTROL_BYTE_CMD_STREAM, &conf[1], 1); } void ssd1306_sleep_out(void) @@ -199,25 +190,5 @@ void ssd1306_sleep_out(void) OLED_CMD_DISPLAY_ON }; - uint8_t err = send_data(NULL, conf, sizeof(conf)); - assert(0 == err); -} - -/********************** - * STATIC FUNCTIONS - **********************/ -static uint8_t send_data(lv_disp_drv_t *disp_drv, void *bytes, size_t bytes_len) -{ - (void) disp_drv; - - uint8_t *data = (uint8_t *) bytes; - - return lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, data[0], data + 1, bytes_len - 1 ); -} - -static uint8_t send_pixels(lv_disp_drv_t *disp_drv, void *color_buffer, size_t buffer_len) -{ - (void) disp_drv; - - return lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, OLED_CONTROL_BYTE_DATA_STREAM, color_buffer, buffer_len); + display_interface_send_cmd(NULL, OLED_CONTROL_BYTE_CMD_STREAM, &conf[1], 1); } diff --git a/lvgl_tft/ssd1306.h b/lvgl_tft/ssd1306.h index 62bd0e6..ea532e9 100644 --- a/lvgl_tft/ssd1306.h +++ b/lvgl_tft/ssd1306.h @@ -34,7 +34,7 @@ extern "C" { /********************** * GLOBAL PROTOTYPES **********************/ -void ssd1306_init(void); +void ssd1306_init(lv_disp_drv_t *disp_drv); void ssd1306_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); void ssd1306_rounder(lv_disp_drv_t * disp_drv, lv_area_t *area); void ssd1306_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,