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 构建文件

1


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. 常见问题排查

  1. 编译报错 error: ‘for’ loop initial declarations...:
    • 确保 Makefile 中 CFLAGS 包含 -std=gnu99
  2. 头文件找不到 lvgl/lvgl.h:
    • 由于项目瘦身,直接引用 #include "lvgl.h" 即可。
  3. 运行显示 cannot open framebuffer device:
    • 检查设备节点是否存在,或使用 sudo 运行程序。
  4. 触摸无响应:
    • 运行 cat /proc/bus/input/devices 确认触摸屏对应的 event 编号,并修改 porting/evdev.c 中的 EVDEV_NAME