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. 关于Asp.net事件,如何在触发子控件的事件时,同步触发父页面的事件

    对页面引用自定义控件后,通过绑定自定义事件,页面绑定子控件的事件,在子控件做了某些修改动作后,如何同步操作父页面的方法:下面我煮了个栗子,同学们可以来尝一尝试一试 a.aspx 引用 UserCont ...

  2. JS入门经典第二章总结

    document:在对网页编写脚本时,我们使用document对象代表网页.要引用一个属性,只需在document对象后加一个“.”号,然后再加上要引用的属性名. alert():该函数弹出一个消息框 ...

  3. JDBC数据库

    JDBC是Java程序连接和存取数据库的应用程序接口(API),包括两个包:java.sql和javax.sql. 用JDBC访问数据库的一般步骤: 1.建立数据源 2.装入JDBC驱动程序:使用Cl ...

  4. 从git远程仓库Checkout项目到本地

    一.登录coding  并且项目已创建好  已经是项目的组员 二.打开idea 1.弹出如下页面  复制远程项目上的SSH(URL)到下框URL 并且Test测试 成功就Clone即可 2.Clone ...

  5. 第68节:Java中的MYSQL运用从小白到大牛

    第68节:Java中的MYSQL运用从小白到大牛 前言 学习java必备要求,学会运用!!! 常见关系化数据库 BootStrap是轻量级开发响应式页面的框架,全局css组件,js插件.栅格系统是将页 ...

  6. JS 实现触发下载内容(H5 download)

    概述 我对使用js控制下载非常感兴趣,在网上查资料的时候碰巧看到了相关实现方法,记录下来供以后开发时参考,相信对其他人也有用. 参考资料: JS前端创建html或json文件并浏览器导出下载 理解DO ...

  7. Oracle实战笔记(第一天)

    导读 笔记内容来自韩顺平老师的视频<玩转Oracle实战教程>,可以结合笔记进行观看.第一天视频中还有Oracle的介绍和安装等内容,很容易搜索到,这里就不再进行总结. 目录 1.命令行工 ...

  8. LabVIEW(五):DAQ同步

    1.在许多的测试测量应用当中,我们会需要在通过一个时间段内进行同步测量. 同步采集通常分为两类: (1).同时测量:即不同的任务在同一时刻开始.举例来说,我们会在一个模拟输入通道上采集数据,同时在一个 ...

  9. Golang之发送消息至kafka

    windows下安装zookeeper 1.安装JAVA-JDK,从oracle下载最新的SDK安装(我用的是1.8的) 2.安装zookeeper3.3.6,下载地址:http://apache.f ...

  10. JavaScript的屏幕输出及时间函数

    Js屏幕输出 重定向页面输出: 更改输出流,如果在加载时使用则会正常排序,如果在HTML加载完成后使用,如点击事件,则会全部覆盖原HTML的内容. 1 <script> 2 //参数为输出 ...