LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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()测试结果如下:

posted on 2024-06-23 23:59  ArnoldLu  阅读(990)  评论(0编辑  收藏  举报

导航