天天网摘,触摸屏网摘

开始还以为触摸校准成功了,结果ts_test.c不只是要终端出现信息,
还需要是用手点哪里光标跟着去哪里
可是屏上并没有光标显示


对于tslib-1.3版本:
首先我运行校准程序得到校准文件
[/mnt/nfs/tslib-1.3/tests/.libs]./ts_calibrate
xres = 640, yres = 480
Took 1 samples...
Top left : X = 585 Y = 3298
Took 2 samples...
Top right: X = 3257 Y = 3289
Took 1 samples...
Bot right: X = 3246 Y = 702
Took 1 samples...
Bot left : X = 580 Y = 753
Took 1 samples...
Middle: X = 1996 Y = 1947
-69.743103 0.202175 -0.000510
539.055481 -0.001745 -0.148005
Calibration constants: -4570684 13249 -33 35327540 -114 -9699 65536
然后运行测试程序
[/mnt/nfs/tslib-1.3/tests/.libs]./ts_test
应该是用手点哪里光标跟着去哪里
可是屏上并没有光标显示
想着是不是校准有问题
回头看ts_calibrarte.c中的一段源代码
put_cross(50,50,1);
getxy(ts, &cal.x[0], &cal.y[0]);
put_cross(50,50,0);
cal.xfb[0] = 50;
cal.yfb[0] = 50;
printf("Top left : X = %4d Y = %4d\n", cal.x[0], cal.y[0]);
那么cal.xfb和cal.yfb应该是理论值
cal.x和cal.y是getxy的实际值
可是Top left : X = 577 Y = 3291而不是与50,50相近的值,是不是这个有错?
发现LCD的坐标和得到的触摸屏的坐标感觉坐标系是反的.以为是屏接反了。
后来又去看关于触摸屏的知识,才知道这正是tslib做的事情,将两个坐标通过算法一一对应转换。
对于校正原理:
我们传统的鼠标是一种相对定位系统,只和前一次鼠标的位置坐标有关。
而触摸屏则是一种绝对坐标系统,要选哪就直接点哪,与相对定位系统有着本质的区别。
绝对坐标系统的特点是每一次定位坐标与上一次定位坐标没有关系,每次触摸的数据通过校准转为屏幕上的坐标,
不管在什么情况下,触摸屏这套坐标在同一点的输出数据是稳定的。不过由于技术原理的原因,
并不能保证同一点触摸每一次采样数据相同,不能保证绝对坐标定位,点不准,这就是触摸屏最怕出现的问题:
漂移。对于性能质量好的触摸屏来说,漂移的情况出现并不是很严重。所以很多应用触摸屏的系统启动后,
进入应用程序前,先要执行校准程序。
通常应用程序中使用的LCD坐标是以像素为单位的。
比如说:左上角的坐标是一组非0的数值,比如(20,20),
而右下角的坐标为(620,460)。这些点的坐标都是以像素为单位的,
而从触摸屏中读出的是点的物理坐标,其坐标轴的方向、XY值的比例因子、偏移量、缩放因子都与LCD坐标不同,
所以,可以在IAL的某个函数(比如wait_event函数)中把物理坐标首先转换为像素坐标,
然后再赋给POS结构,达到坐标转换的目的。图是LCD坐标和触摸屏的物理坐标的比较。
触摸屏网摘
触摸屏校正思路
在IAL的某个函数(比如wait_event函数)中加入调试信息,
开发板上运行Calibrate程序,那么触摸屏上任何一点的坐标就可以在主机监视屏上回显出来。
于是,就采集到了4个角的物理坐标,假设是6.4英寸屏,640X480分辨率,
则它们的像素坐标分别是(20,20)、(20,460)、(620,460)和(620,20)。
这样,使用待定系数法就可以算出坐标系之间的平移关系。比如:
Vx = xFactor*Px + xOffset
Vy = yFactor*Py + yOffset
那么得出结论就不是屏接反了。
那么问题是出在ts_test.c上了,与是在程序中加了一些代码,重新编译运行:
校准完毕后,运行测试程序
[/mnt/nfs/tslib-1.3/tests/.libs]./ts_test
//自己加的printf语句
ts_device open success 打开触摸屏节点设备成功
ready to put_cross x, y 在屏上默认第一次画光标
first time to put_cross
//自己再在屏上任意位置点击,触摸画光标的函数执行
//终端输出信息,按照输出的samp里面的成员变量定义为
按键发生时间: x坐标 y坐标 压力动作
//默认终端数据
1253762277.780181: -69 539 0 //轻按时
1253762281.350047: -69 539 0
1253762338.250838: -69 539 1 //重按时
//当压力值>0时输出自己加的printf
pressure>0
put cross again! c = 0
put cross again! c = 1
//在屏上拖动
//默认终端数据
1253764826.440828: -69 539 2 //拖动时
pressure>0
put cross again! c = 0
put cross again! c = 1
//按照这样应该就是画光标的那一步已经执行了,
之所以没有在屏幕上,从终端的到的数据开来因为是坐标的x值为负数-69,而且按其他的地方,坐标值都不变.
而导致屏上没有出现光标
对照自己的驱动程序对tslib里面的程序和一些环境变量的定义都做了相应的修改
查不出错误究竟在哪里
最后我们换用了tslib-0.1.1版本,恩,按照触摸屏共享库文件的名字来看1.3版本应该是对应0.1.0版本的
其中ts.conf不太一样
ts.conf中没有指定module_raw,自带的ts.conf的所有module_raw都被注释掉
要选择一个和自己触摸屏驱动相符的
我们的驱动对应的是h3600_ts_event结构
就选择的H3600的module_raw
其中如何看对应结构
要按照ts.conf中的module_raw名在plugins文件夹中找到其对应的源文件,里面有驱动的结构体定义
哪一个中和自己的驱动结构一样就选哪个module_raw
然后0.1.1版本中的函数改变了一些。也不清楚究竟是什么原因,改用了0.1.1版本,
ts_test.c测试程序就可以正常运行了。
而且我将qte自带的examples中的progressbar交叉编译移植到板子上可以支持触摸运行正常
可见qte已经成功实现了触摸
可是移植到板子上的qtopia却只能出现欢迎界面,仍然不能响应触摸,
而且也只有些warnings,没有出现什么错误的报告
我认为qtopia不也就是一个软件的集成么?不是只用qte支持触摸就可以了么?
难道qtopia中也要修改什么才能支持触摸么?
这要继续查资料了。希望快点搞定!!!
TAG http://blog.chinaunix.net/u1/3
发表于: 2007-04-28,修改于: 2007-11-21 16:23
已浏览2497次,有评论3条 推荐 投诉
工作笔记——Tslib的编译和触摸屏测试
1.编译
前段时间非常的郁闷…因为在运行生成校准程序ts_calibrate时总是出现一个错误:ts_open:Inappropriate ioctol for device
后来无数折腾后经过nanfansky指点才知道是自己板子的触摸屏驱动不支持ioctl操作,狂汗…
重新编译tslib
cd tslib-1.3
export CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc //指定交叉编译器
./autogen.sh //生成config文件
export PATH=/usr/local/arm/2.95.3/bin:$PATH
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no
vi src/ts_read_raw.c //修改内容如下
make
****************************************************
在make之前,为了支持触摸屏,打开src/ts_read_raw.c文件,查看触摸屏驱动程序数据结构,看与ts_read_raw.c结构中的哪个一样,就将代码中的 char *defaulttseventtype="UCB1x00"; 修改为自己板子上对应的驱动结构。
因为我的驱动对应的是h3600_ts_event结构
typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_RET;
所以修改为:
char *defaulttseventtype="H3600";
************************************
如果不修改源代码,也可以在后面的测试中重新指定环境变量
export TSLIB_TSEVENTTYPE=H3600 //通过这个对tslib中的设备结构体定义
*****************************************************
如果你触摸屏驱动程序支持ioctl操作,上面的configure操作中的--enable-inputapi=no]你可以删除。
然后就可以make了
*************************************************
2.测试:
2.1 我在/root/share下新建了一个tslib目录,只copy了一些需要的文件
mkdir /root/share/tslib
mkdir /root/share/tslib/tests
mkdir /root/share/tslib/plugins
mkdir /root/share/tslib/lib
mkdir /root/share/tslib/etc
cp /root/2410s/tslib-1.3/tests/.libs/ts_* /root/share/tslib/tests/ //几个所需的测试文件,比如生成的校准文件,测试文件等等
cp /root/2410s/tslib-1.3/src/.libs/libts-0.0.so.0* /root/share/tslib/lib/ //几个所需的库文件
cp /root/2410s/tslib-1.3/src/.libs/libts.so /root/share/tslib/lib/ //几个所需的库文件
cp /root/2410s/tslib-1.3/plugins/*.so /root/share/tslib/plugins/ //触摸屏插件模块库
cp /root/2410s/tslib-1.3/etc/ts.conf /root/share/tslib/etc/ //配置文件
2.2 连接板子
执行minicom
mount –t nfs –o nolock 192.168.0.155:/root/share /mnt/nfs使板子mount上PC,共享路径/root/share
2.3 做链接
ln -s /dev/fb/0 /dev/fb0
//帧缓冲设备板子上为/dev/fb/0,但程序默认为/dev/fb0,所以做了一个链接/dev/fb0到/dev/fb/0
ln -sf /dev/touchscreen/0raw /dev/ts
//qtopia要打开/dev/ts,你没有这个文件, 所以 dev下边应该有触摸平的节点,
相当于, qtopia启动要找 /dev/ts, 但是你只有/dev/touchscreen/0raw,
所以你把ts链接到你的触摸屏的文件就可以了!
我得触摸屏设备节点文件为/dev/touchscreen/0raw
所以,建立链接 /dev/ts 到/dev/touchscreen/0raw
(这里要自己针对自己板子具体的文件进行设置,要不然也会报错)
2.4 指定环境变量
export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/0raw
export T_ROOT=/mnt/nfs/tslib
export LD_LIBRARY_PATH=$T_ROOT/lib //指定tslib库文件路径
export TSLIB_CONSOLEDEVICE=none //tslib运行需要的控制台,这里就是LCD屏幕 ,设定控制台设备为none,否则默认为/dev/tty,
export TSLIB_FBDEVICE=/dev/fb0 //指定帧缓冲设备
export TSLIB_TSDEVICE=/dev/touchscreen/0raw //指定触摸屏设备节点文件
export TSLIB_CALIBFILE=$T_ROOT/etc/pointercal //指定触摸屏校准文件pintercal的存放位置
********************************************************************
注:qte的/src/kernel/qwsmouse_qws.cpp里面校准文件默认打开是在/etc下面为/etc/pointercal,
可是我得板子的根文件系统为只读,所以我放在/mnt/nfs/tslib/etc下面了,
所以在交叉编译qte的时候需要修改qwsmouse_qws.cpp
**************************************************
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf //指定TSLIB配置文件的位置
export TSLIB_PLUGINDIR=$T_ROOT/plugins //指定触摸屏插件所在路径
2.5 校准
运行校准程序校准屏幕(5点校准)
cd $T_ROOT/tests
./ts_calibrate //板子上陆续出现5个光标,点击完毕后会生成校准文件pintercal存放在$T_ROOT/etc/下面
********************************************
ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和
屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里。
******************************************
3. 可能遇到的错误分析:
在测试的时候,运行./ts_calibrate又出现了令人十分之郁闷的错误:
ts_config: Success
追查后应该是在打开ts_config中出现了错误(居然报Success,无欲至极)
在网上发现多是这个错误(这是1.4版本的错):
Couldnt load module input
No raw modules loaded
tsconfig: Success
我没有上面那两行的错误,不过应该是一样的错误原因
那么错误就定位在 ts_config 里。并且可以进一步确定是在加载插件模块时出的错
查询了ts_load_module.c这个文件发现网上和自己的不太一样(网上公布的源码是1.4或者是0.1.1的吧)我的是1.3的
我下载了tslib-0.1.1的后重新实验 就发现错误的是这样子的(第一个错误是由ts.conf所决定的)
Couldnt load module pthres
No raw modules loaded
tsconfig: Success
阅读了tslib 的原代码,知道了cstdlib 库里的一个函数: getenv
是用来得到指定系统环境变量的值。是为了测试 tslib 是否得到正确的环境变量。
其环境变量默认的值在readme中有注明。
加载插件模块时出出错分析:
ts_calibrate会打开ts_config
ts_config函数里首先会读取 tslib 配置文件(ts.conf,由 TSLIB_CONFFILE环境变量指定,在tslib/etc下面),
然后根据这个文件逐个加载插件库
1.3版本的ts.conf内容为
module mousebuts
moudle variance xlimit=50 ylimit=50 pthreshold=3
moudle dejitter xdelta=1 ydelta=1 pthreshold=3
moudle linear
ts_config又会调用ts_load_module加载库。从这个函数里,程序先是得到配置文件中指定加载的模块名,
然后根据模块名构造了一个 so 文件文件名,然后调用了系统函数 dlopen 加载库!
Linux 下的加载dlopen 类似于 Windows 下动态链接库的函数:dlopen
错误就应该出在构造的库文件名是错误的---其指定的文件不存在
---从而导致 dlopen无法加载。所以才提示找不到文件或目录!
那么这样就是应该把需要的mousebuts.so variance.so dejitter.so linear.so应该复制到/tslib/plugins中
(上面修正后作了这一步,就可以拉,就不会出现错误拉)
**************************************
这里来谈一谈tslib-1.4,和1.3有一点点不一样,主要是配置文件的差别
一般来说,tsllib-1.4种一个完整的ts.conf配置文件如下所示:
module_raw input
module pthres
module variance delta=30
module dejitter delta=100
module linear
出现这个错误
Couldnt load module input
No raw modules loaded
tsconfig: Success
第一行告诉tslib从linux的输入设备读取数据,需要用到input这个模块,也就是plugin目录下的input.so文件,
所以你的TSLIB_PLUGINDIR一定要配置正确,让tslib能够找到模块文件。
其他参数分别控制触摸点的连续下压、变化宽度、轨迹变化和线性校准。
也是要把其对应的需要的几个库文件复制到/tslib/plugins中
第二行导致"No raw modules loaded."的原因有两个:
注意:一是你的ts.conf中没有指定module_raw,自带的ts.conf的所有module_raw都被注释掉了,
# 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_raw选项,有人就选择了input,去掉了它的注释
得到module_raw input
另一个原因就是你没有正确配置TSLIB_PLUGINDIR,tslib从你指定的目录中没有找到plugin需要的模块文件,
请检查你的路径和文件。
Tags:  什么是网摘推广 什么是网摘 网摘推广 人人网摘 天天网摘

延伸阅读

最新评论

发表评论