Porting overview

Learn the basics about how to port LVGL to any hardware

Edit on GitHub

Quick start

The following is an overview of how to integrate LVGL into your project. A more detailed description is available at Overview.

The main steps are the following:

Driver Initialization: It is the user's responsibility to set up the clock, timers, peripherals, etc.

Call lv_init(): Initialize LVGL itself.

Create display and input devices and set up the tick: Create display(s) (lv_display_t) and input device(s) (lv_indev_t) and set up their callbacks.

Create the UI: Call LVGL functions to create screens, widgets, styles, animations, events, etc.

Call lv_timer_handler() in a loop: This handles all the LVGL-related tasks, such as refreshing display(s), reading input devices, firing events based on user input, running animations, and running user-created timers.

This is just a brief example of how to add LVGL to a new project.

 
void main(void)
{
    your_driver_init();

    lv_init();

    lv_tick_set_cb(my_get_millis);

    lv_display_t * display = lv_display_create(320, 240);

    /* LVGL will render to this 1/10 screen sized buffer for 2 bytes/pixel */
    static uint8_t buf[320 * 240 / 10 * 2];
    lv_display_set_buffers(display, buf, NULL, sizeof(buf), LV_DISPLAY_RENDER_MODE_PARTIAL);

    /* This callback will display the rendered image */
    lv_display_set_flush_cb(display, my_flush_cb);

    /* Create widgets */
    lv_obj_t * label = lv_label_create(lv_screen_active());
    lv_label_set_text(label, "Hello LVGL!");

    /* Make LVGL periodically execute its tasks */
    while(1) {
        /* Provide updates to currently-displayed Widgets here. */
        lv_timer_handler();
        my_sleep(5);  /*Wait 5 milliseconds before processing LVGL timer again*/
    }
}

/* Return the elapsed milliseconds since startup.
 * It needs to be implemented by the user */
uint32_t my_get_millis(void)
{
    return my_tick_ms;
}

/* Copy rendered image to screen.
 * This needs to be implemented by the user. */
void my_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_buf)
{
    /* Show the rendered image on the display */
    my_display_update(area, px_buf);

    /* Indicate that the buffer is available.
     * If DMA were used, call in the DMA complete interrupt. */
    lv_display_flush_ready(disp);
}

Drivers

Custom driver

By writing a custom flush_cb for your display and read_cb for the input devices you can easily create your own drivers. Learn more in the Integration section.

Built-in drivers

LVGL comes with many built-in drivers for display controllers (like ILI9341, ST7789, etc.), Linux drivers (like Wayland, DRM, etc.), (RT)OS support (FreeRTOS, NuttX, Linux, etc.), and GPUs (Dave2D, VG-Lite, OpenGL ES, etc.).

These just need to be enabled in lv_conf.h to use them right away. Learn more about the built-in drivers in the Integration section.

Last updated on

On this page