1. 拷贝至开发板

上次实验中的 tmp 文件夹拷贝到开发板,可以通过 nfs 来传输,并将 tmp/lib 下的所有 .so 文件拷贝至 开发板的 /usr/lib 中,并且确保库的映射关系正确。

2. 声明 tslib 的环境变量

export TSLIB_CALIBFILE='/etc/pointercal'
export TSLIB_CONFFILE='/tslib/etc/ts.conf'
export TSLIB_CONSOLEDEVICE='none'
export TSLIB_FBDEVICE='/dev/fb0'
export TSLIB_PLUGINDIR='/tslib/lib/ts'
export TSLIB_TSDEVICE='/dev/input/event1'

这里的 TSLIB_TSDEVICE,要选择与你的触摸屏对应的 event,有一个好的方法,通过命令

cat /proc/bus/input/devices

来确定,我的屏幕为 ft5x06,信息如下:

3. 运行测试程序

进入到 /tslib/bin

执行 ./ts_test

很尴尬,得到以下提示:

selected device is not a touchscreen I understand

去网上搜索了下,有曾经遇到过该问题的网友写道:

是由于内核和编译器的一个宏(EV_VERSION 位置:内核和编译器的 input.h 文件中声明)定义不一致导致的,于是我对比了内核与编译器中的宏,果然不一样,我选择改了编译器中的宏并重新编译 tslib,再次导入开发板运行,仍然提示上述错误!

搜索了下 tslib 的源码,找到该提示的位置,如下(位于 tslib/plugins/input-raw.c):

if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&
(version == EV_VERSION) &&
(ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&
(bit & (1 << EV_ABS)) &&
(ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&
(absbit & (1 << ABS_X)) &&
(absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) {
fprintf(stderr, "selected device is not a touchscreen I understand\n");
return -1;
}

加上打印便于调试:

if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&
(version == EV_VERSION) &&
(ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&
(bit & (1 << EV_ABS)) &&
(ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&
(absbit & (1 << ABS_X)) &&
(absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) { printf("version: %x, EV_VERSION: %x \n \
EV_ABS: %d \n \
ABS_X: %lld \n \
ABS_Y: %lld \n \
ABS_PRE: %lld \n",\
version, EV_VERSION, (bit & (1 << EV_ABS)), (absbit & (1 << ABS_X)),\
(absbit & (1 << ABS_Y)), (absbit & (1 << ABS_PRESSURE))); fprintf(stderr, "selected device is not a touchscreen I understand\n");
return -1;
}

重新编译 tslib,导入开发板运行发现 ABS_X、ABS_Y、ABS_PRE 都为 0 !!!!

分析了下,这肯定是内核驱动有问题,故找到源码(drivers\input\touchscreen\ft5x06_ts.c),仔细看了一遍,发现启用多点触控的话,传输数据无法与 tslib 对应,所以关闭了多点,注释掉下句即可,如下:

//#define CONFIG_FT5X0X_MULTITOUCH		1

保存,重新编译内核,下载至开发板,再将运行 ts_test,完美运行!

总结

在我找 BUG 的期间,阅读了内核中关于 tiny210 触摸屏另一个源码:mini210_1wire_host.c

我想,用过友善板子的同学可能知道,他们会将触摸屏上加上一块单片机来与开发板通信,利用他们的 1wire 协议实现更加精准的触控体验,这使得我们的实验变的与大众不同,而且官方并不提供该部分的协议。

记得当初用 Mini2440 的时候,配的是 P35 显示屏,内核必须配置为 1wire 驱动才能使用触控,查阅资料后发现可以更改屏幕的硬件部分来兼容内核自带的触屏源码。

tiny210 自带的文件系统中带有 tslib,这个 tslib 是友善修改过的,而且也不开源,使用的接口的就是 1wire(/dev/touchscreen-1wire)。

接下来是 Qt 应用程序的测试,见下篇文章。

tiny210 tslib 测试(基于 ft5x06 触摸屏),解决触摸无效问题的更多相关文章

  1. 基于FPGA的XPT2046触摸控制器设计

    基于FPGA的XPT2046触摸控制器设计 小梅哥编写,未经许可,文章内容和所涉及代码不得用于其他商业销售的板卡 本实例所涉及代码均可通过向 xiaomeige_fpga@foxmail.com  发 ...

  2. 嵌入式X86运行linux及QtEmbedded+触摸屏(X86PC104+Xlinux+QtE+触摸屏解决办法)

    嵌入式X86运行linux及QtEmbedded+触摸屏(X86PC104+Xlinux+QtE+触摸屏解决办法) QQ:5724308 邮箱:sankye@163.com

  3. 使用JMeter测试基于WebSocket协议的服务

    使用JMeter测试基于WebSocket协议的服务 :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba( ...

  4. TADOConnection如何测试连接数据库超时的解决办法

    TADOConnection如何测试连接数据库超时的解决办法  TADOConnection 提供了很好的数据库连接功能,但是我们在实际使用时,如果指定的远程数据库不存在或其他原因连接不上,程序往往会 ...

  5. Python基于回溯法解决01背包问题实例

    Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...

  6. Windows开启关闭测试模式的方法(含开启测试模式失败的解决办法)

    前言:           内含:Windows开启关闭测试模式的方法.开启测试模式失败的解决办法.win10进入bios的方式.BitLocker恢复方式.           对于互联网从业者来说 ...

  7. 解决:javac: 无效的目标发行版: 1.8

    原 解决:javac: 无效的目标发行版: 1.8 2017年06月14日 16:21:12 代码也文艺 阅读数 44795 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  8. 解决margin-top无效问题

    当两个空的块级元素嵌套时,如果内部的块设置有margin-top属性,而且父元素没有下边解决方法所述的特征,那么内部块的margin-top属性会绑架父元素(即将margin-top传递凌驾给了父元素 ...

  9. 嵌入式Linux驱动学习之路(十九)触摸屏驱动、tslib测试

    触摸屏使用流程: 1. 按下产生中断. 2.在中断处理程序中启动AD转换XY坐标. 3.AD转换结束并产生AD中断. 4. 在AD的中断处理函数中上报信息,启动定时器. 5. 定时器时间到后进入中断, ...

随机推荐

  1. require()  module.export    Object.keys()

    import API from"../../api/api.js";   var data = require('../../utils/data.js').songs;   // ...

  2. python 队列结合线程的使用

    from queue import Queue from threading import Thread import time q = Queue() def add_to_queue(): for ...

  3. Exp3 免杀原理与实践 ——20164325王晓蕊

    一.实践基本内容 1.实践目标 (1) 正确使用msf编码器(√),msfvenom生成如jar之类的其他文件(√),veil-evasion(√),加壳工具(√),使用shellcode编程(√) ...

  4. JS canvas 画板 撤销

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. Postman导出Api文档

    一.最近离职要把做搞过的接口整理成文档,查了查postman好像不支持导出文档,于是写了个工具类,供大家参考! 前提你要先把postman里的接口导出来 如图: 二.所用到的包(主要Json相关的包) ...

  6. 1.1.1 PROB Your Ride Is Here

    === /* ID: luopengting PROG: ride LANG: C++ */ #include <iostream> #include <cstdio> #in ...

  7. Jenkins获取运行job的用户名

    1. Jenkins获取运行job的用户名 需要安装user build vars plugin 插件,然后就可以取到$BUILD_USER_ID变量. user build vars plugin下 ...

  8. Dubbo 源码分析 - 集群容错之 Cluster

    1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...

  9. 第35节:Java面向对象中的多线程

    Java面向对象中的多线程 多线程 在Java面向对象中的多线程中,要理解多线程的知识点,首先要掌握什么是进程,什么是线程?为什么有多线程呢?多线程存在的意义有什么什么呢?线程的创建方式又有哪些?以及 ...

  10. soundJs库简单使用心得

    概述 由于工作需要,学习了一下soundJs库,把心得记录下来,供以后开发时参考,相信对其他人也有用. soundJs是createJs的一部分,它提供了强大的API来处理音频,是音频类H5的一个比较 ...