tslib移植到AM335x+Linux系统
1. 概述
tslib是一个开源的触摸屏库,提供触摸屏设备的读取、校准和过滤等功能。本文档详细介绍如何将tslib 1.23版本移植到AM335x+Linux系统中。
2. 环境准备
2.1 开发环境
- 主机系统:ubuntu 20
- 交叉编译工具链:arm-arago-linux-gnueabi-gcc
- CMake版本:3.16.3
- tslib版本:1.23
2.2 目标板环境
- 处理器:AM335x
- 操作系统:Linux 3.2
- 文件系统:具有读写权限的根文件系统
3. 源码获取
tslib 1.23的源码位于项目的thirdpart/tslib/tslib-1.23目录:
https://gitcode.com/am335xt3/lvgl/tree/main/thirdpart/tslib/tslib-1.23
如果需要重新获取源码,可以从官方仓库下载:
wget https://github.com/libts/tslib/releases/download/1.23/tslib-1.23.tar.gz
tar xzf tslib-1.23.tar.gz
4. 交叉编译
4.1 CMake配置
在项目根目录下,创建或修改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)
4.2 编译配置
创建build目录并进行配置:
mkdir build
cd build
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=/usr
4.3 编译和安装
make -j4
make install DESTDIR=./install
5. 目标板安装
5.1 文件拷贝
将编译生成的文件拷贝到目标板的根文件系统中:
# 在目标板上执行
cp -r /path/to/install/usr/* /usr/
5.2 配置文件
- 创建tslib配置目录:
mkdir -p /etc/ts.conf.d
- 创建/etc/ts.conf文件:
module_raw input
module pthres pmin=1
module dejitter delta=100
module linear
- 创建环境变量配置文件/etc/profile.d/tslib.sh:
export TSLIB_TSDEVICE=/dev/input/touchscreen0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
5.3 设备节点
确保触摸屏设备节点存在并具有正确的权限:
ls -l /dev/input/touchscreen0
# 如果需要,创建软链接
ln -s /dev/input/eventX /dev/input/touchscreen0
# 设置权限
chmod 666 /dev/input/touchscreen0
6. 测试验证
6.1 基本测试
- 运行ts_test程序:
ts_test
- 触摸屏校准:
ts_calibrate
6.2 在应用程序中使用
以下是在LVGL应用程序中集成tslib的示例代码(参考本项目的helloworld组件):
#include <tslib.h>
#include "lvgl/lvgl.h"
static struct tsdev *ts;
static lv_indev_t *touch_indev;
// tslib读取回调函数,用于LVGL输入设备驱动
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;
}
// tslib初始化函数
int tslib_init(void) {
// 使用非阻塞方式打开触摸屏设备
ts = ts_open("/dev/input/touchscreen0", 1);
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;
}
// 在LVGL中注册触摸输入设备
void register_touch_input(void) {
static 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;
touch_indev = lv_indev_drv_register(&indev_drv);
}
// 主函数中的使用示例
int main(void) {
// 初始化LVGL
lv_init();
// 初始化tslib
if (tslib_init() < 0) {
printf("Failed to initialize tslib\n");
return -1;
}
// 注册触摸输入设备
register_touch_input();
// ... 其他LVGL初始化代码 ...
// 主循环
while(1) {
lv_task_handler();
usleep(5000);
}
// 清理资源
ts_close(ts);
return 0;
}
这个示例展示了:
- 如何初始化tslib并配置触摸屏设备
- 如何实现tslib的读取回调函数
- 如何将tslib与LVGL的输入设备驱动系统集成
- 完整的资源初始化和清理流程
7. 常见问题
-
触摸屏无响应
- 检查设备节点是否存在
- 确认环境变量是否正确设置
- 检查ts.conf配置是否正确
-
触摸位置不准确
- 运行ts_calibrate重新校准
- 检查校准文件/etc/pointercal是否存在
-
编译错误
- 确认交叉编译工具链是否正确设置
- 检查依赖库是否完整
8. 参考资料
- tslib官方文档:https://github.com/libts/tslib