tslib移植到AM335x+Linux系统

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 配置文件

  1. 创建tslib配置目录:
mkdir -p /etc/ts.conf.d
  1. 创建/etc/ts.conf文件:
module_raw input
module pthres pmin=1
module dejitter delta=100
module linear
  1. 创建环境变量配置文件/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 基本测试

  1. 运行ts_test程序:
ts_test
  1. 触摸屏校准:
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;
}

这个示例展示了:

  1. 如何初始化tslib并配置触摸屏设备
  2. 如何实现tslib的读取回调函数
  3. 如何将tslib与LVGL的输入设备驱动系统集成
  4. 完整的资源初始化和清理流程

7. 常见问题

  1. 触摸屏无响应

    • 检查设备节点是否存在
    • 确认环境变量是否正确设置
    • 检查ts.conf配置是否正确
  2. 触摸位置不准确

    • 运行ts_calibrate重新校准
    • 检查校准文件/etc/pointercal是否存在
  3. 编译错误

    • 确认交叉编译工具链是否正确设置
    • 检查依赖库是否完整

8. 参考资料

  1. tslib官方文档:https://github.com/libts/tslib
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值