Bootstrap

LVGL移植到AM335x+Linux系统

LVGL移植到AM335x+Linux系统

1. 概述

本文档详细介绍如何将LVGL 8.3版本移植到基于AM335x处理器的Linux系统中,包括LVGL库的配置、tslib触摸驱动的移植以及示例应用的编译运行。整个项目使用CMake作为构建系统。

1.1 开发环境

  • 硬件平台:AM335x处理器
  • 操作系统:Linux
  • LVGL版本:8.3
  • 构建工具:CMake 3.16+
  • 交叉编译工具链:arm-arago-linux-gnueabi-gcc 4.5.3

2. 交叉编译环境配置

2.1 工具链配置

项目使用arm-arago-linux-gnueabi工具链进行交叉编译。在toolchain.cmake中配置如下:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER /opt/am335xt3-cross-devkit/bin/arm-arago-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER /opt/am335xt3-cross-devkit/bin/arm-arago-linux-gnueabi-g++)
set(CMAKE_ASM_COMPILER /opt/am335xt3-cross-devkit/bin/arm-arago-linux-gnueabi-as)

2.2 编译选项

在toolchain.cmake中设置了必要的编译标志:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g -rdynamic -g0 -Wall -Wshadow -Wundef -Wmissing-prototypes -Wall -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing ...")

3. LVGL配置与编译

3.1 LVGL配置

  1. 配置lv_conf.h文件:

    • 设置显示缓冲区大小
    • 配置色彩深度
    • 启用需要的功能模块
  2. 配置显示驱动:

    • 使用fbdev作为显示驱动
    • 配置正确的显示分辨率和颜色格式

3.2 CMake构建配置

主CMakeLists.txt文件配置示例:

cmake_minimum_required(VERSION 3.16)
project(lvgl_project)

# 设置工具链文件
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/toolchain.cmake)

# 添加LVGL库
add_subdirectory(lvgl)

# 添加驱动库
add_subdirectory(lv_drivers)

4. tslib触摸驱动移植

4.1 tslib安装与配置

  1. 安装tslib:
git clone https://github.com/libts/tslib.git
cd tslib
./autogen.sh
./configure --host=arm-arago-linux-gnueabi
make
make install
  1. 配置环境变量:
export TSLIB_TSDEVICE=/dev/input/touchscreen0
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0

4.2 在LVGL中集成tslib

  1. 在CMake配置中添加tslib依赖:
# 查找 pkg-config 模块
set(ENV{PKG_CONFIG_PATH} ${am335xt3_ROOT_PATH}/tslib/lib/pkgconfig)
# 查找 pkg-config 模块
find_package(PkgConfig REQUIRED)
# 查找一个库,例如 tslib
pkg_check_modules(tslib REQUIRED tslib-0.0)
# 包含 tslib 的头文件路径
target_include_directories(helloworld PRIVATE ${tslib_INCLUDE_DIRS})
# 链接 tslib 库
target_link_libraries(helloworld PRIVATE ${tslib_LDFLAGS})
  1. 初始化触摸设备:

首先,实现tslib的初始化函数:

static struct tsdev *ts;

int tslib_init(void) {
    // 打开触摸屏设备
    ts = ts_open("/dev/input/touchscreen0", 0);
    if (!ts) {
        perror("Failed to open touchscreen device");
        return -1;
    }

    // 配置tslib(加载校准参数等)
    if (ts_config(ts) < 0) {
        perror("Failed to configure tslib");
        ts_close(ts);
        return -1;
    }
    return 0;
}

然后,实现触摸数据读取函数:

static bool tslib_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
    struct ts_sample sample;
    if (ts_read(ts, &sample, 1) == 1) {
        data->point.x = sample.x;
        data->point.y = sample.y;
        data->state = (sample.pressure > 0) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
        return false;  // 没有更多数据需要读取
    }
    return false;
}

最后,注册触摸输入设备驱动:

lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = tslib_read;  // 使用tslib_read作为回调函数
lv_indev_drv_register(&indev_drv);

5. HelloWorld示例应用

完整的HelloWorld示例源码可以在以下地址获取:
https://gitcode.com/am335xt3/lvgl/tree/main/apps/helloworld

5.1 应用程序结构

apps/helloworld/
├── CMakeLists.txt
├── src/
│   ├── main.c
│   ├── dump.c
│   └── mouse_cursor_icon.c

5.2 编译配置

apps/helloworld/CMakeLists.txt配置示例:

add_executable(helloworld
    src/main.c
    src/dump.c
    src/mouse_cursor_icon.c
)

target_link_libraries(helloworld
    lvgl
    lv_drivers
    ts
)

5.3 编译和运行

  1. 创建构建目录并编译:
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
make
  1. 部署到目标板:
scp apps/helloworld/helloworld root@target:/usr/bin/
  1. 运行应用:
./helloworld

6. 调试与优化

6.1 常见问题解决

  1. 显示问题:

    • 检查framebuffer设备节点权限
    • 验证色彩格式配置
    • 确认缓冲区大小设置
  2. 触摸问题:

    • 检查tslib配置文件
    • 验证触摸设备节点
    • 执行触摸屏校准

6.2 性能优化

  1. 显示优化:

    • 调整双缓冲配置
    • 优化刷新率设置
  2. 内存优化:

    • 调整LVGL对象缓存
    • 优化动画缓存

7. 参考资料

  • LVGL官方文档:https://docs.lvgl.io/8.3/
  • tslib项目:https://github.com/libts/tslib
  • CMake文档:https://cmake.org/documentation/
;