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. mixer中动态Alpha通道处理案例

       本案例处理的是RGB+a,每个色彩的采样为10位位宽. 1.在Mixer IP中打开Alpha Blending Enable 和Alpha Input Stream Enable.这样在Blo ...

  2. 【慕课网实战】二、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    MapReduce的局限性: 1)代码繁琐: 2)只能够支持map和reduce方法: 3)执行效率低下: 4)不适合迭代多次.交互式.流式的处理:   框架多样化: 1)批处理(离线):MapRed ...

  3. Centos 安装 mysql yum

    http://www.cnblogs.com/007sx/p/7083143.html https://www.linode.com/docs/databases/mysql/how-to-insta ...

  4. 为什么要使用CMake?

    如果你曾经维护过软件包的构建和安装过程,你将对CMake感兴趣.CMake是软件项目的一个开源生成管理器,它允许开发人员以简单的可移植文本文件格式指定生成参数.然后,CMake 使用此文件为本机开发工 ...

  5. js中创建对象的5种方法

    1.原始模式 var dog = { name: jack, length: 70, wang:function(){ console.log(this.name); } 2.工厂模式(批量) fun ...

  6. VS code的疑惑之处

    作为一个新手,我充满疑惑 eg:下载了git但无法使用匹配 然后在各位博主的详细解释下知道 VS code更新后的git.path被格式化了: so需要进行路径覆盖. 在这之后我的终端依旧出现问题   ...

  7. Ubuntu18.04 VMwareTools安装方法

    sudo apt-get upgradesudo apt-get install open-vm-tools-desktop -y sudo reboot 一.VMwareTools的一些实用性   ...

  8. ubuntu 16.04 下安装NVDIA的库(CUDA+CUDNN)

    立志学习神经网络的同学,为了让它能够跑快一点,估计英伟达的GPU是要折腾一番的. 首先看一下什么是CUDA ? CUDA(Compute Unified Device Architecture),是显 ...

  9. ubuntu16.04 uninstall cuda 9.0 completely and install 8.0 instead

    卸载cuda 9.0sudo apt-get --purge remove cudasudo apt autoremoveto remove cuda 9.0 Thensudo apt-get cle ...

  10. ALL_DB_LINKS

    类型:View Owner:SYS 内容:记录了当前用户下可访问的所有的DB links 字段: OWNER : DB Link的owner DB_LINK : DB Link名称 USERNAME ...