I am having issues getting the LVGL library working with my nRF9160 Feather. I am using SDK version 2.5.0.
I have narrowed it down to the call to: `lv_task_handler()` not returning. I cannot figure out why.
I am using a 128 x 32 SSD1306 board from Amazon.
Can anyone see anything obvious that I am missing?
My .overlay file:
/ {
chosen {
zephyr,display = &display;
};
};
&i2c1 {
compatible = "nordic,nrf-twim";
zephyr,concat-buf-size = <1024>;
clock-frequency = <I2C_BITRATE_FAST>;
display: ssd1306@3c {
compatible = "solomon,ssd1306fb";
reg = <0x3c>; //0x3c is the i2c address of the SSD1306 aIC.
width = <128>;
height = <32>; // Change to '64' when using the 128x64 pixel version.
segment-offset = <0>;
page-offset = <0>;
display-offset = <0>;
multiplex-ratio = <31>; //change to '63' when using the 128x64 pixel version
segment-remap;
com-invdir;
com-sequential;
prechargep = <0x22>;
};
};
My prj.conf file:
# Heap and stacks CONFIG_INIT_STACKS=y CONFIG_MAIN_STACK_SIZE=2048 CONFIG_HEAP_MEM_POOL_SIZE=4092 # GPIO CONFIG_GPIO=y # Logging CONFIG_LOG=y CONFIG_CONSOLE=y # Sensors CONFIG_I2C=y CONFIG_SENSOR=y # Enable MCUboot bootloader # CONFIG_BOOTLOADER_MCUBOOT=y # Newlibc CONFIG_NEWLIB_LIBC=y # Display CONFIG_DISPLAY=y # CONFIG_DISPLAY_LOG_LEVEL_DBG=y CONFIG_SSD1306=y # CONFIG_SSD1306_SH1106_COMPATIBLE=y CONFIG_SSD1306_REVERSE_MODE=y CONFIG_LVGL=y CONFIG_LV_MEM_CUSTOM=y CONFIG_LV_USE_LABEL=y CONFIG_LV_USE_CANVAS=y CONFIG_LV_USE_LOG=y # CONFIG_LV_LOG_LEVEL_INFO=y CONFIG_LV_DPI_DEF=148 CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12=y CONFIG_LV_Z_MEM_POOL_NUMBER_BLOCKS=8 # CONFIG_SENSOR_LOG_LEVEL_DBG=y # CONFIG_AQW_LOG_LEVEL_DBG=y
My CMakeLists.txt:
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(lock-alert)
FILE(GLOB app_sources src/*.c)
target_sources(app PRIVATE ${app_sources})
And main.c:
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/drivers/display.h>
#include <zephyr/devicetree.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(aqw_basic_with_display_demo);
#include <lvgl.h>
static lv_obj_t *temp_label, *temp_value_label;
static int display_init(void)
{
const struct device *display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
if (!device_is_ready(display_dev))
{
LOG_ERR("Display not ready!");
return -EIO;
}
temp_label = lv_label_create(lv_scr_act());
lv_label_set_text(temp_label, "T: (C)");
lv_obj_align(temp_label, LV_ALIGN_TOP_MID, 0, 0);
lv_task_handler();
return 0;
}
void main(void)
{
int err = 0;
printf("Demo\n");
/* Get display */
err = display_init();
if (err)
__ASSERT_MSG_INFO("Unable to init display library. Err: %i", err);
while (1)
{
// lv_task_handler();
printf("here\n");
k_sleep(K_MSEC(1000));
}
}
I get output, but it is garbage as shown in the picture below. My while() loop does not seem to execute unless I comment out lv_task_handler on line 27 in main.c. I assume lv_task_handler is needed to properly process the screen updates.

I've attached a zip folder containing the project if helpful.