马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
LVGL v9 相对 v8 改动不小:内置了显示与触摸驱动、换了并行渲染架构、内置支持 LVGL 的 C 库与部分 stdlib,结果是 v9 工程里不再有独立的 lvgl_driver 目录。网路上 v9 的移植教程还很少,这篇把在 IMX6ULL(Linux 4.9 内核)上跑通 v9 的全过程写下来,开发主机是 Windows 11 + WSL2。
一、环境准备
- 目标板:IMX6ULL,烧的是 Linux 4.9 内核,屏幕接 framebuffer、触摸接 evdev 设备;
- 主机:Windows 11,WSL2 作为编译环境(Ubuntu 发行版);
- 交叉编译链:gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf,路径写成绝对路径;
- CMake 版本需在 3.12.4 以上。
二、拉取工程与子模块
# 克隆 lv_port_linux 仓库并安装 lvgl 子模块
git clone https://github.com/lvgl/lv_port_linux.git
cd lv_port_linux_frame_buffer/
git submodule update --init --recursive
网络不通的,可以克隆一份已经改好配置的版本,效果一致。
三、目录结构的变化
v9 里 lvgl_driver 目录没了——显示和触摸驱动已经内置进 LVGL。打开根目录的 CMakeLists.txt,做这几处改动:
cmake_minimum_required(VERSION 3.10)
# 设置交叉编译
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# 这里指定的路径必须是绝对路径
set(CMAKE_C_COMPILER /root/Tools/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /root/Tools/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++)
project(lvgl)
set(CMAKE_C_STANDARD 99) # C99,lvgl officially support C99 and above
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
add_subdirectory(lvgl)
target_include_directories(lvgl PUBLIC ${PROJECT_SOURCE_DIR})
add_executable(main main.c mouse_cursor_icon.c)
# 注释掉这行;如果要使用 DRM 驱动,则需要放开这行
#include(${CMAKE_CURRENT_LIST_DIR}/lvgl/tests/FindLibDRM.cmake)
#include_directories(${Libdrm_INCLUDE_DIRS})
# 注释掉下面三个,这个是在 PC 端使用的
#find_package(SDL2)
#find_package(SDL2_image)
#include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS})
target_link_libraries(main lvgl lvgl::examples lvgl::demos lvgl::thorvg
${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES}
${Libdrm_LIBRARIES} m pthread)
add_custom_target(run COMMAND ${EXECUTABLE_OUTPUT_PATH}/main DEPENDS main)
四、lv_conf.h 的关键配置项
v9 的 lv_conf.h 新增了不少选项,按 IMX6ULL 这块屏的场景,以下几项值得改:
| 配置项 | 取值 | 说明 |
| LV_COLOR_DEPTH | 32 | 按屏幕实际色深选,RGB888/RGB565 对应不同取值 |
| LV_DEF_REFR_PERIOD | 14 | 刷新周期,单位毫秒 |
| LV_USE_ASSERT_STYLE | 0 | 断言项,开启很卡,建议关 |
| LV_USE_ASSERT_MEM_INTEGRITY | 0 | 同上 |
| LV_USE_ASSERT_OBJ | 0 | 同上 |
| LV_OBJ_STYLE_CACHE | 20 | 样式缓存,默认 0,这里设 20 |
| LV_USE_PERF_MONITOR | 1 | 帧率显示,按需 |
| LV_USE_MEM_MONITOR | 1 | 内存占用显示,按需 |
| LV_USE_LINUX_FBDEV | 1 | 用 framebuffer 就保持开启;用 DRM 则配 LV_USE_LINUX_DRM |
| LV_USE_EVDEV | 1 | 输入设备驱动,默认是关闭的,要手开 |
五、main.c 的入口
int main(void)
{
lv_init();
/* Linux display device init */
lv_linux_disp_init();
// 这行默认是没有的,因此无法使用 input 驱动,也就无法点击触摸屏
lv_indev_t *indev = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event1");
/* Create a Demo */
lv_demo_widgets();
// 关闭自动滑动功能
//lv_demo_widgets_start_slideshow();
/* Handle LVGL tasks */
while (1) {
lv_timer_handler();
usleep(5000);
}
return 0;
}
两点要自己核对:
/dev/input/event1 是示例的触摸屏节点。确认自己板子上是哪个 event,可以用 hexdump /dev/input/eventX 逐个看,手指滑动触摸屏有数据输出的那个就是它;
- framebuffer 默认用
/dev/fb0,如果自己的屏不是这个,就在 main.c 里改。
六、编译与运行
mkdir build
cd build
cmake ..
make -j
编译通过后,工程根目录的 bin/ 下会有 main 这个可执行文件。把它拷到开发板上运行(有些板子需要先把交叉编译出来的动态库依赖一起带上),就能看到 demo 界面,触摸也生效。
七、踩坑小结
- v9 不再有 lvgl_driver,别再照 v8 的教程往那个目录里塞驱动,直接改 lv_conf.h 开关;
- EVDEV 输入设备默认是关的,不打开就点不动屏,这是很多人「demo 显示出来但没反应」的根因;
- 三个 ASSERT 项开着会明显卡,先关掉验证功能,再逐个打开定位问题;
- 交叉编译器的 C/CXX 路径必须是绝对路径,相对路径在 CMake 交叉编译场景里容易静默失败;
- v9 编出来的二进制比 v8 大不少,因为集成了更多模块,靠 lv_conf.h 逐项裁剪能压回去,配置项的取舍可以单独整理成一张速查表。
整轮移植大约花了三小时,中间翻了不少官方 issue。v9 的配置项比 v8 多,一次改太多容易分不清是谁的锅,建议按「显示 → 触摸 → 性能开关」三段分批改、每段编一次验证。
qidao123.com企服评测-应用市场 编辑提示 |