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 實現開機畫面示例