LVGL v8.3.11 移植到正点原子 i.MX6ULL 指南
本文档记录了将 LVGL v8.3.11 移植到正点原子 i.MX6ULL Linux 开发板的详细步骤和配置说明。
1. 环境准备
- 开发板: 正点原子 i.MX6ULL (ALPHA/MINI)
- 操作系统: Linux (Ubuntu 18.04+ 推荐)
- 交叉编译器:
arm-linux-gnueabihf-gcc - 依赖库: 标准 C 库、pthread、math
2. 项目瘦身 (可选但推荐)
为了保持工程清爽,删除了以下不必要的文件和文件夹:
demos/,docs/,examples/,scripts/,tests/.github/,env_support/CMakeLists.txt,Kconfig,SConscript等非 Makefile 构建文件

3. 核心配置 (lv_conf.h)
基于 lv_conf_template.h 创建 lv_conf.h 并进行了以下关键配置:
- 启用内容:
#if 1 - 颜色深度:
#define LV_COLOR_DEPTH 16(匹配 i.MX6ULL 的 16 位 Framebuffer) - 内存管理:
#define LV_MEM_CUSTOM 1(直接使用 Linux 的malloc/free)
- 系统 Tick:
#define LV_TICK_CUSTOM 1- 实现
custom_tick_get()函数,通过gettimeofday获取毫秒级时间。
- 日志系统:
#define LV_USE_LOG 1#define LV_LOG_PRINTF 1(通过 printf 输出调试信息)
4. 驱动实现 (porting/)
4.1 显示驱动 (Linux Framebuffer)
- 文件:
porting/fbdev.c,porting/fbdev.h - 设备:
/dev/fb0 - 实现:
fbdev_init(): 打开设备并使用mmap映射显存。fbdev_flush(): 将 LVGL 渲染的缓存拷贝到显存对应区域。
4.2 输入驱动 (Linux evdev)
- 文件:
porting/evdev.c,porting/evdev.h - 设备: 默认
/dev/input/event1(根据实际情况修改EVDEV_NAME) - 实现:
evdev_read(): 解析触摸屏产生的input_event数据,转换为 LVGL 的坐标和按键状态。
5. 编译系统 (Makefile)
创建了支持交叉编译的 Makefile,关键配置如下:
- 编译器:
CC = arm-linux-gnueabihf-gcc - 包含路径:
-I./ - 编译标准:
-std=gnu99(解决for循环中定义变量的编译报错) - 链接库:
-lm -lpthread - 核心规则: 包含
lvgl.mk以自动引入 LVGL 源码。
6. 使用说明
6.1 编译
在项目根目录下执行:
make clean
make -j4
生成可执行文件 lvgl_demo。
6.2 运行
将 lvgl_demo 拷贝到开发板后运行:
chmod +x lvgl_demo
./lvgl_demo
7. 常见问题排查
- 编译报错
error: ‘for’ loop initial declarations...:- 确保 Makefile 中
CFLAGS包含-std=gnu99。
- 确保 Makefile 中
- 头文件找不到
lvgl/lvgl.h:- 由于项目瘦身,直接引用
#include "lvgl.h"即可。
- 由于项目瘦身,直接引用
- 运行显示
cannot open framebuffer device:- 检查设备节点是否存在,或使用
sudo运行程序。
- 检查设备节点是否存在,或使用
- 触摸无响应:
- 运行
cat /proc/bus/input/devices确认触摸屏对应的event编号,并修改porting/evdev.c中的EVDEV_NAME。
- 运行