Esp32-s3 + ssd1305

Description

Hi,
I need some advice from more experienced people. I’m trying to get an OLED display (128x64 px) with an SSD1305 controller working on an ESP32-S3. I’m using LVGL as a component for ESP-IDF. I’m trying to draw the text “LVGL + SSD1305 OK” on the display, but my attempts are in vain. My code is below.
If I don’t use LVGL but control the display myself, everything works fine. But I would like to use the LVGL libraries, as they allow for wider usage possibilities.

I set color dept to 1-byte per pixel and enabled support for I1 collor format in the sdkconfig.
The output from the buffer after creating the text is below. The strange thing is that the buffer is full of 0xFF values ​​even though I explicitly clear it before.

Does anyone have experience with such a display in combination with LVGL?

The display is older and has burned-out segments, so don’t be surprised by the patterns in the attached photo.

What MCU/Processor/Board and compiler are you using?

Custom PCB board with ESP32-S3 and ESP-IDF v5.5.4

Code to reproduce

uint8_t LVGLBUFF[128*64/8+8];

void SSD1305_Init(uint8_t reset) {

  if (reset) {
   gpio_set_level(OLED_RES, 1);
    vTaskDelay(pdMS_TO_TICKS(10));
    gpio_set_level(OLED_RES, 0);
    vTaskDelay(pdMS_TO_TICKS(20));
    gpio_set_level(OLED_RES, 1);
  }

SSD1305_command(0xAE);	// turn off oled panel
//SSD1305_command(0x00);
//SSD1305_command(0x10);
//SSD1305_command(0x40);
SSD1305_command(0xAD);	// Master Configuration
SSD1305_command(0x8E);

SSD1305_command(0xA8);	// Multiplex Ratio
SSD1305_command(0x3F);

SSD1305_command(0xD3);	// Display Offset
SSD1305_command(0x00);

SSD1305_command(0x40);	// Display Start Line

SSD1305_command(0xC8);	// COM Output Scan Direction

SSD1305_command(0xDA);	// COM Pins Hardware Configuration
SSD1305_command(0x12);

SSD1305_command(0xD5);	// Display Clock Divide Ratio
SSD1305_command(0xF0);

SSD1305_command(0xD9);	// Pre-charge Period
SSD1305_command(0x22);

SSD1305_command(0x20);	// Memory Addressing Mode
SSD1305_command(0x00);

SSD1305_command(0x21);	// Column Address
SSD1305_command(0x00);
SSD1305_command(0x7F);

SSD1305_command(0x22);	// Page Address
SSD1305_command(0x00);
SSD1305_command(0x07);

SSD1305_command(0xD8);	// Area Color Mode
SSD1305_command(0x00);

SSD1305_command(0xA1);	// Segment Re-map

SSD1305_command(0xB0);	// Page Start Address

SSD1305_command(0x81);	// Contrast Control
SSD1305_command(0x80);

SSD1305_command(0xA4);	// Entire Display ON
SSD1305_command(0xA6);	// Normal display	
SSD1305_command(0xAF);	// Display ON
}

void SSD1305_UpdateDisplayWithBuffer(uint8_t *ptr) {
  SSD1305_command(0x00);
  SSD1305_command(0x10);

  gpio_set_level(OLED_CS, 1);
  	gpio_set_level(OLED_DC, 1);
  	gpio_set_level(OLED_CS, 0);

    SPI_xchg_array(ptr, 1024);
    gpio_set_level(OLED_CS, 1);
}

static void my_flush_cb(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map)
{
    LV_UNUSED(area);
	printf("Flush X0=%ld, Y0=%ld, X1=%ld, Y1=%ld\r\n", area->x1, area->y1, area->x2, area->y2);
	
	//lv_draw_sw_i1_convert_to_vtiled(px_map, 128 * 64 / 8+8, 128, 64, LVGLBUFF, sizeof(LVGLBUFF), true);

	if(xSemaphoreTake(spiMutex, 5) == pdTRUE){
    	SSD1305_UpdateDisplayWithBuffer(&LVGLBUFF[8]);
		xSemaphoreGive(spiMutex);
	}

    lv_display_flush_ready(disp);
}

void lv_port_display_init(void)
{
    lv_init();

    disp = lv_display_create(128, 64);

    lv_display_set_color_format(disp, LV_COLOR_FORMAT_I1);

    lv_display_set_buffers(disp, OLEDBUFF, NULL, sizeof(OLEDBUFF), LV_DISPLAY_RENDER_MODE_FULL);
	
	/*lv_theme_t * th = lv_theme_simple_init(disp);
	lv_disp_set_theme(disp, th);*/

    lv_display_set_flush_cb(disp, my_flush_cb);
	
	//lv_refr_set_round_cb( round_cb );
}

static void lvgl_task(void *arg)
{
SSD1305_Init(1);
	lv_port_display_init();
	
	// test objekt
	lv_obj_t *label = lv_label_create(lv_screen_active());
	lv_label_set_text(label, "LVGL + SSD1305 OK");
	lv_obj_center(label);
	
    while (1)
    {
        lv_timer_handler();
        vTaskDelay(pdMS_TO_TICKS(10));
		lv_tick_inc(10);
    }
}
OLEDBUFF dump:
W (24313) LVGL: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff
W (24313) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24313) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24313) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24323) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24323) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24333) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24343) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24343) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24353) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24353) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24363) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24363) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24373) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24373) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24383) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24393) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24393) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24403) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24403) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24413) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24413) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24423) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24423) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24433) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24443) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24443) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24453) LVGL: ff ff ff ff ff ff ff ff e7 e7 03 9f ff ff 80 c0
W (24453) LVGL: 60 18 40 70 70 3f c0 f3 e3 c6 01 9f fe 7f 80 c0
W (24463) LVGL: 60 08 40 60 30 3f 80 73 f3 cc 7b 9f fe 7f 1f 8f
W (24463) LVGL: e7 c6 7c e7 13 ff 1e 33 f3 c8 ff 9f fe 7f 1f 8f
W (24473) LVGL: e7 e6 78 c7 93 fe 3f 32 f1 88 ff 9f f0 0f 83 c1
W (24473) LVGL: e7 e6 70 47 90 3e 3f 30 f9 98 f9 9f f8 1f c0 e0
W (24483) LVGL: 67 e6 78 47 90 1e 3f 30 f8 18 f9 9f fe 7f fc fe
W (24493) LVGL: 67 e6 7e 07 9f 9e 3f 31 fc 3c 79 9f fe 7f bc 5e
W (24493) LVGL: 27 c6 5e 27 0f 9f 1e 33 1c 3e 01 80 ff ff 00 80
W (24503) LVGL: 60 0e 40 60 20 1f 80 73 0e 7f 03 80 7f ff 80 c0
W (24503) LVGL: 60 1e 40 70 70 3f c0 f3 ff ff ff ff ff ff ff ff
W (24513) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24513) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24523) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24523) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24533) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24543) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24543) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24553) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24553) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24563) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24563) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24573) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24573) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24583) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24593) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24593) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24603) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24603) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24613) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24613) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24623) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24623) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24633) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24643) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24643) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24653) LVGL: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
W (24653) LVGL: ff ff ff ff ff ff ff ff

My LVGL configuration:

# LVGL configuration
#
CONFIG_LV_CONF_SKIP=y
# CONFIG_LV_CONF_MINIMAL is not set

#
# Color Settings
#
# CONFIG_LV_COLOR_DEPTH_32 is not set
# CONFIG_LV_COLOR_DEPTH_24 is not set
# CONFIG_LV_COLOR_DEPTH_16 is not set
# CONFIG_LV_COLOR_DEPTH_8 is not set
CONFIG_LV_COLOR_DEPTH_1=y
CONFIG_LV_COLOR_DEPTH=1
# end of Color Settings

#
# Memory Settings
#
CONFIG_LV_USE_BUILTIN_MALLOC=y
# CONFIG_LV_USE_CLIB_MALLOC is not set
# CONFIG_LV_USE_MICROPYTHON_MALLOC is not set
# CONFIG_LV_USE_RTTHREAD_MALLOC is not set
# CONFIG_LV_USE_CUSTOM_MALLOC is not set
CONFIG_LV_USE_BUILTIN_STRING=y
# CONFIG_LV_USE_CLIB_STRING is not set
# CONFIG_LV_USE_CUSTOM_STRING is not set
CONFIG_LV_USE_BUILTIN_SPRINTF=y
# CONFIG_LV_USE_CLIB_SPRINTF is not set
# CONFIG_LV_USE_CUSTOM_SPRINTF is not set
CONFIG_LV_MEM_SIZE_KILOBYTES=64
CONFIG_LV_MEM_POOL_EXPAND_SIZE_KILOBYTES=0
CONFIG_LV_MEM_ADR=0x0
# end of Memory Settings

#
# HAL Settings
#
CONFIG_LV_DEF_REFR_PERIOD=33
CONFIG_LV_DPI_DEF=130
# end of HAL Settings

#
# Operating System (OS)
#
CONFIG_LV_OS_NONE=y
# CONFIG_LV_OS_PTHREAD is not set
# CONFIG_LV_OS_FREERTOS is not set
# CONFIG_LV_OS_CMSIS_RTOS2 is not set
# CONFIG_LV_OS_RTTHREAD is not set
# CONFIG_LV_OS_WINDOWS is not set
# CONFIG_LV_OS_MQX is not set
# CONFIG_LV_OS_SDL2 is not set
# CONFIG_LV_OS_CUSTOM is not set
# end of Operating System (OS)

#
# Rendering Configuration
#
CONFIG_LV_DRAW_BUF_STRIDE_ALIGN=1
CONFIG_LV_DRAW_BUF_ALIGN=4
CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE=24576
CONFIG_LV_DRAW_LAYER_MAX_MEMORY=0
CONFIG_LV_USE_DRAW_SW=y
# CONFIG_LV_DRAW_SW_SUPPORT_RGB565 is not set
# CONFIG_LV_DRAW_SW_SUPPORT_RGB565_SWAPPED is not set
# CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8 is not set
# CONFIG_LV_DRAW_SW_SUPPORT_RGB888 is not set
# CONFIG_LV_DRAW_SW_SUPPORT_XRGB8888 is not set
# CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888 is not set
# CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED is not set
# CONFIG_LV_DRAW_SW_SUPPORT_L8 is not set
# CONFIG_LV_DRAW_SW_SUPPORT_AL88 is not set
# CONFIG_LV_DRAW_SW_SUPPORT_A8 is not set
CONFIG_LV_DRAW_SW_SUPPORT_I1=y
CONFIG_LV_DRAW_SW_I1_LUM_THRESHOLD=127
CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT=1
# CONFIG_LV_USE_DRAW_ARM2D_SYNC is not set
# CONFIG_LV_USE_NATIVE_HELIUM_ASM is not set
# CONFIG_LV_DRAW_SW_COMPLEX is not set
# CONFIG_LV_USE_DRAW_SW_COMPLEX_GRADIENTS is not set
CONFIG_LV_DRAW_SW_ASM_NONE=y
# CONFIG_LV_DRAW_SW_ASM_NEON is not set
# CONFIG_LV_DRAW_SW_ASM_HELIUM is not set
# CONFIG_LV_DRAW_SW_ASM_RISCV_V is not set
# CONFIG_LV_DRAW_SW_ASM_CUSTOM is not set
CONFIG_LV_USE_DRAW_SW_ASM=0
# CONFIG_LV_USE_PXP is not set
# CONFIG_LV_USE_G2D is not set
# CONFIG_LV_USE_DRAW_DAVE2D is not set
# CONFIG_LV_USE_DRAW_SDL is not set
# CONFIG_LV_USE_DRAW_VG_LITE is not set
# CONFIG_LV_USE_VECTOR_GRAPHIC is not set
# CONFIG_LV_USE_DRAW_DMA2D is not set
# CONFIG_LV_USE_PPA is not set
# CONFIG_LV_USE_DRAW_EVE is not set
# end of Rendering Configuration

#
# Feature Configuration
#

#
# Logging
#
# CONFIG_LV_USE_LOG is not set
# end of Logging

#
# Asserts
#
CONFIG_LV_USE_ASSERT_NULL=y
CONFIG_LV_USE_ASSERT_MALLOC=y
# CONFIG_LV_USE_ASSERT_STYLE is not set
# CONFIG_LV_USE_ASSERT_MEM_INTEGRITY is not set
# CONFIG_LV_USE_ASSERT_OBJ is not set
CONFIG_LV_ASSERT_HANDLER_INCLUDE="assert.h"
# end of Asserts

#
# Debug
#
# CONFIG_LV_USE_REFR_DEBUG is not set
# CONFIG_LV_USE_LAYER_DEBUG is not set
# CONFIG_LV_USE_PARALLEL_DRAW_DEBUG is not set
# end of Debug

#
# Others
#
# CONFIG_LV_ENABLE_GLOBAL_CUSTOM is not set
CONFIG_LV_CACHE_DEF_SIZE=0
CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT=0
CONFIG_LV_GRADIENT_MAX_STOPS=2
CONFIG_LV_COLOR_MIX_ROUND_OFS=128
# CONFIG_LV_OBJ_STYLE_CACHE is not set
# CONFIG_LV_USE_OBJ_ID is not set
# CONFIG_LV_USE_OBJ_NAME is not set
# CONFIG_LV_USE_OBJ_PROPERTY is not set
# CONFIG_LV_USE_EXT_DATA is not set
# end of Others
# end of Feature Configuration

#
# Compiler Settings
#
# CONFIG_LV_BIG_ENDIAN_SYSTEM is not set
CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE=1
# CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM is not set
# CONFIG_LV_USE_FLOAT is not set
# CONFIG_LV_USE_MATRIX is not set
# CONFIG_LV_USE_PRIVATE_API is not set
# end of Compiler Settings

#
# Font Usage
#

#
# Enable built-in fonts
#
# CONFIG_LV_FONT_MONTSERRAT_8 is not set
# CONFIG_LV_FONT_MONTSERRAT_10 is not set
# CONFIG_LV_FONT_MONTSERRAT_12 is not set
CONFIG_LV_FONT_MONTSERRAT_14=y
# CONFIG_LV_FONT_MONTSERRAT_16 is not set
# CONFIG_LV_FONT_MONTSERRAT_18 is not set
# CONFIG_LV_FONT_MONTSERRAT_20 is not set
# CONFIG_LV_FONT_MONTSERRAT_22 is not set
# CONFIG_LV_FONT_MONTSERRAT_24 is not set
# CONFIG_LV_FONT_MONTSERRAT_26 is not set
# CONFIG_LV_FONT_MONTSERRAT_28 is not set
# CONFIG_LV_FONT_MONTSERRAT_30 is not set
# CONFIG_LV_FONT_MONTSERRAT_32 is not set
# CONFIG_LV_FONT_MONTSERRAT_34 is not set
# CONFIG_LV_FONT_MONTSERRAT_36 is not set
# CONFIG_LV_FONT_MONTSERRAT_38 is not set
# CONFIG_LV_FONT_MONTSERRAT_40 is not set
# CONFIG_LV_FONT_MONTSERRAT_42 is not set
# CONFIG_LV_FONT_MONTSERRAT_44 is not set
# CONFIG_LV_FONT_MONTSERRAT_46 is not set
# CONFIG_LV_FONT_MONTSERRAT_48 is not set
# CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED is not set
# CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW is not set
# CONFIG_LV_FONT_SOURCE_HAN_SANS_SC_14_CJK is not set
# CONFIG_LV_FONT_SOURCE_HAN_SANS_SC_16_CJK is not set
# CONFIG_LV_FONT_UNSCII_8 is not set
# CONFIG_LV_FONT_UNSCII_16 is not set
# end of Enable built-in fonts

# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_8 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_10 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12 is not set
CONFIG_LV_FONT_DEFAULT_MONTSERRAT_14=y
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_16 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_18 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_20 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_22 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_24 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_30 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_32 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_34 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_36 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_38 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_40 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_42 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_44 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_46 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_48 is not set
# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED is not set
# CONFIG_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW is not set
# CONFIG_LV_FONT_DEFAULT_SOURCE_HAN_SANS_SC_14_CJK is not set
# CONFIG_LV_FONT_DEFAULT_SOURCE_HAN_SANS_SC_16_CJK is not set
# CONFIG_LV_FONT_DEFAULT_UNSCII_8 is not set
# CONFIG_LV_FONT_DEFAULT_UNSCII_16 is not set
# CONFIG_LV_FONT_FMT_TXT_LARGE is not set
# CONFIG_LV_USE_FONT_COMPRESSED is not set
CONFIG_LV_USE_FONT_PLACEHOLDER=y

#
# Enable static fonts
#
# end of Enable static fonts
# end of Font Usage

#
# Text Settings
#
CONFIG_LV_TXT_ENC_UTF8=y
# CONFIG_LV_TXT_ENC_ASCII is not set
CONFIG_LV_TXT_BREAK_CHARS=" ,.;:-_)}"
CONFIG_LV_TXT_LINE_BREAK_LONG_LEN=0
CONFIG_LV_TXT_COLOR_CMD="#"
# CONFIG_LV_USE_BIDI is not set
# CONFIG_LV_USE_ARABIC_PERSIAN_CHARS is not set
# end of Text Settings

#
# Widget Usage
#
CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE=y
CONFIG_LV_USE_ANIMIMG=y
CONFIG_LV_USE_ARC=y
CONFIG_LV_USE_ARCLABEL=y
CONFIG_LV_USE_BAR=y
CONFIG_LV_USE_BUTTON=y
CONFIG_LV_USE_BUTTONMATRIX=y
CONFIG_LV_USE_CALENDAR=y
# CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY is not set

#
# Days name configuration
#
CONFIG_LV_MONDAY_STR="Mo"
CONFIG_LV_TUESDAY_STR="Tu"
CONFIG_LV_WEDNESDAY_STR="We"
CONFIG_LV_THURSDAY_STR="Th"
CONFIG_LV_FRIDAY_STR="Fr"
CONFIG_LV_SATURDAY_STR="Sa"
CONFIG_LV_SUNDAY_STR="Su"
# end of Days name configuration

CONFIG_LV_USE_CALENDAR_HEADER_ARROW=y
CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN=y
# CONFIG_LV_USE_CALENDAR_CHINESE is not set
CONFIG_LV_USE_CANVAS=y
CONFIG_LV_USE_CHART=y
CONFIG_LV_USE_CHECKBOX=y
CONFIG_LV_USE_DROPDOWN=y
CONFIG_LV_USE_IMAGE=y
CONFIG_LV_USE_IMAGEBUTTON=y
CONFIG_LV_USE_KEYBOARD=y
CONFIG_LV_USE_LABEL=y
CONFIG_LV_LABEL_TEXT_SELECTION=y
CONFIG_LV_LABEL_LONG_TXT_HINT=y
CONFIG_LV_LABEL_WAIT_CHAR_COUNT=3
CONFIG_LV_USE_LED=y
CONFIG_LV_USE_LINE=y
CONFIG_LV_USE_LIST=y
CONFIG_LV_USE_MENU=y
CONFIG_LV_USE_MSGBOX=y
CONFIG_LV_USE_ROLLER=y
CONFIG_LV_USE_SCALE=y
CONFIG_LV_USE_SLIDER=y
CONFIG_LV_USE_SPAN=y
CONFIG_LV_SPAN_SNIPPET_STACK_SIZE=64
CONFIG_LV_USE_SPINBOX=y
CONFIG_LV_USE_SPINNER=y
CONFIG_LV_USE_SWITCH=y
CONFIG_LV_USE_TEXTAREA=y
CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME=1500
CONFIG_LV_USE_TABLE=y
CONFIG_LV_USE_TABVIEW=y
CONFIG_LV_USE_TILEVIEW=y
CONFIG_LV_USE_WIN=y
# end of Widget Usage

#
# Themes
#
CONFIG_LV_USE_THEME_DEFAULT=y
# CONFIG_LV_THEME_DEFAULT_DARK is not set
CONFIG_LV_THEME_DEFAULT_GROW=y
CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME=80
CONFIG_LV_USE_THEME_SIMPLE=y
# CONFIG_LV_USE_THEME_MONO is not set
# end of Themes

#
# Layouts
#
CONFIG_LV_USE_FLEX=y
CONFIG_LV_USE_GRID=y
# end of Layouts

#
# 3rd Party Libraries
#
CONFIG_LV_FS_DEFAULT_DRIVER_LETTER=0
# CONFIG_LV_USE_FS_STDIO is not set
# CONFIG_LV_USE_FS_POSIX is not set
# CONFIG_LV_USE_FS_WIN32 is not set
# CONFIG_LV_USE_FS_FATFS is not set
# CONFIG_LV_USE_FS_MEMFS is not set
# CONFIG_LV_USE_FS_LITTLEFS is not set
# CONFIG_LV_USE_FS_ARDUINO_ESP_LITTLEFS is not set
# CONFIG_LV_USE_FS_ARDUINO_SD is not set
# CONFIG_LV_USE_FS_UEFI is not set
# CONFIG_LV_USE_FS_FROGFS is not set
# CONFIG_LV_USE_LODEPNG is not set
# CONFIG_LV_USE_LIBPNG is not set
# CONFIG_LV_USE_BMP is not set
# CONFIG_LV_USE_TJPGD is not set
# CONFIG_LV_USE_LIBJPEG_TURBO is not set
# CONFIG_LV_USE_LIBWEBP is not set
# CONFIG_LV_USE_GIF is not set
# CONFIG_LV_BIN_DECODER_RAM_LOAD is not set
# CONFIG_LV_USE_RLE is not set
# CONFIG_LV_USE_QRCODE is not set
# CONFIG_LV_USE_BARCODE is not set
# CONFIG_LV_USE_FREETYPE is not set
# CONFIG_LV_USE_TINY_TTF is not set
# CONFIG_LV_USE_RLOTTIE is not set
# CONFIG_LV_USE_THORVG is not set
# CONFIG_LV_USE_NANOVG is not set
# CONFIG_LV_USE_LZ4 is not set
# CONFIG_LV_USE_FFMPEG is not set
# end of 3rd Party Libraries

#
# Others
#
# CONFIG_LV_USE_SNAPSHOT is not set
# CONFIG_LV_USE_SYSMON is not set
# CONFIG_LV_USE_PROFILER is not set
# CONFIG_LV_USE_MONKEY is not set
# CONFIG_LV_USE_GRIDNAV is not set
# CONFIG_LV_USE_FRAGMENT is not set
# CONFIG_LV_USE_IMGFONT is not set
CONFIG_LV_USE_OBSERVER=y
# CONFIG_LV_USE_IME_PINYIN is not set
# CONFIG_LV_USE_FILE_EXPLORER is not set
# CONFIG_LV_USE_FONT_MANAGER is not set
# CONFIG_LV_USE_TEST is not set
# CONFIG_LV_USE_TRANSLATION is not set
# CONFIG_LV_USE_COLOR_FILTER is not set
CONFIG_LVGL_VERSION_MAJOR=9
CONFIG_LVGL_VERSION_MINOR=5
CONFIG_LVGL_VERSION_PATCH=0
# end of Others

#
# Devices
#
# CONFIG_LV_USE_SDL is not set
# CONFIG_LV_USE_X11 is not set
# CONFIG_LV_USE_WAYLAND is not set
# CONFIG_LV_USE_LINUX_FBDEV is not set
# CONFIG_LV_USE_NUTTX is not set
# CONFIG_LV_USE_LINUX_DRM is not set
# CONFIG_LV_USE_TFT_ESPI is not set
# CONFIG_LV_USE_LOVYAN_GFX is not set
# CONFIG_LV_USE_EVDEV is not set
# CONFIG_LV_USE_LIBINPUT is not set
# CONFIG_LV_USE_ST7735 is not set
# CONFIG_LV_USE_ST7789 is not set
# CONFIG_LV_USE_ST7796 is not set
# CONFIG_LV_USE_ILI9341 is not set
# CONFIG_LV_USE_GENERIC_MIPI is not set
# CONFIG_LV_USE_NXP_ELCDIF is not set
# CONFIG_LV_USE_RENESAS_GLCDC is not set
# CONFIG_LV_USE_ST_LTDC is not set
# CONFIG_LV_USE_FT81X is not set
# CONFIG_LV_USE_UEFI is not set
# CONFIG_LV_USE_QNX is not set
# end of Devices

#
# Examples
#
# CONFIG_LV_BUILD_EXAMPLES is not set
# end of Examples

#
# Demos
#
# CONFIG_LV_BUILD_DEMOS is not set
# end of Demos
# end of LVGL configuration

Screenshot and/or video

Admin edit: post is very likely AI generated but still seems to be on-topic. Take with a grain of salt.

The 0xFF buffer problem

This is the key clue. LVGL’s I1 (1-bit) color format uses ⁠ 0 ⁠ for black and ⁠ 1 ⁠ for white, but the polarity depends on how LVGL interprets “background color.” When you create a label with a white/light background, LVGL fills with ⁠ 0xFF ⁠ (all pixels on). That’s actually correct behavior — it means your clear isn’t wrong, LVGL is just overwriting it with the background fill.

The garbled output

The display shows something that looks like text but scrambled. Classic causes:

1.⁠ ⁠Bit order mismatch — SSD1305 expects data MSB-first per byte, but LVGL’s I1 format may output LSB-first (or vice versa). You likely need to bit-reverse each byte before sending. This is the #1 culprit with monochrome LVGL + OLED combos.

2.⁠ ⁠Page vs. column addressing mismatch — SSD1305 uses page-addressed memory (8 rows per page, columns left→right). LVGL’s buffer is row-major. If your flush callback is doing a naive ⁠ memcpy ⁠ to the display without reordering into pages, you’ll get exactly this kind of scramble.

3.⁠ ⁠Stride/padding — LVGL may pad each row to a byte boundary differently than you expect. For 128px wide: 128 bits = exactly 16 bytes, so no padding issue here, but worth confirming.

What to check/try

In your flush callback, before sending to the display, try bit-reversing each byte:
⁠ c
for (int i = 0; i < buf_size; i++) {
uint8_t b = buf[i];
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
buf[i] = b;
}

Also double-check: are you converting from LVGL’s row-major layout to SSD1305’s page layout? For a 128×64 display that’s 8 pages × 128 columns. LVGL gives you rows top-to-bottom; SSD1305 wants columns packed into pages. You need to transpose.

What the dump tells us

The buffer is 128×64 = 8192 bits = 1024 bytes. Looking at the non-FF region (around bytes 448–608), you can see structured data — that’s your text “LVGL + SSD1305 OK”. The ⁠ 0xFF ⁠ surrounding it means white background, black text in LVGL’s I1 format where ⁠ 1 ⁠ = white pixel.

The text appearing garbled on the display is almost certainly because:

1.⁠ ⁠Bit polarity — SSD1305 with ⁠ 0 ⁠ = pixel ON is the opposite of what LVGL outputs (⁠ 1 ⁠ = white). You need to invert.
2.⁠ ⁠Bit order within each byte — LVGL outputs MSB = leftmost pixel; SSD1305 may expect the opposite depending on your ⁠ SEG_REMAP ⁠ config.

Fix in your flush callback

Before sending each byte to the display, invert it:

static void ssd1305_flush_cb(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map) {
    uint32_t buf_size = /* your buffer size in bytes */;
    
    for (int i = 0; i < buf_size; i++) {
        px_map[i] = ~px_map[i];  // invert: LVGL 0xFF white → 0x00 display off
    }
    
    // ... then send px_map to display via I2C/SPI
    
    lv_display_flush_ready(disp);
}

If it’s still mirrored/scrambled after inverting, add the bit-reverse too:

static inline uint8_t bit_reverse(uint8_t b) {
    b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
    b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
    b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
    return b;
}

// In flush callback:
for (int i = 0; i < buf_size; i++) {
    px_map[i] = bit_reverse(~px_map[i]);
}

One more thing to verify

Your buffer dump starts with ⁠ 00 00 00 00 00 00 00 00 ff ff ff… ⁠ — those first 8 zero bytes are suspicious. Only 8 zeros… Could be a header, or LVGL padding, or your dump offset is mid-row. Make sure your flush callback is pointing at the actual pixel data and not including any LVGL-internal header bytes — in LVGL v9 with I1 format, ⁠ px_map ⁠ should point directly to pixel data, no offset needed.

Try the ⁠ ~ ⁠ invert first — I’d bet that alone fixes it.