tslib库的移植
1. 下载
下载地址:github仓库
2. 将下载好的压缩包移动到linux虚拟机上,并解压,进入该目录
tar -xJf tslib-1.21.tar.xz cd tslib-1.21
3. 执行configure来配置Makefile文件
注意: prefix不能随便指明路径,因为以后运行程序的时候,程序会根据该路径去寻找库文件。如果打算将编译好的lib下所有的库文件放在开发板的/lib下,
那么就应该将prefix设置为/;如果打算将编译好的lib下的所有库文件放在开发板的/usr/lib下,那么就应该将prefix设置为/usr
./configure --host=arm-linux-gnueabihf prefix=/
4. 执行make编译库
make DESTDIR=/home/hxd/tools/tslib # DESTDIR用于指定你的安装位置 make install
5. 将编译好的文件配置到编译工具链
该步骤可做可不做,做了以后编译程序的时候可以不用手动指定需要该库的库文件路径和头文件路径
关于将编译好的库放在那个位置,可以查看这篇文章的1.5小节: https://blog.csdn.net/weixin_47024013/article/details/125527484
cp /home/hxd/tools/tslib/include/* -rfd /usr/lib/gcc-cross/arm-linux-gnueabihf/9/include/ # 第一个路径与你指定的库的安装路径有关 cp /home/hxd/tools/tslib/lib/* -rfd /usr/lib/gcc-cross/arm-linux/gnueabihf/9/ cp /home/hxd/tools/tslib/etc/* -rfd /etc/
6. 将编译好的库配置到开发板上
我们只需要将lib文件夹的所有文件放在开发板的/lib文件夹下(/lib还是/usr/lib取决于你的第三步)
先将tslib文件夹复制nfs的目录下,然后开发板挂载该nfs,也可以通过其他方式将文件拷贝到服务器上 cp -rfd /mnt/tslib/lib/* /lib
7. 实例
7.1 单点触摸
#include<stdio.h> #include<stdlib.h> #include<tslib.h> int main() { struct tsdev *ts = NULL; // 设备句柄 struct ts_sample samp; int pressure = 0; ts = ts_setup(NULL, 0); if (ts == NULL) { fprintf(stderr, "ts_setup error\n"); exit(-1); } for(;;) { if (0 > ts_read(ts, &samp, 1)) { fprintf(stderr, "ts_read error\n"); exit(-1); } if (samp.pressure > 0) { if (pressure > 0) { printf("移动(%d, %d)\n", samp.x, samp.y); } else { printf("按下(%d, %d)\n", samp.x, samp.y); } pressure = samp.pressure; } else if (samp.pressure == 0 && pressure > 0) { printf("松开(%d, %d)\n", samp.x, samp.y); pressure = samp.pressure; } } }
7.2 多点触摸
#include<stdio.h> #include<stdlib.h> #include<sys/ioctl.h> #include<linux/input.h> #include<tslib.h> #include<string.h> int main() { struct tsdev *ts = NULL; struct ts_sample_mt *mt_ptr = NULL; struct ts_sample_mt *mt_old = NULL; struct input_absinfo slot; int max_slots; int i = 0; // 初始化 ts = ts_setup(NULL, 0); if (ts < 0) { printf("setup error\n"); return -1; } // 获取该触摸屏支持的触摸点数 if (0 > ioctl(ts_fd(ts), EVIOCGABS(ABS_MT_SLOT), &slot)) { printf("ioctl error\n"); return -1; } max_slots = slot.maximum - slot.minimum + 1; printf("max_slots: %d\n", max_slots); // 开辟空间 mt_ptr = (struct ts_sample_mt *)malloc(sizeof(struct ts_sample_mt)*max_slots); mt_old = (struct ts_sample_mt *)malloc(sizeof(struct ts_sample_mt)*max_slots); if (mt_ptr == NULL || mt_old == NULL) { printf("malloc error\n"); return -1; } memset(mt_ptr, 0, sizeof(struct ts_sample_mt)*max_slots); memset(mt_old, 0, sizeof(struct ts_sample_mt)*max_slots); for(;;) { if (ts_read_mt(ts, &mt_ptr, max_slots, 1) < 0) { printf("ts_read_mt error\n"); exit(-1); } //printf("-------debug---------\n"); for (i=0;i<max_slots;i++) { if (mt_ptr[i].valid) { printf("i: %d\n", i); if (mt_ptr[i].pressure > 0) { if (mt_old[i].pressure > 0) { printf("slot<%d>, 移动(%d, %d)\n", mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y); } else { printf("slot<%d>, 按下(%d, %d)\n", mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y); } memcpy(&mt_old[i], &mt_ptr[i], sizeof(struct ts_sample_mt)); } else { printf("slot<%d>, 松开(%d, %d)\n", mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y); memcpy(&mt_old[i], &mt_ptr[i], sizeof(struct ts_sample_mt)); } } } } free(mt_ptr); free(mt_old); return 0; }