Verdin AM62 LVGL 移植
简介
LVGL 是一个免费、开源的图形库,能够在嵌入式设备如上使用 C/C++ 语言轻松绘制图形。由于这是一轻量级图形库,最初广泛被 MCU 处理器使用。随着功能完善,在性能和资源更充裕的 MPU 上也逐渐被使用。文章将介绍如何在 Verdin AM62 计算机模块上移植 LVGL。
硬件介绍
Verdin AM62是一款基于 TI AM623/625 SoC 的 Arm 计算机模块,提供多达 4 个 Cortex-A53 内核和一个 Cortex-M4 处理器。最高 RAM 和 Flash 分别为 2GB 和 16GB。支持常见的 I2C、SPI、CAN 和 双路以太网等。模块可选配板载 WIFI/BT 模块。
软件说明
Verdin AM62 提供使用 Yocto Project 生成的 Linux 镜像。该系统使用 wayland 作为底层图形框架。而 LVGL 目前也已经能够支持 wayland。无需移植硬件显示控制器驱动。如果在 MCU 上使用 LVGL,通常选择所使用的控制器,如 ILI9341。相关内容可以参考我们之前发布的文章。
LVGL 移植
LVGL 的编译需要用到 Linux SDK。可以参考该页面,使用 Yocto Project 生成 SDK 文件后进行安装。
首先,使用下面命令下载 LVGL v8.1。
git clone --recursive https://github.com/lvgl/lv_port_pc_eclipse.git
cd lv_port_pc_eclipse/
git checkout -b WORKING origin/release/v8.1
git submodule init
git submodule update
在 lv_port_pc_eclipse 目录中,打上补丁文件。
git apply -p1 lvgl_v8.1_verdin_am62.patch
LVGL 使用 cmake 编译。在 CMakeLists.txt 中添加了 Linux SDK 的安装目录,以及相关的头文件在 SDK 中对应的位置。
+set(SDK_ROOT "$ENV{SDKPATH}")
+include_directories(${PROJECT_SOURCE_DIR})
+include_directories(${SDK_ROOT}/sysroots/aarch64-tdx-linux/usr/include/libdrm)
LVGL 包含三部分代码,lvgl 图形库实现代码,lv_drivers 显示驱动,以及演示用的 lv_demos 代码。在 CMakeLists.txt 中定义编译目标。
+ target_compile_definitions(lvgl
+ target_compile_definitions(lv_drivers
+ target_compile_definitions(lv_demos
关于 lvgl 自身功能和属性的配置在 lv_conf.h 中管理。对于资源有限的 MCU 这非常有用。禁用不需要的的功能,能够有效减少编译后二进制文件的大小,并降低 RAM 开销。在 Arm Linux 则没有这样的限制,还可以充分利用 Linux 资源。例如 lvgl 使用 Linux 平台中 glibc 提供的内存管理 API。
# define LV_MEM_CUSTOM_INCLUDE
# define LV_MEM_CUSTOM_ALLOC malloc
# define LV_MEM_CUSTOM_FREE free
# define LV_MEM_CUSTOM_REALLOC realloc
lv_drv_conf.h 主要配置 lvgl 输出所需的显示驱动属性。Verdin AM62 的 Linux 中已经实现了显示硬件驱动的配置,lvgl 只需要在 wayland 完成渲染显示即可,在 lv_drv_conf.h 不需要太多的设置,这里只设定了显示窗口大小。
+/* Demo Resolution */
+# define SDL_HOR_RES 800
+# define SDL_VER_RES 400
文章使用 lvgl 自带的 demo 作为演示,lv_demo_conf.h 中 demo 外观。
#define LV_USE_DEMO_MUSIC 1
#if LV_USE_DEMO_MUSIC
-# define LV_DEMO_MUSIC_LANDSCAPE 0
+# define LV_DEMO_MUSIC_SQUARE 0
+# define LV_DEMO_MUSIC_LANDSCAPE 1
+# define LV_DEMO_MUSIC_ROUND 0
main.c 中初始化 lvgl 相关的 API,并利用 SDL 线程每隔 5ms 调用 lv_tick_inc() 为 lvgl 提供计时。
static int tick_thread(void *data) {
(void)data;
while(1) {
SDL_Delay(5);
lv_tick_inc(5);
}
return 0;
}
通过 SDL 把触摸屏作为 lvgl 的输入设备。
indev_drv_1.read_cb = sdl_mouse_read;
lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1);
最后,使用 Linux SDK 中的 environment-setup-aarch64-tdx-linux 初始化编译环境后完成编译。
source ~/LinuxSDK/v6-am62/environment-setup-aarch64-tdx-linux
cmake .
make
将生成的 main 二进制文件复制到 Verdin AM62 上运行即可。
总结
文章介绍了如何将 LVGL 移植到 Verdin AM62 模块上,由于底层显示驱动已经在 Linux 中配置,移植过程并不涉及硬件驱动,该方法同样也适用于除了 AM62 以外的其他模块。
参考
· How to build LVGL applications using STM32CubeIDE
· LVGL Set up a project
提交
基于 NXP iMX8MM 测试 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 计算机模块
Verdin iMX8MP 调试串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 测试
嵌入式Linux下使用 Plymouth 实现开机画面示例