Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4233956
  • 博文数量: 776
  • 博客积分: 13014
  • 博客等级: 上将
  • 技术积分: 10391
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 17:00
文章分类

全部博文(776)

文章存档

2015年(55)

2014年(43)

2013年(147)

2012年(20)

2011年(82)

2010年(429)

分类: LINUX

2013-07-01 09:08:22

移植Tslib

1 下载源码 

2 cd tslib

3 生成configure ./autogen.sh

4 配置,生成Makefile  
./configure --host=arm-linux-gnueabihf --enable-debug=no \
--prefix=$PWD/output/pcDuino

5 编译
make如果出现错误:ts_test.c:(.text.startup+0x1fa): undefined reference to `rpl_malloc'
解决方法:将config.h.in 中 #undef malloc 去掉

6 安装
make install 在指定的安装目录下生成/bin /etc /lib /include文件夹,并放入相应的文件。如果相应的文件夹已经在,则把相应的文件放入对应的文件夹。

7 运行测试程序,需要配置如下参数
export TSLIB_CONFFILE=/etc/ts.conf 
export TSLIB_PLUGINDIR=/home/tslib/lib/ts

export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/etc/pointercal 
export POINTERCAL_FILE=/etc/pointercal 
export QWS_MOUSE_PROTO=Tslib:/dev/input/event1
export QWS_SIZE=320X240

export TSLIB_ROOT=/home/tslib
export LD_LIBRARY_PATH=/home/tslib/lib:$LD_LIBRARY_PATH
export TSLIB_CONSOLEDEVICE=none
export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0"
export TSLIB_TSEVENTTYYPE=H3600
export PATH=$PATH:/home/tslib/bin


8 如把配置命令写入ts.config,要放在module pthres pmin=1之前 否则运行测试程序时会出现Segmentation fault错误,各个设置选项前也不能有空格。

9 运行ts_test前要先运行ts_calibrate进行校准
如果出现错误:
Selected device uses a different version of the event protocol than tslib was compiled for
解决方法:
vi plugins/input-raw.c 修改:


TsLib介绍:
tslib背景: 在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
Tslib较准原理: 在Qtopia 中,就触摸屏的调试问题主要涉及到以下三个部分:触摸屏驱动、Tslib、 QTslibTPanelHandlerPrivate 封装。 触摸屏驱动为与硬件直接接触部分,为上层的Tslib 提供最原始的设备坐标数据,并可以配置采样间隔、屏幕灵敏度等。采样间隔决定了单位时间内的采样数量,在其他参数不变的情况下,采样间隔越小意味着单位时间内的采样数量越多,也就意味着采样越逼真、越不容易出现采样信息丢失如输入法书写时丢笔划的情况,但因为噪声的影响,采样间隔越小同时也意味着显示出来的图形的效果越差。
   Tslib 为触摸屏驱动和应用层之间的适配层,其从驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标。
   在tslib 中为应用层提供了2 个主要的接口ts_read()和ts_read_raw(),其中ts_read()为正常情况下的借口,ts_read_raw()为校准情况下的接口。
   正常情况下,tslib 对驱动采样到的设备坐标进行处理的一般过程如下: raw device --> variance --> dejitter --> linear --> application module module module
    校准情况下,tslib 对驱动采样到的数据进行处理的一般过程如下: raw device--> Calibrate QTslibTPanelHandlerPrivate 为tslib 提供了应用层封装,为tslib 与应用层的接口部分。
   在触摸屏调试过程中,涉及到的参数主要有采样间隔(驱动)、灵敏度(驱动)、去噪 算法及约束(tslib)、去抖算法及约束(tslib)、ts 门槛值(tslib)。
   由于各种相关期间的影响,在不同的硬件平台上,相关参数可能需要调整。以上参数的 相互关系为:采样间隔越大,采样点越少,采样越失真,但因为信息量少,容易出现丢笔划 等丢失信息情况,但表现出来的图形效果将会越好;去噪算法跟采样间隔应密切互动,采样 间隔越大,去噪约束应越小,反之采样间隔越小,去噪约束应越大。去抖算法为相对独立的 部分,去抖算法越复杂,带来的计算量将会变大,系统负载将会变重,但良好的去抖算法可 以更好的去除抖动,在进行图形绘制时将会得到更好的效果;灵敏度和ts 门槛值为触摸屏的灵敏指标,一般不需要进行变动,参考参考值即可。

pthres 为Tslib 提供的触摸屏灵敏度门槛插件;
variance 为Tslib 提供的触摸屏滤波算法插件;

dejitter 为Tslib 提供的触摸屏去噪算法插件;
linear 为Tslib 提供的触摸屏坐标变换插件

问题记录:
selected device is not a touchscreen I understand

去看tslib中的源码。发现问题出在input_raw.c文件中。找到了线索。

arm交叉编译工具中的头文件库中的linux/input.h中的EV_VERSION定义为
    #define EV_VERSION        0x010000
而linux内核include/linux/input.h中的EV_VERSION定义为
    #define EV_VERSION        0x010001
由此可见问题就出现在内核的输入子系统的版本号不匹配的问题
    
解决办法:
    1.将内核源代码里的include/linux/input.h中的
    #define EV_VERSION        0x010001
    改为:
    #define EV_VERSION        0x010000


阅读(1646) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~