http://hi.baidu.com/125580956/item/25612f9e6ccb85c2b6253119
交叉编译tslib1.4过程详述,配合QT4.5.3成功在Mini2440运行成功(续)
补充:tslib环境变量配置说明:
在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。
Tslib 是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。在 Qtopia 4.*版本中,默认的Tslib版本为Tslib 1.4。在Qtopia 2.*版本中,默认的Tslib版本为Tslib 1.3。
在嵌入式中,由于触摸屏的种类多样、质量不一,采用Tslib 的参考配置往往无法获得较好的触摸屏触摸效果,同样需要经过大量的测试才能得到满意的配置参数,恶劣情况下,甚至需要对Tslib 的算法进行进一步的优化。下面就Tslib 的环境变量、配置文件等进行简要的介绍。
1)环境变量
为了实现Tslib 的正确运行,需要对如下的Tslib 的环境变量进行配置:
2)TSLIB_TSDEVICE //触摸屏设备文件名
Default (no inputapi): /dev/touchscreen/ucb1x00
Default (inputapi): /dev/input/event0
TSLIB_CALIBFILE //校准的数据文件,由ts_calibrate 校准程序生成
Default: ${sysconfdir}/pointercal
TSLIB_CONFFILE //配置文件名
Default: ${sysconfdir}/ts.conf
TSLIB_PLUGINDIR //插件目录
Default: ${datadir}/plugins
TSLIB_CONSOLEDEVICE //控制台设备文件名
Default: /dev/tty
TSLIB_FBDEVICE //FrameBuffer设备名
Default: /dev/fb0
3) 以上环境变量在实际开发中的实际配置可以根据实际情况决定。
4) 2)配置文件
除了环境变量以外,Tslib 的配置文件ts.conf 同样是个十分重要的部分,在ts.conf 中配置了需要加载的插件、插件加载顺序以及插件的一些约束参数,这些配置参数对触摸屏的触摸效果具有十分重要的影响。
下面是Tslib 1.4 中的ts.conf 的参考配置:
5)# Uncomment if you wish to use the linux input layer event interface
# module_raw input
# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d
# module_raw collie
# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860
# module_raw corgi
# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface
# module_raw ucb1x00
# Uncomment if you're using an HP iPaq h3600 or similar
# module_raw h3600
# Uncomment if you're using a Hitachi Webpad
# module_raw mk712
# Uncomment if you're using an IBM Arctic II
# module_raw arctic2
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
6) 其中 pthres 为Tslib提供的触摸屏灵敏度门槛插件;variance 为Tslib提供的触摸屏滤波算法插件;dejitter 为Tslib提供的触摸屏去噪算法插件;linear 为Tslib 提供的触摸屏坐标变换插件。
7) tslib 的实际配置:
8) 去掉module_raw input前面的#号,同时把其他#号注释项全部删除,以免给后来的操作带来麻烦。我的最终ts.conf 内容为:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
在执行校正程序时(如./ts_calibrate或./ts_test)可能出现的错误:
1:运行./ts_test
No raw modules loaded.
ts_config: No such file or directory
出现这样的错误提示,可以很明确的告诉你,你的库缺少了一些*.so文件()
ts.conf文件中应该有一行(在配置文件上有很多的raw,但是全部是被注释掉的,但是至少需要打开一个。因为触摸屏是使用input子系统的,所以将module_raw input前面的#号去掉,并且前面不留空格,千万别留空格啊,有一个网友就是因为这个小小的空格搞到他郁闷了很久,幸好我比他醒目,绝不留空格,哈哈。。。。)
module_raw input
/nand1/tslib-1.4/lib/ts目录下应该有个文件叫
input.so(这个文件比较重要,我第二次移植过程中不小心把input裁剪掉了,当插件库$TSLIB_ROOT/lib/ts目录下没有这个文件时会提示如下错误)
No raw modules loaded.
ts_config: No such file or directory
2:在做测试的时候,运行./ts_calibrate出现了tslib-1.4经典的错误:(出现这个错误你不要沮丧,反而应该高兴,说明你之前的步骤已经全部没错了,只要把这个经典的错误解决就万事大吉了。很庆幸,这个错误有很多网友都已经有办法解决了)
经典错误:
Couldnt load module input
No raw modules loaded
tsconfig: Success
错误分析:那么错误就定位在 ts_config 里。并且可以进一步确定是在加载插件模块时出的错。
阅读了tslib 的源代码,知道了cstdlib 库里的一个函数: getenv
是用来得到指定系统环境变量的值。是为了测试 tslib 是否得到正确的环境变量。
其环境变量默认的值在readme中有注明。
加载插件模块时出出错分析:
ts_calibrate会打开ts_config
ts_config函数里首先会读取 tslib 配置文件(ts.conf,由 TSLIB_CONFFILE环境变量指定,在tslib/etc下面),
然后根据这个文件逐个加载插件库,1.4版本的ts.conf内容为:
Module_raw input (读readme文件可以找到这个字符串)
module pthres pmin=1
module variance delta=30
module dejtter delta=100
module linear
ts_config又会调用ts_load_module加载库。从这个函数里,程序先是得到配置文件中指定加载的模块名,
然后根据模块名构造了一个 so 文件文件名,然后调用了系统函数 dlopen 加载库!
Linux 下的加载dlopen 类似于 Windows 下动态链接库的函数:dlopen
错误就应该出在构造的库文件名是错误的---其指定的文件不存在
---从而导致 dlopen无法加载。所以才提示找不到文件或目录!
那么这样就是应该把需要的input.so variance.so dejitter.so linear.so应该复制到/tslib/plugins中(上面修正后作了这一步,就可以拉,就不会出现错误拉)
3: [~#]./ts_calibrate.sh
此时会加载tslib中的插件模块input.so,且会抛出Segement fault的错误。在友善之臂的论论上看到使用交叉编译arm-linux-gcc经常会遇到这个问题,不过论坛上也给出了解决办法。仔细分析tslib的源码之后,得知在加载
input.so时,ts_attach.c中__ts_attach_raw()函数中使用NULL指针,导致Segement fault产生。经过修改过,重新
编译tslib,再运行ts_calibrate.sh,一切正常。ts_attach.c中__ts_attach_raw()中的修改如下:
#if 0
for(next = ts->list, prev=next; next != NULL && next != prev_list; next = prev->next, prev =
next)
{
DEBUG("LIUHAO:: %s %s:count=%d prev_list=%x prev=%x next=%x prev->next=%x\n",
__FILE__, __FUNCTION__, count++, prev_list, prev, next, prev->next);
;
}
#else
for(next = ts->list, prev=next; next != NULL && next != prev_list;)
{
DEBUG("LIUHAO:: %s %s:count=%d prev_list=%x prev=%x next=%x prev->next=%x\n",
__FILE__, __FUNCTION__, count++, prev_list, prev, next, prev->next);
next = prev->next;
if(next == NULL)
break;
else
prev = next;
}
#endif
至此,tslib所有工作已经完成,ts_calibrate会在~/ts-release/etc/目录下生成pointercal文件。pointercal为触摸屏校准后生成的文件,确保QT运行时,触摸屏工作正常。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zengxiaosa/archive/2011/05/17/6428068.aspx