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)行即可。

lvgl_on_am62.png 

 

總結(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

審核編輯(
王靜
)
投訴建議

提交

查看更多評(píng)論
其他資訊

查看更多

基于 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ī)畫面示例