Linux驱动 2026年7月9日 36 分钟

tslib 交叉编译完整指南(x86 Linux → ARM)

tslib 交叉编译完整指南(x86 Linux → ARM) 本文档详细介绍如何在 x86 Linux 平台上交叉编译…

tslib 交叉编译完整指南(x86 Linux → ARM)

本文档详细介绍如何在 x86 Linux 平台上交叉编译 tslib 1.21 到 ARM 平台(如 i.MX6ULL)。


目录


环境准备

1. 系统要求

主机系统

  • Ubuntu 18.04/20.04/22.04 或其他 Linux 发行版
  • x86_64 架构

目标平台

  • ARM 架构(如 i.MX6ULL、树莓派等)
  • Linux 内核 4.x 或更高

2. 安装必要工具

# 更新软件源
sudo apt update

# 安装基础编译工具
sudo apt install -y build-essential
sudo apt install -y autoconf automake libtool
sudo apt install -y pkg-config

# 安装交叉编译工具链(根据目标平台选择)
# 对于 ARM32(如 i.MX6ULL)
sudo apt install -y gcc-arm-linux-gnueabihf
sudo apt install -y g++-arm-linux-gnueabihf

# 或者对于 ARM64
# sudo apt install -y gcc-aarch64-linux-gnu
# sudo apt install -y g++-aarch64-linux-gnu

3. 验证工具链

# 检查交叉编译器
arm-linux-gnueabihf-gcc --version

# 应该看到类似输出:
# arm-linux-gnueabihf-gcc (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0

交叉编译工具链配置

方案 1:使用系统自带工具链

1.1 设置环境变量

创建配置脚本 setup-cross-env.sh

#!/bin/bash

# 交叉编译工具链前缀
export CROSS_COMPILE=arm-linux-gnueabihf-

# 编译器设置
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export AS=${CROSS_COMPILE}as
export LD=${CROSS_COMPILE}ld
export RANLIB=${CROSS_COMPILE}ranlib
export STRIP=${CROSS_COMPILE}strip

# 目标架构
export ARCH=arm

# 安装目录(修改为你的实际路径)
export INSTALL_PREFIX=/opt/tslib-arm

echo "交叉编译环境已配置:"
echo "  CC        = $CC"
echo "  CXX       = $CXX"
echo "  ARCH      = $ARCH"
echo "  PREFIX    = $INSTALL_PREFIX"

使用配置:

# 添加执行权限
chmod +x setup-cross-env.sh

# 加载环境变量
source setup-cross-env.sh

方案 2:使用厂商提供的工具链(如韦东山 i.MX6ULL)

2.1 安装厂商工具链

# 假设工具链路径为(根据实际情况修改)
TOOLCHAIN_PATH=/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf

# 添加到 PATH
export PATH=$TOOLCHAIN_PATH/bin:$PATH

# 设置环境变量
export CROSS_COMPILE=arm-linux-gnueabihf-
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++

2.2 验证工具链

which arm-linux-gnueabihf-gcc
arm-linux-gnueabihf-gcc -v

tslib 交叉编译

1. 准备源码

# 进入 tslib 源码目录
cd /path/to/tslib-1.21

# 如果是 git 克隆的,需要先生成 configure 脚本
./autogen.sh

# 清理之前的编译(如果有)
make distclean

2. 配置编译选项

方式一:基础配置(推荐)

# 加载交叉编译环境
source setup-cross-env.sh

# 配置
./configure \
    --host=arm-linux-gnueabihf \
    --prefix=/usr/local \
    --sysconfdir=/etc \
    --enable-static \
    --enable-shared

# 参数说明:
# --host: 目标平台三元组
# --prefix: 安装路径前缀
# --sysconfdir: 配置文件路径
# --enable-static: 编译静态库
# --enable-shared: 编译动态库

方式二:完整配置(更多选项)

./configure \
    --host=arm-linux-gnueabihf \
    --prefix=/usr/local \
    --sysconfdir=/etc \
    --enable-static \
    --enable-shared \
    --enable-input=static \
    --enable-linear=static \
    --enable-median=static \
    --enable-dejitter=static \
    --with-sdl2=no

# 额外参数说明:
# --enable-XXX=static: 将模块静态链接到 libts
# --with-sdl2=no: 不依赖 SDL2(嵌入式通常不需要)

方式三:最小化配置(减小体积)

./configure \
    --host=arm-linux-gnueabihf \
    --prefix=/usr/local \
    --sysconfdir=/etc \
    --enable-static \
    --disable-shared \
    --enable-input=static \
    --enable-linear=static \
    --enable-median=static \
    --enable-dejitter=static \
    --disable-debug

# 这个配置会:
# - 只编译静态库
# - 内置常用模块
# - 禁用调试符号
# - 最终体积最小

3. 编译

# 编译(使用多核加速)
make -j$(nproc)

# 如果出错,可以单线程编译查看详细错误
# make

4. 安装到临时目录

# 创建临时安装目录
mkdir -p $PWD/install

# 安装到临时目录
make DESTDIR=$PWD/install install

# 查看生成的文件
tree install/

输出示例:

install/
├── etc
│   └── ts.conf
└── usr
    └── local
        ├── bin
        │   ├── ts_calibrate
        │   ├── ts_print
        │   ├── ts_test_mt
        │   └── ...
        ├── include
        │   └── tslib.h
        └── lib
            ├── libts.a
            ├── libts.so -> libts.so.0.10.5
            ├── libts.so.0 -> libts.so.0.10.5
            ├── libts.so.0.10.5
            └── ts
                ├── input.so
                ├── linear.so
                └── ...

5. 打包

# 进入安装目录
cd install

# 打包
tar czf tslib-1.21-arm.tar.gz usr/ etc/

# 查看压缩包大小
ls -lh tslib-1.21-arm.tar.gz

部署到目标板

1. 传输文件

方法 1:使用 scp

# 传输到目标板
scp tslib-1.21-arm.tar.gz root@192.168.1.100:/tmp/

# 如果使用串口,可以用 lrzsz
# rz  # 在目标板上执行

方法 2:使用 NFS 共享

# 在主机上配置 NFS
sudo apt install -y nfs-kernel-server

# 编辑 /etc/exports
sudo nano /etc/exports
# 添加:/home/your_user/nfs *(rw,sync,no_subtree_check,no_root_squash)

# 重启 NFS 服务
sudo systemctl restart nfs-kernel-server

# 在目标板上挂载
mount -t nfs 192.168.1.10:/home/your_user/nfs /mnt

2. 在目标板上安装

# 登录到目标板
ssh root@192.168.1.100

# 解压
cd /
tar xzf /tmp/tslib-1.21-arm.tar.gz

# 验证安装
ls -l /usr/local/lib/libts*
ls -l /usr/local/bin/ts_*

3. 配置环境变量

在目标板上创建 /etc/profile.d/tslib.sh

cat > /etc/profile.d/tslib.sh << 'EOF'
#!/bin/sh

# tslib 环境变量
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

# 添加到 PATH
export PATH=/usr/local/bin:$PATH
EOF

# 添加执行权限
chmod +x /etc/profile.d/tslib.sh

# 立即生效
source /etc/profile.d/tslib.sh

4. 配置 ts.conf

# 编辑配置文件
nano /etc/ts.conf

基础配置:

# 触摸屏设备(根据实际情况修改)
module_raw input

# 过滤器链
module median depth=3
module dejitter delta=100
module linear

5. 查找触摸设备

# 查看所有输入设备
cat /proc/bus/input/devices

# 或者使用 tslib 工具
ts_finddev

# 查看设备事件
hexdump /dev/input/event0
# 触摸屏幕应该看到数据输出

6. 校准触摸屏

# 运行校准程序
ts_calibrate

# 按照屏幕提示依次点击 5 个校准点
# 校准数据会保存到 /etc/pointercal

7. 测试

# 打印触摸事件
ts_print

# 图形化测试
ts_test_mt

实战示例:i.MX6ULL 平台

完整编译脚本

创建 build-imx6ull.sh

#!/bin/bash

set -e  # 遇到错误立即退出

# ==================== 配置区域 ====================

# 工具链路径(修改为你的实际路径)
TOOLCHAIN_PATH=/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf

# 源码路径
SOURCE_DIR=$(pwd)

# 安装路径
INSTALL_DIR=${SOURCE_DIR}/install-imx6ull

# 目标板 IP(用于自动部署)
TARGET_IP=192.168.1.100
TARGET_USER=root

# ==================== 环境设置 ====================

# 添加工具链到 PATH
export PATH=${TOOLCHAIN_PATH}/bin:$PATH

# 设置交叉编译变量
export CROSS_COMPILE=arm-linux-gnueabihf-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export RANLIB=${CROSS_COMPILE}ranlib
export STRIP=${CROSS_COMPILE}strip

echo "========================================"
echo "  tslib 交叉编译脚本 for i.MX6ULL"
echo "========================================"
echo "工具链: ${TOOLCHAIN_PATH}"
echo "编译器: $(${CC} --version | head -n1)"
echo "安装目录: ${INSTALL_DIR}"
echo ""

# ==================== 清理 ====================

echo "[1/5] 清理旧文件..."
make distclean 2>/dev/null || true
rm -rf ${INSTALL_DIR}
mkdir -p ${INSTALL_DIR}

# ==================== 配置 ====================

echo "[2/5] 配置编译选项..."
./configure \
    --host=arm-linux-gnueabihf \
    --prefix=/usr/local \
    --sysconfdir=/etc \
    --enable-static \
    --enable-shared \
    --enable-input=static \
    --enable-linear=static \
    --enable-median=static \
    --enable-dejitter=static \
    --with-sdl2=no

# ==================== 编译 ====================

echo "[3/5] 编译..."
make -j$(nproc)

# ==================== 安装 ====================

echo "[4/5] 安装到临时目录..."
make DESTDIR=${INSTALL_DIR} install

# ==================== 打包 ====================

echo "[5/5] 打包..."
cd ${INSTALL_DIR}
tar czf ${SOURCE_DIR}/tslib-imx6ull.tar.gz usr/ etc/
cd ${SOURCE_DIR}

echo ""
echo "========================================"
echo "  编译完成!"
echo "========================================"
echo "压缩包: ${SOURCE_DIR}/tslib-imx6ull.tar.gz"
echo "大小: $(du -h tslib-imx6ull.tar.gz | cut -f1)"
echo ""
echo "部署到目标板:"
echo "  scp tslib-imx6ull.tar.gz ${TARGET_USER}@${TARGET_IP}:/tmp/"
echo "  ssh ${TARGET_USER}@${TARGET_IP} 'cd / && tar xzf /tmp/tslib-imx6ull.tar.gz'"
echo ""

使用脚本:

chmod +x build-imx6ull.sh
./build-imx6ull.sh

常见问题

Q1: configure 找不到

问题

./configure: No such file or directory

解决

# 需要先生成 configure
./autogen.sh

# 如果 autogen.sh 也不存在,手动生成
autoreconf -ivf

Q2: 找不到交叉编译器

问题

checking for arm-linux-gnueabihf-gcc... no

解决

# 检查工具链是否在 PATH 中
echo $PATH
which arm-linux-gnueabihf-gcc

# 如果没有,添加到 PATH
export PATH=/path/to/toolchain/bin:$PATH

Q3: 库文件找不到

问题

error while loading shared libraries: libts.so.0

解决

# 在目标板上设置库路径
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

# 或永久添加
echo "/usr/local/lib" > /etc/ld.so.conf.d/tslib.conf
ldconfig

Q4: 权限问题

问题

ts_setup: Permission denied

解决

# 给设备文件添加权限
chmod 666 /dev/input/event*

# 或添加 udev 规则
echo 'SUBSYSTEM=="input", MODE="0666"' > /etc/udev/rules.d/99-input.rules
udevadm control --reload-rules

Q5: 编译错误:头文件找不到

问题

fatal error: linux/input.h: No such file or directory

解决

# 安装 Linux 内核头文件
sudo apt install -y linux-libc-dev

# 或者使用目标平台的 sysroot
./configure --host=arm-linux-gnueabihf \
    --with-sysroot=/path/to/sysroot

Q6: 静态编译失败

问题: 想完全静态编译,不依赖动态库

解决

# 完全静态配置
./configure \
    --host=arm-linux-gnueabihf \
    --enable-static \
    --disable-shared \
    --enable-input=static \
    --enable-linear=static \
    --enable-median=static \
    --enable-dejitter=static

# 编译时添加静态链接标志
make LDFLAGS="-static"

高级技巧

1. 自动化部署脚本

创建 deploy.sh

#!/bin/bash

TARGET_IP=${1:-192.168.1.100}
TARGET_USER=root

echo "部署 tslib 到 ${TARGET_USER}@${TARGET_IP}..."

# 传输文件
scp tslib-imx6ull.tar.gz ${TARGET_USER}@${TARGET_IP}:/tmp/

# 远程安装
ssh ${TARGET_USER}@${TARGET_IP} << 'EOF'
    cd /
    tar xzf /tmp/tslib-imx6ull.tar.gz
    
    # 配置环境变量
    cat > /etc/profile.d/tslib.sh << 'INNER_EOF'
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/bin:$PATH
INNER_EOF
    
    chmod +x /etc/profile.d/tslib.sh
    source /etc/profile.d/tslib.sh
    
    echo "安装完成!"
    ts_print --help
EOF

echo "部署成功!"

2. 交叉编译调试版本

# 带调试符号的版本
./configure \
    --host=arm-linux-gnueabihf \
    --prefix=/usr/local \
    --enable-debug \
    CFLAGS="-g -O0"

make

3. 条带调试符号

# 编译后条带符号减小体积
arm-linux-gnueabihf-strip install/usr/local/lib/libts.so*
arm-linux-gnueabihf-strip install/usr/local/bin/ts_*

总结

完整流程回顾

# 1. 准备环境
source setup-cross-env.sh

# 2. 配置
./configure --host=arm-linux-gnueabihf --prefix=/usr/local

# 3. 编译
make -j$(nproc)

# 4. 安装
make DESTDIR=$PWD/install install

# 5. 打包
cd install && tar czf ../tslib-arm.tar.gz usr/ etc/

# 6. 部署
scp ../tslib-arm.tar.gz root@192.168.1.100:/tmp/
ssh root@192.168.1.100 "cd / && tar xzf /tmp/tslib-arm.tar.gz"

关键要点

工具链配置是关键 – 确保 PATH 和环境变量正确
–host 参数必须匹配 – 使用正确的三元组
静态编译更方便 – 减少目标板依赖
环境变量要设置 – 在目标板上配置 LD_LIBRARY_PATH
设备权限要检查 – chmod 666 /dev/input/event*


版本:v1.0
日期:2026-07-06
适用平台:x86 Linux → ARM
tslib 版本:1.21

上一篇 tslib 学习手册2

tslib 学习手册 目录 学习路线图 推荐学习顺序 新手(只想使用): 开发者(深入理解): 系统集成(移植适配): ...

下一篇 Linux内核自带GPIO按键驱动程序分析

内核根据设备树生成一个平台设备,然后再根据设备树中内容来设置不太的input子系统功能 驱动程序所在文件:gpio_ke...