- ...
- SDK
- Yocto
- ...
- ...
- your first application
- tools
- ...
Getting started with LVGL#
If you want to create a SimpleSwitch™ application using LVGL, please follow this guide to get you easily started.
Example Project#
Here is a very small LVGL project, with a single C source file, main.c:
//SPDX-FileCopyrightText: (C) 2025 Avnet Embedded GmbH
//SPDX-License-Identifier: LicenseRef-Avnet-OSS-1.0
#include "lvgl.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
int main(void)
{
int width = 400, height = 400;
lv_init();
lv_display_t * disp = lv_wayland_window_create(width, height, "LVGL Wayland helloworld", NULL);
lv_indev_t *touch = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event1");
lv_indev_set_display(touch, disp);
/*Change the active screen's background color*/
lv_obj_set_style_bg_color(lv_screen_active(), lv_color_hex(0x003a57), LV_PART_MAIN);
/*Create a white label, set its text and align it to the center*/
lv_obj_t * label = lv_label_create(lv_screen_active());
lv_label_set_text(label, "Hello world");
lv_obj_set_style_text_color(lv_screen_active(), lv_color_hex(0xffffff), LV_PART_MAIN);
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
uint32_t idle_time;
/*Handle LVGL tasks*/
while(1) {
idle_time = lv_wayland_timer_handler();
if(idle_time != 0) {
usleep(idle_time * 1000);
}
/* Run until the last window closes */
if (!lv_wayland_window_is_open(NULL)) {
break;
}
}
return 0;
}
And a Makefile:
# SPDX-FileCopyrightText: (C) 2025 Avnet Embedded GmbH
# SPDX-License-Identifier: LicenseRef-Avnet-OSS-1.0
BIN = lvgl_test_prog
OBJS = main.o
BINDIR ?= /usr/bin
SDKTARGETSYSROOT_LVGL = $(OECORE_NATIVE_SYSROOT_LVGL)/../$(notdir $(SDKTARGETSYSROOT))
LIBDIR = $(SDKTARGETSYSROOT_LVGL)/usr/lib
CFLAGS += -I${SDKTARGETSYSROOT_LVGL}/usr/include/lvgl -I${SDKTARGETSYSROOT_LVGL}/usr/include/lvgl/drivers/wayland -D_DEFAULT_SOURCE -D_REENTRANT -Wall -Werror -pedantic -std=c99
LIBS += --sysroot=${SDKTARGETSYSROOT_LVGL}/ -L$(LIBDIR) -llvgl -lpthread -lwayland-client -lwayland-cursor -lxkbcommon
all: $(BIN)
$(BIN): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
clean:
rm -f $(BIN) $(OBJS)
install: $(BIN)
install -m 0755 -d "$(PREFIX)/$(BINDIR)/"
install -m 0755 $(BIN) "$(PREFIX)/$(BINDIR)/"
.PHONY: clean install
One can build this project for the host system by putting both file in the same
directory and running make
make
./lvgl_test_prog
Build the project using a Makefile#
With a makefile aware of cross-compilation, building the binary is as simple as
sourcing the SDK (see Source the SDK) and running make, e.g.
make
If the makefile has an install target using the PREFIX variable as
installation path, it can be used directly with the --makefile-dir option of
the Generate a SimpleSwitch™ package script
simpleswitch-generate-package --name simpleswitch-example --makefile-dir . \
--template lvgl --startup-command /usr/bin/lvgl_test_prog
Or if you want to be able to debug your application:
simpleswitch-generate-package --name simpleswitch-example --makefile-dir . \
--template lvgl --startup-command "while true; do gdbserver :2159 /usr/bin/lvgl_test_prog ; done"
If your makefile lack of a compatible install target, see below.
Deploy to the target#
Now it is time to deploy the generated SimpleSwitch™ container to the device. For this please see Deploy a SimpleSwitch™ package
Remote debugging a LVGL application#
To remote debugging a LVGL application, you can see Remote debug a SimpleSwitch™ package