2021-04-12 18:19:04 +02:00
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/intro/index.md
```
# Introduction
2021-06-09 15:10:35 +02:00
LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint.
2021-04-12 18:19:04 +02:00
## Key features
2021-06-09 15:10:35 +02:00
- Powerful building blocks such as buttons, charts, lists, sliders, images, etc.
2021-04-12 18:19:04 +02:00
- Advanced graphics with animations, anti-aliasing, opacity, smooth scrolling
2021-06-09 15:10:35 +02:00
- Various input devices such as touchpad, mouse, keyboard, encoder, etc.
2021-04-12 18:19:04 +02:00
- Multi-language support with UTF-8 encoding
2021-06-09 15:10:35 +02:00
- Multi-display support, i.e. use multiple TFT, monochrome displays simultaneously
- Fully customizable graphic elements with CSS-like styles
- Hardware independent: use with any microcontroller or display
- Scalable: able to operate with little memory (64 kB Flash, 16 kB RAM)
- OS, external memory and GPU supported but not required
- Single frame buffer operation even with advanced graphic effects
2021-04-12 18:19:04 +02:00
- Written in C for maximal compatibility (C++ compatible)
- Simulator to start embedded GUI design on a PC without embedded hardware
- Binding to MicroPython
- Tutorials, examples, themes for rapid GUI design
2021-05-20 22:25:47 +02:00
- Documentation is available online and PDF
2021-04-12 18:19:04 +02:00
- Free and open-source under MIT license
## Requirements
Basically, every modern controller (which is able to drive a display) is suitable to run LVGL. The minimal requirements are:
< ul >
< li > 16, 32 or 64 bit microcontroller or processor< / li >
< li > > 16 MHz clock speed is recommended< / li >
< li > Flash/ROM: > 64 kB for the very essential components (> 180 kB is recommended)< / li >
< li > RAM:
< ul >
< li > Static RAM usage: ~2 kB depending on the used features and objects types< / li >
< li > Stack: > 2kB (> 8 kB is recommended)< / li >
2021-05-20 22:25:47 +02:00
< li > Dynamic data (heap): > 4 KB (> 32 kB is recommended if using several objects).
2021-04-12 18:19:04 +02:00
Set by < em > LV_MEM_SIZE< / em > in < em > lv_conf.h< / em > . < / li >
< li > Display buffer: > < em > "Horizontal resolution"< / em > pixels (> 10 × < em > "Horizontal resolution"< / em > is recommended) < / li >
< li > One frame buffer in the MCU or in external display controller< / li >
< / ul >
< / li >
< li > C99 or newer compiler< / li >
< li > Basic C (or C++) knowledge:
< a href = "https://www.tutorialspoint.com/cprogramming/c_pointers.htm" > pointers< / a > ,
< a href = "https://www.tutorialspoint.com/cprogramming/c_structures.htm" > structs< / a > ,
2021-05-20 22:25:47 +02:00
< a href = "https://www.geeksforgeeks.org/callbacks-in-c/" > callbacks< / a > .< / li >
2021-04-12 18:19:04 +02:00
< / ul >
2021-06-09 15:10:35 +02:00
< em > Note that memory usage may vary depending on architecture, compiler and build options.< / em >
2021-04-12 18:19:04 +02:00
## License
The LVGL project (including all repositories) is licensed under [MIT license ](https://github.com/lvgl/lvgl/blob/master/LICENCE.txt ).
It means you can use it even in commercial projects.
2021-06-09 15:10:35 +02:00
It's not mandatory but we highly appreciate it if you write a few words about your project in the [My projects ](https://forum.lvgl.io/c/my-projects/10 ) category of the forum or a private message to [lvgl.io ](https://lvgl.io/#contact ).
2021-04-12 18:19:04 +02:00
2021-06-09 15:10:35 +02:00
Although you can get LVGL for free there is a massive amount of work behind it. It's created by a group of volunteers who made it available for you in their free time.
2021-04-12 18:19:04 +02:00
2021-06-09 15:10:35 +02:00
To make the LVGL project sustainable, please consider [contributing ](/CONTRIBUTING ) to the project.
You can choose from [many different ways of contributing ](/CONTRIBUTING ) such as simply writing a tweet about you are using LVGL, fixing bugs, translating the documentation, or even becoming a maintainer.
2021-04-12 18:19:04 +02:00
## Repository layout
2021-06-09 15:10:35 +02:00
All repositories of the LVGL project are hosted on GitHub: https://github.com/lvgl
2021-04-12 18:19:04 +02:00
2021-06-09 15:10:35 +02:00
You will find these repositories there:
2021-05-20 22:25:47 +02:00
- [lvgl ](https://github.com/lvgl/lvgl ) The library itself with many [examples ](https://github.com/lvgl/lvgl/blob/master/examples/ ).
- [lv_demos ](https://github.com/lvgl/lv_demos ) Demos created with LVGL.
2021-04-12 18:19:04 +02:00
- [lv_drivers ](https://github.com/lvgl/lv_drivers ) Display and input device drivers
- [blog ](https://github.com/lvgl/blog ) Source of the blog's site (https://blog.lvgl.io)
- [sim ](https://github.com/lvgl/sim ) Source of the online simulator's site (https://sim.lvgl.io)
- [lv_sim_... ](https://github.com/lvgl?q=lv_sim&type=&language= ) Simulator projects for various IDEs and platforms
- [lv_port_... ](https://github.com/lvgl?q=lv_port&type=&language= ) LVGL ports to development boards
- [lv_binding_.. ](https://github.com/lvgl?q=lv_binding&type=&language=l ) Bindings to other languages
- [lv_... ](https://github.com/lvgl?q=lv_&type=&language= ) Ports to other platforms
## Release policy
The core repositories follow the rules of [Semantic versioning ](https://semver.org/ ):
- Major versions for incompatible API changes. E.g. v5.0.0, v6.0.0
- Minor version for new but backward-compatible functionalities. E.g. v6.1.0, v6.2.0
- Patch version for backward-compatible bug fixes. E.g. v6.1.1, v6.1.2
2021-05-20 22:25:47 +02:00
Tags like `vX.Y.Z` are created for every release.
2021-04-12 18:19:04 +02:00
### Release cycle
2021-05-20 22:25:47 +02:00
- Bugfixes: Released on demand even weekly
2021-06-09 15:10:35 +02:00
- Minor releases: Every 3-4 months
2021-05-20 22:25:47 +02:00
- Major releases: Approximatelly yearly
2021-04-12 18:19:04 +02:00
2021-05-20 22:25:47 +02:00
### Branches
The core repositories have at least the following branches:
- `master` latest version, patches are merged directly here.
- `release/vX.Y` stable versions of the minor releases
- `fix/some-description` temporal branches for bug fixes
- `feat/some-description` temporal branches for features
2021-04-12 18:19:04 +02:00
### Changelog
2021-05-20 22:25:47 +02:00
The changes are recorded in [CHANGELOG.md ](/CHANGELOG ).
2021-04-12 18:19:04 +02:00
### Version support
2021-06-09 15:10:35 +02:00
Before v8 every minor release of major releases is supported for 1 year.
2021-05-20 22:25:47 +02:00
From v8 every minor release is supported for 1 year.
2021-04-12 18:19:04 +02:00
2021-05-20 22:25:47 +02:00
| Version | Release date | Support end | Active |
|---------|--------------|-------------|--------|
| v5.3 | Feb 1, 2019 |Feb 1, 2020 | No |
| v6.1 | Nov 26, 2019 |Nov 26, 2020 | No |
| v7.11 | Mar 16, 2021 |Mar 16, 2022 | Yes |
| v8.0 | In progress | | |
2021-04-12 18:19:04 +02:00
## FAQ
### Where can I ask questions?
2021-06-09 15:10:35 +02:00
You can ask questions in the forum: [https://forum.lvgl.io/ ](https://forum.lvgl.io/ ).
2021-04-12 18:19:04 +02:00
We use [GitHub issues ](https://github.com/lvgl/lvgl/issues ) for development related discussion.
So you should use them only if your question or issue is tightly related to the development of the library.
### Is my MCU/hardware supported?
Every MCU which is capable of driving a display via Parallel port, SPI, RGB interface or anything else and fulfills the [Requirements ](#requirements ) is supported by LLVGL.
2021-06-09 15:10:35 +02:00
This includes:
2021-04-12 18:19:04 +02:00
- "Common" MCUs like STM32F, STM32H, NXP Kinetis, LPC, iMX, dsPIC33, PIC32 etc.
- Bluetooth, GSM, WiFi modules like Nordic NRF and Espressif ESP32
2021-06-09 15:10:35 +02:00
- Linux with frame buffer device such as /dev/fb0. This includes Single-board computers like the Raspberry Pi
2021-04-12 18:19:04 +02:00
- And anything else with a strong enough MCU and a periphery to drive a display
### Is my display supported?
LVGL needs just one simple driver function to copy an array of pixels into a given area of the display.
If you can do this with your display then you can use that display with LVGL.
Some examples of the supported display types:
- TFTs with 16 or 24 bit color depth
- Monitors with HDMI port
- Small monochrome displays
- Gray-scale displays
- even LED matrices
- or any other display where you can control the color/state of the pixels
See the [Porting ](/porting/display ) section to learn more.
### Nothing happens, my display driver is not called. What have I missed?
2021-05-20 22:25:47 +02:00
Be sure you are calling `lv_tick_inc(x)` in an interrupt and `lv_timer_handler()` in your main `while(1)` .
2021-04-12 18:19:04 +02:00
Learn more in the [Tick ](/porting/tick ) and [Task handler ](/porting/task-handler ) section.
2021-06-09 15:10:35 +02:00
### Why is the display driver called only once? Only the upper part of the display is refreshed.
2021-04-12 18:19:04 +02:00
Be sure you are calling `lv_disp_flush_ready(drv)` at the end of your "*display flush callback*".
2021-06-09 15:10:35 +02:00
### Why do I see only garbage on the screen?
Probably there a bug in your display driver. Try the following code without using LVGL. You should see a square with red-blue gradient.
2021-04-12 18:19:04 +02:00
```c
#define BUF_W 20
#define BUF_H 10
lv_color_t buf[BUF_W * BUF_H];
lv_color_t * buf_p = buf;
uint16_t x, y;
for(y = 0; y < BUF_H; y++) {
lv_color_t c = lv_color_mix(LV_COLOR_BLUE, LV_COLOR_RED, (y * 255) / BUF_H);
for(x = 0; x < BUF_W; x++){
(*buf_p) = c;
buf_p++;
}
}
lv_area_t a;
a.x1 = 10;
a.y1 = 40;
a.x2 = a.x1 + BUF_W - 1;
a.y2 = a.y1 + BUF_H - 1;
my_flush_cb(NULL, & a, buf);
```
2021-06-09 15:10:35 +02:00
### Why I see nonsense colors on the screen?
2021-04-12 18:19:04 +02:00
Probably LVGL's color format is not compatible with your displays color format. Check `LV_COLOR_DEPTH` in *lv_conf.h* .
If you are using 16 bit colors with SPI (or other byte-oriented interface) probably you need to set `LV_COLOR_16_SWAP 1` in *lv_conf.h* .
It swaps the upper and lower bytes of the pixels.
### How to speed up my UI?
- Turn on compiler optimization and enable cache if your MCU has
- Increase the size of the display buffer
- Use 2 display buffers and flush the buffer with DMA (or similar periphery) in the background
- Increase the clock speed of the SPI or Parallel port if you use them to drive the display
- If your display has SPI port consider changing to a model with parallel because it has much higher throughput
- Keep the display buffer in the internal RAM (not in external SRAM) because LVGL uses it a lot and it should have a small access time
### How to reduce flash/ROM usage?
You can disable all the unused features (such as animations, file system, GPU etc.) and object types in *lv_conf.h* .
If you are using GCC you can add
- `-fdata-sections -ffunction-sections` compiler flags
- `--gc-sections` linker flag
to remove unused functions and variables from the final binary
### How to reduce the RAM usage
- Lower the size of the *Display buffer*
- Reduce `LV_MEM_SIZE` in *lv_conf.h* . This memory used when you create objects like buttons, labels, etc.
- To work with lower `LV_MEM_SIZE` you can create the objects only when required and deleted them when they are not required anymore
### How to work with an operating system?
To work with an operating system where tasks can interrupt each other (preemptive) you should protect LVGL related function calls with a mutex.
See the [Operating system and interrupts ](/porting/os ) section to learn more.