goran-mahovlic / lv_port_esp32

LVGL ported to ESP32 including various display and touchpad drivers

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LVGL project for ESP32 epapers in develop branch

This is an ESP32 fork project showcasing LVGL v7 with support for several display controllers and touch controllers. The intention is to use the set_px_cb callback to make LVGL work with different epapers that we already support in CalEPD component. CalEPD is an ESP-IDF component that supports many different epapers (SPI & Paralell using EPDiy as a bridge component) The development repository where everything is tested before landing in their own component repositories is Cale-idf. The demo application is the lv_demo_widgets project from the lv_examples repository.

  • Version of ESP-IDF required 4.2. NOTE: We're trying to make this repo backwards compatible, usage of idf.py is encouraged.
  • Version of LVGL used: 7.9.
  • Version of lv_examples used: 7.9.
  • Important please use lvgl component in branch release/v7 and this main repository in develop branch.
  • Comment FT touch component require in CalEPD CMakeLists and leave only EpdParalell and their related classes (parallel and comment the rest)
  • SPI epapers supported in CalEPD can be used but then VSPI should be selected in LVGL. I will leave a generic SPI driver soon.

The main idea is to use CalEPD as a component and the set_px_cb callback to draw each pixel. This will have a performance hit but it will also allow us to draw UX interfaces in different epapers, like complex 4 SPI combined displays, that are the moment are very difficult to support with LVGL as is. The plan also includes adding the epaper folder in the lvgl_esp32_drivers linked component to separate it from TFT. Touch comes later and it will be better to adapt new I2C Touch drivers directly in the lvgl_esp32_drivers repository, that needs to be forked as well to add the epaper drivers.

Table of content

Example demo for TFT displays:

Example GUI_DEMO with ESP32 using LVGL

Display and touch controllers

The display and touch (indev) controllers are now into it's own repository, you can find it here. To report any issue or add new display or touch (indev) drivers you can do so in the lvgl_esp32_drivers repo.

Get started

Prerequisites

  • ESP-IDF Framework.

Note

This project tries to be compatible with both the ESP-IDF v3.x and v4.0, but using v4.0 is recommended. Instructions assume you are using the v4.x toolchain, otherwise use the make commands, e.g. instead of running idf.py menuconfig, run make menuconfig.

Build and run the demo.

  1. Clone this project by git clone --recurse-submodules https://github.com/martinberlin/lv_port_esp32-epaper, this will pull this repo and its submodules.

  2. Get into the created lv_port_esp32 directory.

  3. Run idf.py menuconfig

  4. Configure LVGL in Components config->LVGL Configuration. For monochrome displays use the mono theme and we suggest enabling the unscii 8 font.

  5. Configure your display and/or touch controllers in Components config->LVGL TFT Display Configuration and Components config->LVGL TOUCH Configuration.

  6. Store your project configuration.

  7. Build the project with idf.py build

  8. If the build don't throw any errors, flash the demo with idf.py -p (YOUR SERIAL PORT) flash (with make this is just make flash - in 3.x PORT is configured in menuconfig)

Use LVGL in your ESP-IDF project

LVGL now includes a Kconfig file which is used to configure most of the LVGL configuration options via menuconfig, so it's not necessary to use a custom lv_conf.h file.

It is recommended to add LVGL as a submodule in your IDF project's git repo.

From your project's root directory:

  1. Create a directory named components (if you don't have one already) with mkdir -p components.
  2. Clone the lvgl repository inside the components directory with git submodule add https://github.com/lvgl/lvgl.git components/lvgl
  3. Run idf.py menuconfig, go to Component config then LVGL configuration to configure LVGL.

Use lvgl_esp32_drivers in your project

It is recommended to add lvgl_esp32_drivers as a submodule in your IDF project's git repo.

From your project's root directory:

  1. Create a directory named components (if you don't have one already) with mkdir -p components.
  2. Clone the lvgl_esp32_drivers repository inside the components directory with git submodule add https://github.com/lvgl/lvgl_esp32_drivers.git components/lvgl_esp32_drivers
  3. Run idf.py menuconfig, go to Component config then LVGL TFT configuration and LVGL TFT Display configuration to configure lvgl_esp32_drivers.

Platformio support

Using the lv_platformio project add the following lines to platformio.ini file:

[env:esp32]
platform = espressif32
framework = espidf
board = esp-wrover-kit

Change the default environment to default_envs = esp32.

Modify the main.c like this:

#include "lvgl.h"

// #include "driver.h"

#include "demo.h"

int app_main(void)
{
    lv_init();

    /* Initialize your hardware. */
    
    /* hw_init(); */

    demo_create();

    /* Create the UI or start a task for it.
     * In the end, don't forget to call `lv_task_handler` in a loop. */

    /* hw_loop(); */

    return 0;
}

For more information see: platformio with espidf framework compability.

ESP32-S2 Support

Support for ESP32-S2 variant is Work In Progress. Smaller displays (e.g. 320x240) work fine, but larger ones need testing.

Background

ESP32-S2 has less on-chip SRAM than its predecessor ESP32 (520kB vs. 320kB). This causes problems with memory allocation with large LVGL display buffers as they don't fit into the on-chip memory and external PSRAM is not accessible by DMA.

Moreover, static allocation to external PSRAM is not yet supported (see GitHub issue).

At this momement, the buffers are dynamicaly allocated with DMA capabilty and memory allocator handles the rest.

About

LVGL ported to ESP32 including various display and touchpad drivers

License:MIT License


Languages

Language:C 81.9%Language:Makefile 8.4%Language:CMake 6.9%Language:Shell 2.8%