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配置
-
配置lv_conf.h文件:
- 设置显示缓冲区大小
- 配置色彩深度
- 启用需要的功能模块
-
配置显示驱动:
- 使用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安装与配置
- 安装tslib:
git clone https://github.com/libts/tslib.git
cd tslib
./autogen.sh
./configure --host=arm-arago-linux-gnueabi
make
make install
- 配置环境变量:
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
- 在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})
- 初始化触摸设备:
首先,实现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 编译和运行
- 创建构建目录并编译:
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
make
- 部署到目标板:
scp apps/helloworld/helloworld root@target:/usr/bin/
- 运行应用:
./helloworld
6. 调试与优化
6.1 常见问题解决
-
显示问题:
- 检查framebuffer设备节点权限
- 验证色彩格式配置
- 确认缓冲区大小设置
-
触摸问题:
- 检查tslib配置文件
- 验证触摸设备节点
- 执行触摸屏校准
6.2 性能优化
-
显示优化:
- 调整双缓冲配置
- 优化刷新率设置
-
内存优化:
- 调整LVGL对象缓存
- 优化动画缓存
7. 参考资料
- LVGL官方文档:https://docs.lvgl.io/8.3/
- tslib项目:https://github.com/libts/tslib
- CMake文档:https://cmake.org/documentation/