Verdin AM62 LVGL 移植
簡(jiǎn)介
LVGL 是一個(gè)免費(fèi)、開源的圖形庫(kù),能夠在嵌入式設(shè)備如上使用 C/C++ 語言輕松繪制圖形。由于這是一輕量級(jí)圖形庫(kù),最初廣泛被 MCU 處理器使用。隨著功能完善,在性能和資源更充裕的 MPU 上也逐漸被使用。文章將介紹如何在 Verdin AM62 計(jì)算機(jī)模塊上移植 LVGL。
硬件介紹
Verdin AM62是一款基于 TI AM623/625 SoC 的 Arm 計(jì)算機(jī)模塊,提供多達(dá) 4 個(gè) Cortex-A53 內(nèi)核和一個(gè) 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ū)動(dòng)。如果在 MCU 上使用 LVGL,通常選擇所使用的控制器,如 ILI9341。相關(guān)內(nèi)容可以參考我們之前發(fā)布的文章。
LVGL 移植
LVGL 的編譯需要用到 Linux SDK??梢詤⒖荚擁?yè)面,使用 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 中對(duì)應(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 圖形庫(kù)實(shí)現(xiàn)代碼,lv_drivers 顯示驅(qū)動(dòng),以及演示用的 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 中管理。對(duì)于資源有限的 MCU 這非常有用。禁用不需要的的功能,能夠有效減少編譯后二進(jìn)制文件的大小,并降低 RAM 開銷。在 Arm Linux 則沒有這樣的限制,還可以充分利用 Linux 資源。例如 lvgl 使用 Linux 平臺(tái)中 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ū)動(dòng)屬性。Verdin AM62 的 Linux 中已經(jīng)實(shí)現(xiàn)了顯示硬件驅(qū)動(dòng)的配置,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 提供計(jì)時(shí)。
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ū)動(dòng)已經(jīng)在 Linux 中配置,移植過程并不涉及硬件驅(qū)動(dòng),該方法同樣也適用于除了 AM62 以外的其他模塊。
參考
· How to build LVGL applications using STM32CubeIDE
· LVGL Set up a project
提交
基于 NXP iMX8MM 測(cè)試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測(cè)試
嵌入式Linux下使用 Plymouth 實(shí)現(xiàn)開機(jī)畫面示例