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