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

正点原子IMX6ULL开发板LVGL v8.2移植实战:从源码到触屏调试

1. 硬件准备与环境搭建

拿到正点原子IMX6ULL开发板的第一件事,就是确认硬件配置。我手头这块阿尔法开发板搭载的是7寸电容触摸屏,分辨率1024x600,出厂预装了Qt系统。这里有个小细节要注意:开发板的HDMI输出和LCD屏幕是共用显示通道的,如果同时连接了HDMI显示器,需要先拔掉HDMI线才能正常使用板载屏幕。

开发环境建议使用Ubuntu 18.04或20.04,实测这两个版本的工具链最稳定。需要提前安装的依赖包括:

  • 交叉编译工具链:gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
  • NFS服务(用于文件传输)
  • Git(源码下载)

安装交叉编译器时我踩过一个坑:有些教程会建议用apt安装arm-linux-gnueabihf-gcc,但这个版本太新可能导致兼容性问题。建议直接使用正点原子提供的工具链,解压后记得把bin目录加入PATH环境变量:

export PATH=$PATH:/your_path/gcc-linaro-7.5.0-2019.12/bin

2. 获取LVGL源码的正确姿势

官方推荐使用Git获取指定版本源码,但国内开发者常遇到下载慢的问题。这里分享我的解决方案:

git clone -b release/v8.2 https://gitee.com/mirrors/lvgl.git git clone -b release/v8.2 https://gitee.com/mirrors/lv_drivers.git git clone -b release/v8.2 https://gitee.com/mirrors/lv_port_linux_frame_buffer.git

使用Gitee镜像源速度会快很多。特别注意必须加上-b release/v8.2参数,因为LVGL v9的API变化较大,直接克隆主分支会导致后续适配失败。

源码下载完成后,建议按以下结构组织目录:

/lvgl_project ├── lvgl ├── lv_drivers ├── lv_port_linux_frame_buffer ├── lv_conf.h ├── lv_drv_conf.h ├── Makefile └── main.c

关键文件处理技巧:

  1. lvgl/lv_conf_template.h复制为同级目录下的lv_conf.h
  2. lv_drivers/lv_drv_conf_template.h复制为lv_drv_conf.h
  3. 复制lv_port_linux_frame_buffer下的Makefile和main.c

3. 配置文件修改实战

3.1 Makefile适配

打开Makefile后需要修改以下几处:

  1. 修改CC变量为你的交叉编译器路径:
CC = arm-linux-gnueabihf-gcc
  1. 建议注释掉-Wall编译选项(第7行),避免无关警告干扰
  2. 添加-std=c99编译选项:
CFLAGS += -std=c99
  1. 如果不用鼠标设备,注释掉CSRCS中的鼠标相关源文件

3.2 屏幕参数配置

在main.c中找到以下关键参数修改:

#define DISP_BUF_SIZE (1024 * 600 * 2) // 16位色深需要的缓冲区大小 static lv_disp_drv_t disp_drv; lv_disp_draw_buf_init(&draw_buf, buf1, buf2, DISP_BUF_SIZE);

特别注意:正点原子7寸屏的触摸方向可能需要调整,如果发现触摸位置不对,可以在main.c的touchpad_read函数中添加坐标转换:

static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { >#define LV_COLOR_DEPTH 16 // 实测16位色效果最佳 #define LV_HOR_RES_MAX 1024 #define LV_VER_RES_MAX 600 #define LV_USE_PERF_MONITOR 1 // 开启性能监控 #define LV_MEM_SIZE (512U * 1024U) // 内存池大小

3.4 驱动配置技巧

lv_drv_conf.h中需要关注:

#define USE_FBDEV 1 #define FBDEV_PATH "/dev/fb0" #define USE_EVDEV 1 #define EVDEV_NAME "/dev/input/event1"

如何确认event设备号?在开发板上执行:

hexdump /dev/input/eventX

依次尝试event0到event5,触摸屏幕时能看到数据输出的就是正确的设备。

4. 编译与调试实战

使用make -j4编译(根据CPU核心数调整线程数),编译成功后通过NFS将demo文件传输到开发板。遇到权限问题可以执行:

chmod +x demo ./demo

常见问题排查:

  1. 屏幕花屏:检查lv_conf.h中的颜色深度设置
  2. 触摸无反应:确认event设备号是否正确
  3. 段错误:检查内存池大小是否足够

5. 解决Qt系统冲突

出厂Qt系统会占用显示设备,有两种解决方案:

临时方案

mv /opt/QDesktop /opt/QDesktop.bak reboot

需要恢复Qt时再移回原位置。

永久方案: 使用正点原子提供的busybox根文件系统替换原有系统,具体步骤:

  1. 下载rootfs.tar.bz2(路径:A-基础资料/8、系统镜像/2、教程系统镜像/3、文件系统)
  2. 使用MFG_TOOL工具烧录新文件系统

6. 进阶优化建议

移植成功后可以考虑:

  1. 启用双缓冲减少闪烁:
lv_disp_drv_t disp_drv; lv_disp_draw_buf_init(&draw_buf, buf1, buf2, DISP_BUF_SIZE);
  1. 添加自定义主题:
lv_theme_t * th = lv_theme_default_init(...); lv_disp_set_theme(disp, th);
  1. 优化刷新率:调整lv_conf.h中的LV_DISP_DEF_REFR_PERIOD参数

移植过程中如果遇到异常崩溃,建议在main函数开头添加信号处理:

#include <signal.h> void sig_handler(int signo) { printf("Received signal %d\n", signo); } signal(SIGSEGV, sig_handler);

最后提醒一点:LVGL的日志输出非常有用,可以通过tail -f /var/log/syslog实时查看运行状态。遇到复杂问题时,不妨先简化测试场景,比如先确保显示正常再调试触摸功能,这样可以快速定位问题根源。

http://www.jsqmd.com/news/694931/

相关文章:

  • 开发盲盒小程序,这些坑要避开
  • 安道利老师助力临夏腾顺驾校实现AI招生破局
  • MySQL学习笔记:乐观锁VS悲观锁/八股总结
  • SUSE Linux 11实战:用系统自带多路径连接华为OceanStor存储(iSCSI版)
  • VSCode多智能体调试正在淘汰传统单点断点模式!2024年Gartner技术成熟度报告证实:分布式调试已成为AI原生开发刚需
  • 西门子S7-1200 PLC如何通过Modbus TCP读写RFID标签?一个博图V14的实操案例
  • TiDB 混合负载场景下的 ETL 与 CDC 实践
  • 垃圾AI清理技术:系统架构、核心算法与测试挑战
  • WPF资源字典的模块化拼图:MergedDictionaries的实战应用与设计模式
  • 【ESP32实战指南】FreeRTOS核心机制解析:从任务调度到进程间通信
  • AI工程师的黄金十年:选对赛道比努力更重要
  • 4月23日足球赛事分析
  • Pikachu的python一键exp,盲注(base on boolian),盲注(base on time),宽字节注入
  • XOutput:你的老旧游戏手柄重获新生的终极兼容神器
  • 远程管理停车系统厂家推荐★智能停车系统厂家★智慧停车解决方案测评分析
  • 告别Python依赖:手把手教你用纯C在STM32F4上跑通LeNet-5(附完整源码)
  • 别再只盯着客户端了!用云函数+API工具5分钟搞定Uni-App uni-push 2.0消息测试
  • Vue3:全流程开发
  • 如何高效使用国家自然科学基金LaTeX模板:科研写作的终极指南
  • 告别‘so库丢失’:Flutter插件集成C++库时libc++_shared.so的完整配置流程
  • 如何用Spek音频频谱分析器轻松掌握音频质量检测:新手终极指南
  • 保姆级教程:在Win10的WSL2里用上你的USB摄像头(以Intel D435i为例)
  • 告别在线焦虑:B站视频下载器如何帮你永久收藏4K超清内容
  • 2027届文亮高考冲刺集训营:全职明星师资领航,助力 70 余名学员提分超百分
  • Flutter for OpenHarmony 应用更新检测与萌系搜索功能实战小记✨
  • 手机里的‘保险柜’:一文搞懂eMMC的RPMB分区如何保护你的指纹和支付密钥
  • 告别手动调参!用Python手搓KCF目标跟踪器,从HOG特征到模型更新保姆级教程
  • Kali换源后apt update还报错?手把手教你排查和修复常见源配置问题
  • 暗黑破坏神3终极辅助工具:D3KeyHelper免费完整指南
  • 笔记本远程调用台式机Ollama教程