正点原子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/bin2. 获取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关键文件处理技巧:
- 将
lvgl/lv_conf_template.h复制为同级目录下的lv_conf.h - 将
lv_drivers/lv_drv_conf_template.h复制为lv_drv_conf.h - 复制
lv_port_linux_frame_buffer下的Makefile和main.c
3. 配置文件修改实战
3.1 Makefile适配
打开Makefile后需要修改以下几处:
- 修改CC变量为你的交叉编译器路径:
CC = arm-linux-gnueabihf-gcc- 建议注释掉-Wall编译选项(第7行),避免无关警告干扰
- 添加-std=c99编译选项:
CFLAGS += -std=c99- 如果不用鼠标设备,注释掉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常见问题排查:
- 屏幕花屏:检查lv_conf.h中的颜色深度设置
- 触摸无反应:确认event设备号是否正确
- 段错误:检查内存池大小是否足够
5. 解决Qt系统冲突
出厂Qt系统会占用显示设备,有两种解决方案:
临时方案:
mv /opt/QDesktop /opt/QDesktop.bak reboot需要恢复Qt时再移回原位置。
永久方案: 使用正点原子提供的busybox根文件系统替换原有系统,具体步骤:
- 下载rootfs.tar.bz2(路径:A-基础资料/8、系统镜像/2、教程系统镜像/3、文件系统)
- 使用MFG_TOOL工具烧录新文件系统
6. 进阶优化建议
移植成功后可以考虑:
- 启用双缓冲减少闪烁:
lv_disp_drv_t disp_drv; lv_disp_draw_buf_init(&draw_buf, buf1, buf2, DISP_BUF_SIZE);- 添加自定义主题:
lv_theme_t * th = lv_theme_default_init(...); lv_disp_set_theme(disp, th);- 优化刷新率:调整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实时查看运行状态。遇到复杂问题时,不妨先简化测试场景,比如先确保显示正常再调试触摸功能,这样可以快速定位问题根源。
