Verdin AM62 LVGL 移植
簡介
LVGL 是一個免費(fèi)、開源的圖形庫,能夠在嵌入式設(shè)備如上使用 C/C++ 語言輕松繪制圖形。由于這是一輕量級圖形庫,最初廣泛被 MCU 處理器使用。隨著功能完善,在性能和資源更充裕的 MPU 上也逐漸被使用。文章將介紹如何在 Verdin AM62 計算機(jī)模塊上移植 LVGL。
硬件介紹
Verdin AM62是一款基于 TI AM623/625 SoC 的 Arm 計算機(jī)模塊,提供多達(dá) 4 個 Cortex-A53 內(nèi)核和一個 Cortex-M4 處理器。最高 RAM 和 Flash 分別為 2GB 和 16GB。支持常見的 I2C、SPI、CAN 和 雙路以太網(wǎng)等。模塊可選配板載 WIFI/BT 模塊。
軟件說明
Verdin AM62 提供使用 Yocto Project 生成的 Linux 鏡像。該系統(tǒng)使用 wayland 作為底層圖形框架。而 LVGL 目前也已經(jīng)能夠支持 wayland。無需移植硬件顯示控制器驅(qū)動。如果在 MCU 上使用 LVGL,通常選擇所使用的控制器,如 ILI9341。相關(guān)內(nèi)容可以參考我們之前發(fā)布的文章。
LVGL 移植
LVGL 的編譯需要用到 Linux SDK。可以參考該頁面,使用 Yocto Project 生成 SDK 文件后進(jìn)行安裝。
首先,使用下面命令下載 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 目錄中,打上補(bǔ)丁文件。
git apply -p1 lvgl_v8.1_verdin_am62.patch
LVGL 使用 cmake 編譯。在 CMakeLists.txt 中添加了 Linux SDK 的安裝目錄,以及相關(guān)的頭文件在 SDK 中對應(yīng)的位置。
+set(SDK_ROOT "$ENV{SDKPATH}")
+include_directories(${PROJECT_SOURCE_DIR})
+include_directories(${SDK_ROOT}/sysroots/aarch64-tdx-linux/usr/include/libdrm)
LVGL 包含三部分代碼,lvgl 圖形庫實(shí)現(xiàn)代碼,lv_drivers 顯示驅(qū)動,以及演示用的 lv_demos 代碼。在 CMakeLists.txt 中定義編譯目標(biāo)。
+ target_compile_definitions(lvgl
+ target_compile_definitions(lv_drivers
+ target_compile_definitions(lv_demos
關(guān)于 lvgl 自身功能和屬性的配置在 lv_conf.h 中管理。對于資源有限的 MCU 這非常有用。禁用不需要的的功能,能夠有效減少編譯后二進(jìn)制文件的大小,并降低 RAM 開銷。在 Arm Linux 則沒有這樣的限制,還可以充分利用 Linux 資源。例如 lvgl 使用 Linux 平臺中 glibc 提供的內(nèi)存管理 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 輸出所需的顯示驅(qū)動屬性。Verdin AM62 的 Linux 中已經(jīng)實(shí)現(xiàn)了顯示硬件驅(qū)動的配置,lvgl 只需要在 wayland 完成渲染顯示即可,在 lv_drv_conf.h 不需要太多的設(shè)置,這里只設(shè)定了顯示窗口大小。
+/* 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 相關(guān)的 API,并利用 SDL 線程每隔 5ms 調(diào)用 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 的輸入設(shè)備。
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 初始化編譯環(huán)境后完成編譯。
source ~/LinuxSDK/v6-am62/environment-setup-aarch64-tdx-linux
cmake .
make
將生成的 main 二進(jìn)制文件復(fù)制到 Verdin AM62 上運(yùn)行即可。
總結(jié)
文章介紹了如何將 LVGL 移植到 Verdin AM62 模塊上,由于底層顯示驅(qū)動已經(jīng)在 Linux 中配置,移植過程并不涉及硬件驅(qū)動,該方法同樣也適用于除了 AM62 以外的其他模塊。
參考
· How to build LVGL applications using STM32CubeIDE
· LVGL Set up a project
提交
基于 NXP iMX8MM 測試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計算機(jī)模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測試
嵌入式Linux下使用 Plymouth 實(shí)現(xiàn)開機(jī)畫面示例