当前位置: 首页 > news >正文

解码LVGL Linux 系统(Ubuntu/WSL + 开发板)移植

LVGL 简介与核心特性

LVGL(Light and Versatile Graphics Library)是一款开源图形用户界面库,核心目标是为嵌入式系统提供轻量级、高可移植、灵活且易用的 GUI 解决方案。

image

LVGL 核心代码采用 C 语言编写,适配场景广泛,可在不同操作系统(如 Linux、RTOS)、微控制器(MCU)和图形加速器上运行;同时支持多种显示设备(液晶显示屏、OLED 显示屏等)与输入设备(触摸屏、物理按键、编码器等),能帮助开发人员快速构建交互式用户界面,且具备高度自定义能力 —— 用户可根据需求修改或扩展库功能,高效实现嵌入式系统中的各类交互式应用,其核心特性具体体现在以下方面:

丰富的内置部件

LVGL 包含 30+ 内置小部件,全面覆盖常见 UI 开发需求:

image

  • 基础组件:Arc(圆弧)、Bar(进度条)、Checkbox(复选框)、开关、按钮,满足简单交互场景;
  • 复杂组件:Calendar(日历)、Chart(图表)、下拉列表、键盘、仪表、消息框、表格、Tabview(标签页)、文本区域,支持复杂功能开发;
  • 动态管理:部件支持实时创建与删除,可仅加载当前可见的屏幕和部件,大幅降低内存占用,适配嵌入式系统资源受限场景。

强大的渲染功能

LVGL 内置轻量级软件渲染引擎,以矢量图形方式绘制抗锯齿部件,兼顾渲染效果与资源消耗:

image

  • 形状渲染:支持带半径的矩形、带半径的边框、弧线、斜线,实现细腻的图形边缘;
  • 视觉增强:提供水平 / 垂直梯度填充、盒子阴影效果,提升 UI 视觉层次感;
  • 图像处理:支持缩放、旋转图像或任意部件,且无需依赖额外图形库,适配不同显示需求。

高度灵活的样式系统

image

提供 100+ 样式属性,支持运行时动态调整,满足多样化 UI 设计需求:

  • 状态化样式:可针对部件的不同状态(按下、选中、聚焦、禁用等)单独设置样式,实现交互反馈;
  • 精细化自定义:支持部件局部样式调整(如滑块的主体、指示器、旋钮可分别配置),细节控制更精准;
  • 自动样式动画:状态切换时,LVGL 可通过样式转换自动生成过渡动画,无需编写额外动画代码,提升交互流畅度。

智能布局能力

无需手动定位部件,通过内置布局快速实现响应式 UI,降低布局适配成本:

image

  • Flex 布局:按预设策略(如居中、分散对齐)排列大量部件,支持灵活的间距与分布控制;
  • 网格布局:将部件添加到用户定义的网格单元格中,支持精准对齐与跨列 / 跨行设置;
  • 自适应调整:支持部件与父容器任意侧对齐、百分比尺寸单位,布局会随内容变化或容器尺寸调整自动更新,适配不同分辨率屏幕。

全面的字体与多语言支持

适配不同硬件性能的字体渲染方案,兼容多语种场景,满足全球化应用需求:

image

  • 字体技术:支持 FreeType(适用于资源较丰富的 MPU 平台)、TinyTTF(适用于资源受限的 MCU 平台),可使用 1/2/4/8 位 / 像素字体、压缩字体,还能直接从 TTF 或 WOFF 文件渲染字形;
  • 多语言兼容:字符串采用 UTF-8 解码,支持阿拉伯语、波斯语、希伯来语、泰语、中文、日语、韩语等,且可混合从右到左(如阿拉伯语)与从左到右(如中文)的书写方向;
  • 补充功能:支持回退字体(当目标字体缺失某字形时,自动调用备用字体)与表情符号显示,提升文本表达丰富度。

灵活的转换功能

支持部件及嵌套子部件的复杂转换,兼顾视觉效果与交互体验:

image

  • 基础转换:可对任意 LVGL 绘制的部件进行旋转、缩放操作,无需额外图像处理工具;
  • 嵌套转换:子部件会继承父部件的转换属性(如父部件旋转后,子部件同步旋转),支持多层嵌套,实现复杂视觉效果;
  • 手势适配:转换后的部件仍支持正常触摸手势,例如旋转后的列表可沿旋转方向滚动,保证交互逻辑不中断。

流畅的滚动体验

无需额外配置即可实现类似智能手机的流畅滚动效果,提升用户体验:

image

  • 自动滚动:当部件子项超出父部件边界时,父部件自动变为可滚动状态,无需创建特殊 “滚动容器”;
  • 增强功能:支持对齐滚动(滚动后子项自动对齐边界)、弹性滚动(超出边界后有回弹效果)、滚动动量(松手后保持惯性滚动)、滚动链接(多部件联动滚动,如列表与标题栏同步联动)。

此外,LVGL 遵循 MIT 开源协议,完全开源可控 —— 下载后可自主修改、发布,用于商业产品也无需支付任何授权费用,大幅降低开发成本。

Ubuntu/WSL移植

下载 LVGL 相关源码

确定下载文件与来源

需下载 2 个核心压缩包,优先选择推荐来源以保证速度:

  • 第一个压缩包:lv_port_linux-release-v9.2.zip(Linux 平台预配置项目框架)
  • 第二个压缩包:lvgl-6757a718a88af58591c90f5ab33ca2770606c314.zip(LVGL 核心代码)
  • LVGL 核心库 GitHub 链接:LVGL · GitHub

解压与重命名压缩包

下载完成后,通过终端执行解压命令,同时简化目录名(避免长路径导致后续操作出错):

# 解压两个压缩包(默认解压到当前用户目录)
unzip lv_port_linux-release-v9.2.zip
unzip lvgl-6757a718a88af58591c90f5ab33ca2770606c314.zip# 重命名目录(缩短名称,便于后续命令输入)
mv lv_port_linux-release-v9.2/ lv_port_linux-9.2/
mv lvgl-6757a718a88af58591c90f5ab33ca2770606c314/ lvgl-6757a/# 验证目录是否创建成功(执行后应显示两个目标目录)
ls
lv_port_linux-9.2/   lvgl-6757a/

整合核心代码到项目框架

lv_port_linux-9.2/是 Linux 平台专用框架(含预配置 config 文件),lvgl-6757a/是 LVGL 核心代码,需将核心代码文件移入框架的lvgl/子目录,必须携带星号*(确保仅移动目录内文件,而非目录本身):

# 移动核心代码文件到框架的lvgl目录(星号*不可遗漏)
mv lvgl-6757a/* lv_port_linux-9.2/lvgl/# 注意:禁止直接执行`mv lvgl-6757a/ lv_port_linux-9.2/lvgl/`,否则会生成`lvgl/lvgl-6757a/`,导致编译找不到头文件

安装依赖库(Ubuntu 环境)

LVGL 运行需依赖显示、输入处理及工程管理工具,通过apt命令逐一安装:

安装 SDL2(显示与输入驱动)

SDL2 是与 Linux 帧缓冲机制(fbdev)、DRM 平行的显示框架,可提供图形显示、鼠标 / 键盘输入处理功能,安装命令如下:

sudo apt install libsdl2-dev

安装 xkb(标准输入库)

xkb 用于支持键盘布局等标准输入功能,安装前需先更新apt包索引,确保安装最新版本:

# 第一步:更新apt包索引
sudo apt update# 第二步:安装xkb及依赖的xcb库
sudo apt install libxkbcommon-x11-dev libxcb-icccm4-dev 
sudo apt install libxcb-render-util0-dev libxcb-keysyms1-dev libxcb-image0-dev

安装 CMake(工程管理工具)

整个 LVGL 工程由 CMake 管理编译流程,需先在 Ubuntu 中安装 CMake,且安装后需重启 VSCode(否则 VSCode 无法识别 CMake):

# 第一步:更新apt包索引
sudo apt update# 第二步:安装CMake
sudo apt install cmake# 注意:CMake安装完成后,必须重启VSCode,才能在VSCode中正常配置CMake

VSCode 中配置 CMake

安装必要插件

打开 VSCode,进入「扩展商店」,搜索并安装以下两个插件(确保 CMake 功能正常使用):

  • 插件 1:CMake(微软官方,提供 CMake 语法支持)
  • 插件 2:CMake Tools(微软官方,提供构建、调试集成)

image

配置 CMake Tools 参数

设置状态栏可见性

  • 操作路径:VSCode「设置」(快捷键Ctrl+,)→ 搜索「CMake: Status Bar Visibility」→ 选择「visible」

    image

  • 作用:在 VSCode 状态栏显示 CMake 状态(如编译器、构建目标),方便实时查看与操作。

配置 CMake 生成器(关键,需严格匹配系统)

  • 操作路径:VSCode「设置」→ 搜索「CMake: Generator」→ 输入「Unix Makefiles」

    image

  • 补充说明:

    • Windows 系统编译 LVGL 时,生成器需设为「MinGW Makefiles」
    • Ubuntu 系统编译 LVGL 时,生成器必须设为「Unix Makefiles」(大小写、空格不可错)

配置 LVGL 源码

配置显示机制(Ubuntu 用 SDL 模拟)

LVGL 支持 SDL、FBDEV、DRM 三种显示机制,Ubuntu 平台选择 SDL 模拟显示器,需修改lv_port_linux-9.2/lvgl/lv_conf.h配置文件:

image

配置窗口尺寸(修改 main.c)

窗口默认分辨率为 800×480,可在lv_port_linux-9.2/main.c中调整,代码需修正语法格式(补充缺失的问号运算符):

image

编译与运行验证

选择编译器

打开 VSCode,点击状态栏的「未选择工具包」→ 在弹出的工具包列表中,选择「GCC 13.3.0 x86_64-linux-gnu」(x86 平台编译器,若为其他架构需匹配对应编译器)。

image

执行编译

  • 方式 1:点击 VSCode 状态栏的「生成」按钮(或快捷键Ctrl+Shift+B)→ 选择「CMake: 生成」

    image

  • 方式 2:通过终端编译(进入项目根目录):

    cd lv_port_linux-9.2/
    mkdir build && cd build/
    cmake ..
    make
    

编译完成后,若显示「[100%] Built target main」,表示编译成功。

运行与验证

# 进入可执行文件所在目录(默认在bin目录)
cd lv_port_linux-9.2/bin/# 运行LVGL程序
./main

运行后可能出现以下警告信息(属于正常现象,不影响功能,文档中已提及):

  • [Warn] lv_init: Memory integrity checks are enabled via LV_USE_ASSERT_MEM_INTEGRITY which makes LVGL much slower lv_init.c:259
  • [Warn] lv_init: Object sanity checks are enabled via LV_USE_ASSERT_OBJ which makes LVGL much slower lv_init.c:263
  • [Warn] lv_init: Style sanity checks are enabled that uses more RAM lv_init.c:267

若弹出 LVGL 模拟器窗口,显示控件演示界面,说明移植成功。

image

开发板移植补充(以 GEC6818 为例)

交叉工具链配置

开发板(ARM 架构)无法编译程序,需在电脑(X86 架构)上用交叉编译器编译出 ARM 能运行的文件,核心工具为arm-linux-gnueabi-gcc(5.4.0 版本常用)。

核心概念

  • 交叉编译:在 A 架构(如 X86)编译出能在 B 架构(如 ARM)运行的程序;
  • 编译器区别:gcc用于 X86 程序编译,arm-linux-gcc用于 ARM 程序编译。

安装步骤(Ubuntu 系统)

步骤 1:拷贝压缩包到 Linux

  • 将交叉编译器压缩包(如arm-linux-gnueabi-5.4.0.tar.xz)放到 VMware 共享文件夹(如/mnt/hgfs/share);
  • 拷贝到 Linux 家目录(避免共享文件夹权限问题):cp /mnt/hgfs/share/arm-linux-gnueabi-5.4.0.tar.xz ~/(~ 表示家目录,如 /home/gec)。

步骤 2:解压压缩包

  • 先解压 xz 格式:xz --decompress arm-linux-gnueabi-5.4.0.tar.xz(生成.tar 文件);
  • 再解压 tar 格式:tar xf arm-linux-gnueabi-5.4.0.tar(生成usr文件夹,包含编译器文件)。

步骤 3:配置环境变量

环境变量用于让 Linux 在任何目录都能调用arm-linux-gcc

  • 进入编译器二进制文件目录:cd ~/usr/local/arm/5.4.0/usr/bin(路径需与解压后的实际路径一致);
  • 查看当前路径:pwd,复制输出(如/home/gec/usr/local/arm/5.4.0/usr/bin);
  • 编辑环境变量配置文件:vi ~/.bashrc
  • 在文件末尾添加:export PATH=/home/gec/usr/local/arm/5.4.0/usr/bin:$PATH($PATH 表示保留原有环境变量);
  • 让配置生效:source ~/.bashrc

步骤 4:验证安装

输入 arm-linux-gcc -v,若显示版本信息(如gcc version 5.4.0),说明安装成功。

常见错误解决

  • 错误:error while loading shared libraries: libmpfr.so.4原因:系统缺少libmpfr.so.4库文件(Ubuntu 默认是libmpfr.so.6)。解决:创建软链接映射:sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4
  • 错误:./demo_arm: cannot execute binary file原因:在 X86 系统运行 ARM 程序(demo_arm是 ARM 可执行文件)。解决:将demo_arm传到开发板,在开发板上运行。

显示机制适配

GEC6818 用 LCD 硬件(帧缓冲 FBDEV),需替换 Ubuntu 的 SDL 模拟显示,步骤逻辑与 Ubuntu 配置 SDL 一致,但参数不同:

修改 lv_conf.h(参考 Ubuntu “配置显示机制” 步骤)

打开lv_port_linux-9.2/lvgl/lv_conf.h,修改显示宏(禁用 SDL,启用 FBDEV):

image

调整 LCD 分辨率(参考 Ubuntu “配置窗口尺寸” 步骤)

GEC6818 默认 LCD 分辨率为 800x480,若需修改,打开lv_port_linux-9.2/lvgl/src/drivers/display/lv_linux_fbdev.c

lv_display_t * lv_linux_fbdev_create(void)
{// ... 原有代码(定时器、内存分配)...// 修改分辨率为GEC6818 LCD实际参数(默认800x480)lv_display_t * disp = lv_display_create(800, 480);// ... 原有代码(关联回调、返回句柄)...
}

触摸屏适配(EVDEV,开发板特有,无 Ubuntu 参考步骤)

GEC6818 用电阻 / 电容触摸屏(EVDEV 驱动),需新增输入配置:

检测触摸屏设备文件(开发板终端操作)

在 GEC6818 开发板终端执行,确认触摸屏对应的设备文件路径:

# 查看输入设备列表及信息
[root@GEC6818 ~]# cat /proc/bus/input/devices
# 关键信息:找到"Name="gslX680""(GEC6818常用触摸屏芯片),记录"Handlers=event0"
# 设备文件路径:/dev/input/event0(后续代码需用此路径)

启用 EVDEV 驱动(修改 lv_conf.h)

image

添加触摸屏初始化代码(修改 main.c)

lv_port_linux-9.2/main.c中添加初始化函数,并在 main 中调用:

// 引入EVDEV头文件
#include "lv_drivers/indev/evdev.h"// 触摸屏初始化函数
void lv_gec6818_touch_init(void)
{// 创建EVDEV输入设备(参数1:指针类型,参数2:触摸屏设备文件路径)lv_indev_t *touch_indev = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event0");// 将触摸屏关联到默认显示器(确保触摸位置与显示对应)lv_indev_set_disp(touch_indev, lv_disp_get_default());
}// 在main函数中调用(新增,放在显示器初始化后)
int main(void)
{lv_init();                  // LVGL核心初始化(与Ubuntu一致)lv_linux_disp_init();       // 显示器初始化(FBDEV,替换Ubuntu的SDL初始化)lv_gec6818_touch_init();    // 新增:触摸屏初始化lv_demo_widgets();          // 运行demo(与Ubuntu一致)// 主循环(与Ubuntu一致)while(1) {lv_timer_handler();usleep(5000);}return 0;
}

CMake 调整(适配交叉编译,结构参考 Ubuntu 的 CMake 配置)

需修改lv_port_linux-9.2/CMakeLists.txt,适配 ARM 交叉编译,步骤结构参考 Ubuntu 的 CMake 配置:

选择交叉编译器(参考 Ubuntu “选择编译器” 步骤)

  • 打开 VSCode,点击状态栏 “工具包”→ 选择GCC 5.4.0 arm-none-linux-gnueabi(交叉编译器,替换 Ubuntu 的 x86 编译器)

修改 CMakeLists.txt(参考 Ubuntu“配置 CMakeLists.txt” 步骤)

  • -rpath=”动态库的路径按需修改”
  • 注释掉libdrm相关编译选项
  • 注释掉SDL相关编译选项

image

编译与传输(编译步骤参考 Ubuntu,传输为开发板特有)

编译(参考 Ubuntu “编译步骤”)

与 Ubuntu 编译逻辑完全一致,通过 VSCode 或终端执行:

编译成功后,bin/目录生成 ARM 架构的main(Ubuntu 为 x86 架构)。

传输到开发板(开发板特有,无 Ubuntu 参考)

通过scp命令将main传送到 GEC6818 的/root目录(需确保 Ubuntu 与开发板在同一局域网):

# 格式:scp 本地文件路径 开发板用户名@开发板IP:开发板目标路径
gec@ubuntu:~/lv_port_linux-9.2/bin$ scp main root@192.168.1.100:/root/
# 输入开发板密码(默认多为root或123456),传输完成后提示“100%”

开发板运行验证

在 GEC6818 终端执行以下命令,启动 LVGL:

# 进入/root目录(可执行文件存放路径)
[root@GEC6818 ~]# cd /root/
# 赋予执行权限(首次运行需执行)
[root@GEC6818 ~]# chmod +x main
# 启动LVGL
[root@GEC6818 ~]# ./main
  • 成功现象:LCD 显示 LVGL 控件 demo(按钮、滑块等),触摸屏幕可正常交互。

image

开发板特有常见问题(无 Ubuntu 参考)

LCD 黑屏(无显示)

  • 原因 1:LCD 背光未开启,执行以下命令开启:

    [root@GEC6818 ~]# echo 255 > /sys/class/backlight/lcd-backlight/brightness
    
  • 原因 2:FBDEV 设备路径错误,修改lv_linux_fbdev.c中设备路径为/dev/fb0(GEC6818 默认帧缓冲设备)。

触摸屏无响应

  • 原因:设备文件路径错误,重新执行cat /proc/bus/input/devices确认触摸屏对应event号(如event1),并修改main.c/dev/input/event0为实际路径。
http://www.dtcms.com/a/552946.html

相关文章:

  • 长春网站制作昆明君创网络科技有限公司
  • 把 CLI 搬上 Web:在内网打造“可二开”的 AI IDE,为什么这条路更现实?
  • iOS 上架应用市场全流程指南,App Store 审核机制、证书管理与跨平台免 Mac 上传发布方案(含开心上架实战)
  • 酒厂网站源码now9999网站提示建设中
  • iOS 中的引用计数
  • C++多线程运行整理
  • 【渲染引擎基础】圣杯架构——固定逻辑时长+插值渲染
  • iOS 崩溃日志分析工具全指南,多工具协同构建稳定性分析体系
  • 做网站推广的难点、襄阳地区网站做的好的
  • 从U-Net到U-Net++:图像分割网络的进阶之路
  • 打工人日报#20251031
  • Huggingface的国内镜像
  • 软件测试工程师面试准备
  • Applications Manager 仪表盘:新增功能亮点
  • 怎样做网站表白网站策划与建设阶段的推广
  • 持续更新|第12弹:基于yolo算法识别的物体抓取
  • 使用Requests和正则表达式实现京东投影仪商品数据爬取
  • rabbitmq-k8s下双架构镜像+手动sts部署完全文档(下)
  • 仿RabbitMQ实现消息队列(二)-安装
  • 三网合一营销型全网站wordpress的功能简介
  • 鸿蒙分布式数据服务(DDS)原理与企业同步实战
  • 《pygame中Sprite类实现多帧动画》注-显示静态图片2-2
  • 2025年10月31日Github流行趋势
  • 深入浅出wpf学习总结
  • 建搜索引擎网站做欧洲电商看哪个网站
  • 【Linux网络】实现一个简单的聊天室
  • HTTPS接口国密安全设计-示例
  • 通过nginx+openssl自签名证书部署https应用并解决不安全问题
  • AI提示词:别再把提示词当 “聊天”—— 它是人机协作的 “接口定义”
  • Rust开发之使用panic!处理不可恢复错误