• tslib库的移植



    tslib库的移植

    1. 下载

    下载地址:github仓库

    2. 将下载好的压缩包移动到linux虚拟机上,并解压,进入该目录

    tar -xJf tslib-1.21.tar.xz
    cd tslib-1.21
    
    • 1
    • 2

    3. 执行configure来配置Makefile文件

    注意: prefix不能随便指明路径,因为以后运行程序的时候,程序会根据该路径去寻找库文件。如果打算将编译好的lib下所有的库文件放在开发板的/lib下,那么就应该将prefix设置为/;如果打算将编译好的lib下的所有库文件放在开发板的/usr/lib下,那么就应该将prefix设置为/usr

    ./configure --host=arm-linux-gnueabihf prefix=/
    
    • 1

    4. 执行make编译库

    make DESTDIR=/home/hxd/tools/tslib   # DESTDIR用于指定你的安装位置
    make install
    
    • 1
    • 2

    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/
    
    • 1
    • 2
    • 3

    6. 将编译好的库配置到开发板上

    我们只需要将lib文件夹的所有文件放在开发板的/lib文件夹下(/lib还是/usr/lib取决于你的第三步)

    先将tslib文件夹复制nfs的目录下,然后开发板挂载该nfs,也可以通过其他方式将文件拷贝到服务器上
    cp -rfd /mnt/tslib/lib/* /lib
    
    • 1
    • 2

    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;
    		}
    
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
  • 相关阅读:
    单目标应用:基于狐猴优化算法(Lemurs Optimizer,LO)的微电网优化调度MATLAB
    cesium 实战记录(六)地图通用工具方法的封装
    云计算-Hadoop-2.7.7 最小化集群的搭建(3台)
    算法-动态规划专题
    力扣(LeetCode)算法_C++——最大连续 1 的个数 III
    从零开始实现lmax-Disruptor队列(五)Disruptor DSL风格API原理解析
    LeetCode使用JavaScript破解两数之和
    【网页前端】CSS样式表进阶之伪元素
    Python 随机(random)模块的不可预测之美
    c# 中的类
  • 原文地址:https://blog.csdn.net/weixin_47024013/article/details/125527580