文章目录
- 一、tslib是啥?
- 二、tslib 框架分析
- 三、交叉编译、测试 tslib
- 3.1、交叉编译tslib
- (1)设置交叉编译工具链
- (2)进入tslib目录
- (3)安装工具链
- (4)确定工具链中头文件、库文件目录
- 3.2、测试 tslib
- 3.3、自己写一个测试程序
- 上机实验:
一、tslib是啥?
tslib 是一个触摸屏的开源库,可以使用它来访问触摸屏设备,可以给输入设 备 添 加 各 种 “ filter ” ( 过 滤 器 , 就 是 各 种 处 理 ) , 地 址 是 :tslib
编译 tslib 后,可以得到 libts 库,还可以得到各种工具:较准工具、测试工具。
二、tslib 框架分析
核心在于“plugins”目录里的“插件”,或称为“module”。这个目录下的每个文件都是一个 module,每个 module 都提供 2 个函数:read、read_mt,前者用于读取单点触摸屏的数据,后者用于读取多点触摸屏的数据。
要分析 tslib 的框架,先看看示例程序怎么使用,我们参考 ts_test.c 和
ts_test_mt.c,前者用于一般触摸屏(比如电阻屏、单点电容屏),后者用于多
点触摸屏。
一个图就可以弄清楚 tslib 的框架:
调用 ts_open 后,可以打开某个设备节点,构造出一个 tsdev 结构体。然后调
用 ts_config 读取配置文件的处理,假设/etc/ts.conf 内容如下:
module_raw input
module pthres pmin=1
module dejitter delta=100
module linear
每行表示一个“module”或“moduel_raw”
对于所有的“module”,都会插入 tsdev.list 链表头,也就是 tsdev.list执行配置文件中最后一个“module”,配置文件中第一个“module”位于链表的尾部。
对于所有的“module_raw”,都会插入 tsdev.list_raw 链表头,一般只有一“module_raw”。
无论是调用 ts_read 还是 ts_read_mt,都是通过 tsdev.list 中的模块来
处理数据的。这写模块是递归调用的,比如linear模块的read函数如图 7.24:
linear 模块的 read_raw 函数如图 7.25:
因为是递归调用,所有最先使用 input 模块读取设备节点得到原始数据,再依次经过 pthres 模块、dejitter 模块、linear 模块处理后,才返回最终数据。
三、交叉编译、测试 tslib
3.1、交叉编译tslib
(1)设置交叉编译工具链
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
(2)进入tslib目录
从window上传tslib压缩包到ubuntu,然后执行下面命令进入tslib目录:
tar -xzf tslib-1.21.tar.xz
cd tslib-1.21
常见报错解决:
如果解压报错:
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
解决方法:tar -vxf tslib-1.21.tar.xz
1、压缩的时候用cvf参数,解压的时候用xvf参数
2、压缩的时候用czvf参数,解压的时候用xzvf参数
(3)安装工具链
执行下面命令:
./configure --host=arm-buildroot-linux-gnueabihf --prefix=/
make
make install DESTDIR=$PWD/tmp
cd tmp/
(4)确定工具链中头文件、库文件目录
echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v -
cp include/* /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include
cp -d lib/*so* /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/
3.2、测试 tslib
把库文件放到单板上:运行程序要用。先在开发板上使用 NFS 挂载 Ubuntu 的目录,再把前面编译出来的 tslib-1.21/tmp/部分文件复制到板子上,示例命令如下:
cp /mnt/tslib-1.21/tmp/lib/ts -rfd /lib
cp /mnt/tslib-1.21/tmp/lib/so -d /lib
cp /mnt/tslib-1.21/tmp/bin/* /bin
cp /mnt/tslib-1.21/tmp/etc/ts.conf -d /etc
对于 IMX6ULL,首先需要关闭默认的 qt gui 程序,才可以执行 ts_test_mt 测试命令,关闭 qt 命令如下所示:
mv /etc/init.d/*hmi* /root
mv /etc/init.d/*lvgl* /root
reboot
在单板上执行测试程序:
export TSLIB_PLUGINDIR=/lib/ts
ts_test_mt
3.3、自己写一个测试程序
程序(screen1.c):打印出触摸屏的触摸点的坐标以及压力值
#include <tslib.h>
#include <stdio.h>//定义一个指向触摸屏设备的静态全局变量
static struct tsdev *g_ts;int main()
{struct ts_sample samp;int ret;//初始化触摸屏设备g_ts = ts_setup(NULL, 0);if (!g_ts){printf("ts_setup err\n");return -1;}while(1){//从触摸屏读取一个样品ret = ts_read(g_ts, &samp, 1);if (ret != 1)return -1;//填充数据,便于保存printf("iX: %d\n",samp.x);printf("iY: %d\n",samp.y); printf("pre: %d\n",samp.pressure);}//samp.tv;//读取成功,返回0return 0;
}
上机实验:
编译:arm-buildroot-linux-gnueabihf-gcc -o test screen1.c -lts
拷贝过去板子:cp test ~/nfs_rootfs/
运行:./test
现象: