LVGL(1):资源、特性、Linux下移植(RK3588)、测试
LVGL(Light and Versatile Graphics Library)是一个开源的嵌入式图形库,专为嵌入式系统和微控制器设计。它提供了一整套丰富的图形元素和功能,使得开发者能够在资源受限的设备上创建现代化的图形用户界面(GUI)。
LVGL介绍文档《Welcome to the documentation of LVGL! — LVGL documentation》。
1 LVGL资源和特性
下载LVGL资源v8.2:
git clone --recursive https://github.com/lvgl/lv_port_linux.git -b release/v8.2
lv_port_linux.git包含两个submodule(lvgl.git和lv_driver.git):
GitHub - lvgl/lvgl: Embedded graphics library to create beautiful UIs for any MCU, MPU and display type:LVGL核心代码,以及官方的LVGL demo。
GitHub - lvgl/lv_drivers: TFT and touch pad drivers for LVGL embedded GUI library:支持Linux下FB/DRM等显示框架、evdev/kbd/mouse等输入设备。
GitHub - lvgl/lv_port_linux: LVGL configured to work with a standard Linux framebuffer:将以上两个git作为submodule,组成Linux下基于Framebuffer或者DRM的LVGL方案。
1. 核心特性
- 跨平台:LVGL可以在多种平台上运行,包括但不限于Linux、Windows、macOS以及各种嵌入式系统。
- 轻量级:LVGL占用的内存和处理资源非常少,适合内存和处理能力受限的微控制器。
- 可定制性:LVGL允许开发者自定义主题、颜色、字体等,以适应不同的设计需求。
- 硬件加速:支持多种GPU,如STM32的Chrom-ART等,以提高渲染性能。
2. 组件和对象
- 基本对象:如线条、圆形、矩形等。
- 复杂对象:如按钮、滑块、图表、列表等。
- 布局:如网格、列表、表格等布局方式,帮助开发者组织界面元素。
3. 功能
- 动画:LVGL支持多种动画效果,可以用于平滑地过渡对象状态。
- 输入设备:支持触摸屏、键盘、鼠标、编码器等多种输入设备。
- 多语言:支持Unicode,可以显示多种语言和特殊字符。
- 图像处理:支持多种图像格式,如BMP、PNG等,并提供图像处理功能。
4. 架构
- 分层架构:LVGL的架构分为几个层次,包括显示层、输入管理器、动画系统、任务处理等。
- 事件系统:LVGL提供了一个事件系统,允许开发者响应各种用户交互事件。
5. 开发和调试
- 模拟器:LVGL提供了一个模拟器,允许开发者在PC上测试和调试GUI。
- 日志系统:内置的日志系统可以帮助开发者跟踪问题和性能瓶颈。
6. 社区和支持
- 文档:LVGL提供了详尽的文档和API参考。
- 社区:活跃的开源社区为LVGL提供持续的支持和贡献。
7. 应用场景
- 家用电器:如智能冰箱、洗衣机等。
- 工业控制:用于显示和控制工业设备。
- 医疗设备:用于显示医疗信息和控制设备。
- 车载系统:用于车载信息娱乐系统。
8. 集成和部署
- 微控制器支持:LVGL可以运行在各种微控制器上,如STM32、ESP32等。
- RTOS支持:可以与多种实时操作系统(RTOS)集成。
9. 性能优化
- 内存管理:LVGL对内存使用进行了优化,支持多种内存分配策略。
- 渲染优化:通过硬件加速和高效的渲染算法提高渲染性能。
10. 许可和版权
- LVGL在MIT许可下发布,这是一个非常宽松的开源许可,允许商业和非商业用途。
2 LVGL移植和编译
2.1 工具链选择
diff --git a/Makefile b/Makefile index ba6972b..fe7373d 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # # Makefile # -CC ?= gcc +CC = aarch64-none-linux-gnu-gcc LVGL_DIR_NAME ?= lvgl LVGL_DIR ?= ${shell pwd} CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare
2.2 显示和输入设备配置
lv_port_linux.git配置包括:
- 默认使用FB框架,默认设备为/dev/fb0;配置分辨率800*1280;确认屏幕Color Depth为ARGB888即32位深度。
- 使能evdev,配置对应input设备为/dev/input/event3。
使用触摸屏作为输入设备,evtest确认设备号:
evtest No device specified, trying to scan all of /dev/input/event* Available devices: /dev/input/event0: rk805 pwrkey /dev/input/event1: rockchip-es8388 Headset /dev/input/event2: adc-keys /dev/input/event3: generic ft5x06 (79)
evdev对应的设备号为/dev/input/event3。
diff --git a/lv_drv_conf.h b/lv_drv_conf.h index d40e703..850ff76 100644 --- a/lv_drv_conf.h +++ b/lv_drv_conf.h @@ -447,16 +447,16 @@ #endif #if USE_EVDEV || USE_BSD_EVDEV -# define EVDEV_NAME "/dev/input/event10" /*You can use the "evtest" Linux tool to get the list of devices and test them*/ +# define EVDEV_NAME "/dev/input/event3" /*You can use the "evtest" Linux tool to get the list of devices and test them*/ # define EVDEV_SWAP_AXES 0 /*Swap the x and y axes of the touchscreen*/ # define EVDEV_CALIBRATE 0 /*Scale and offset the touchscreen coordinates by using maximum and minimum values for each axis*/ # if EVDEV_CALIBRATE # define EVDEV_HOR_MIN 0 /*to invert axis swap EVDEV_XXX_MIN by EVDEV_XXX_MAX*/ -# define EVDEV_HOR_MAX 4096 /*"evtest" Linux tool can help to get the correct calibraion values>*/ +# define EVDEV_HOR_MAX 800 /*"evtest" Linux tool can help to get the correct calibraion values>*/ # define EVDEV_VER_MIN 0 -# define EVDEV_VER_MAX 4096 +# define EVDEV_VER_MAX 1280 # endif /*EVDEV_CALIBRATE*/ #endif /*USE_EVDEV*/ diff --git a/main.c b/main.c index 33cd734..0df3327 100644 --- a/main.c +++ b/main.c @@ -7,7 +7,7 @@ #include <time.h> #include <sys/time.h> -#define DISP_BUF_SIZE (128 * 1024) +#define DISP_BUF_SIZE (800 * 1280) int main(void) { @@ -30,7 +30,7 @@ int main(void) disp_drv.draw_buf = &disp_buf; disp_drv.flush_cb = fbdev_flush; disp_drv.hor_res = 800; - disp_drv.ver_res = 480; + disp_drv.ver_res = 1280; lv_disp_drv_register(&disp_drv); evdev_init();
2.3 LOG配置
打开LOG配置:
diff --git a/lv_conf.h b/lv_conf.h index 6bfe50f..19199f8 100644 --- a/lv_conf.h +++ b/lv_conf.h @@ -194,7 +194,7 @@ *-----------*/ /*Enable the log module*/ -#define LV_USE_LOG 0 +#define LV_USE_LOG 1 #if LV_USE_LOG /*How important log should be added:
调整LV_LOG_LEVEL等级,以及Trace模块:
#if LV_USE_LOG /*How important log should be added: *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information *LV_LOG_LEVEL_INFO Log important events *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail *LV_LOG_LEVEL_USER Only logs added by the user *LV_LOG_LEVEL_NONE Do not log anything*/ #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN /*1: Print the log with 'printf'; *0: User need to register a callback with `lv_log_register_print_cb()`*/ #define LV_LOG_PRINTF 0 /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ #define LV_LOG_TRACE_MEM 1 #define LV_LOG_TRACE_TIMER 1 #define LV_LOG_TRACE_INDEV 1 #define LV_LOG_TRACE_DISP_REFR 1 #define LV_LOG_TRACE_EVENT 1 #define LV_LOG_TRACE_OBJ_CREATE 1 #define LV_LOG_TRACE_LAYOUT 1 #define LV_LOG_TRACE_ANIM 1 #endif /*LV_USE_LOG*/
2.4 LVGL编译
编译:
make -j8
编译结果为demo可执行文件。
3 LVGL使用
打开不同大小字体和demo支持:
#define LV_FONT_MONTSERRAT_10 0 #define LV_FONT_MONTSERRAT_12 0 #define LV_FONT_MONTSERRAT_14 1 -#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_16 1 #define LV_FONT_MONTSERRAT_18 0 #define LV_FONT_MONTSERRAT_20 0 -#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_22 1 #define LV_FONT_MONTSERRAT_24 0 #define LV_FONT_MONTSERRAT_26 0 #define LV_FONT_MONTSERRAT_28 0 #define LV_FONT_MONTSERRAT_30 0 -#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_32 1 #define LV_FONT_MONTSERRAT_34 0 #define LV_FONT_MONTSERRAT_36 0 #define LV_FONT_MONTSERRAT_38 0 @@ -671,26 +671,26 @@ /*Show some widget. It might be required to increase `LV_MEM_SIZE` */ #define LV_USE_DEMO_WIDGETS 1 #if LV_USE_DEMO_WIDGETS -#define LV_DEMO_WIDGETS_SLIDESHOW 0 +#define LV_DEMO_WIDGETS_SLIDESHOW 1 #endif /*Demonstrate the usage of encoder and keyboard*/ -#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 1 /*Benchmark your system*/ -#define LV_USE_DEMO_BENCHMARK 0 +#define LV_USE_DEMO_BENCHMARK 1 /*Stress test for LVGL*/ -#define LV_USE_DEMO_STRESS 0 +#define LV_USE_DEMO_STRESS 1 /*Music player demo*/ -#define LV_USE_DEMO_MUSIC 0 +#define LV_USE_DEMO_MUSIC 1 #if LV_USE_DEMO_MUSIC -# define LV_DEMO_MUSIC_SQUARE 0 -# define LV_DEMO_MUSIC_LANDSCAPE 0 -# define LV_DEMO_MUSIC_ROUND 0 -# define LV_DEMO_MUSIC_LARGE 0 -# define LV_DEMO_MUSIC_AUTO_PLAY 0 +# define LV_DEMO_MUSIC_SQUARE 1 +# define LV_DEMO_MUSIC_LANDSCAPE 1 +# define LV_DEMO_MUSIC_ROUND 1 +# define LV_DEMO_MUSIC_LARGE 1 +# define LV_DEMO_MUSIC_AUTO_PLAY 1 #endif
分别基于lv_demo_widgets()、lv_demo_benchmark()、lv_demo_music()、lv_demo_stress()测试结果如下: