原创 触摸屏在miniGUI中的应用

2010-2-4 15:00 3336 4 4 分类: MCU/ 嵌入式

[触摸屏的工作原理,请参考以下网址


http://ia.newmaker.com/art_32280.html


2)、触摸屏坐标的定位


触摸屏本身有自己的指标分辨率, 比如2048*2048, 也就是它的坐标系, 要说的是,设计过程中,它和我们LCD显示屏的坐标系(比如大点的,1024*768)是两个概念。 我们通过ADS控制器的SPI/I2C总线读取到的触摸屏的坐标信息,是触摸屏(贴在LCD上面很像包装纸的一层薄膜)以它本身坐标原点O(物理的,固定的,4个边角的某一个,很可能该原点在装配过程中已经被切割掉, 但没关系,不影响坐标确定)为参考的坐标对(X,Y)。(也好像是两个电压值(Nx,Ny),根据触摸屏X,Y方向的参考电压,做个线性比较,一样很容易得到其坐标值(X,Y), 记不清楚了...)。
---
实际使用过程中, 其他设计者和使用者当然不会关心某个时刻触摸屏的坐标定位是什么,我们唯一的参考定位是LCD屏的坐标系(x,y), 所以整个触摸屏的设计,就是把两个2维线性坐标系通过几个样值的比较,对应起来, 即(X,Y)--->(x,y), 具体的做法是:
---
(1)编写一段计算程序,调用LCD显示驱动程序,在LCD上打印几个个亮点,选择方便计算的,比如( x1,y1),(x2,y2)...
---
(2) (触摸屏驱动程序应该还没有设计完成, 这里只需要做到其触摸屏控制器初始化函数、坐标数据读取函数和相应的点击中断程序工作就可以了)分别点击这些点,程序中读出这些点对应的触摸屏坐标值(X1,Y1),(X2,Y2)...
---
(3) 这时候,就可以得到了两个坐标系的对应关系,具体就是代入程序中读到的采样值求解下面对应方程的6个系数(a,b,c,d,e,f):
{   x="aX"+bY+c, y="eX"+fY+g   }
---
上面的情况是普遍适用的, 全面,精度较高,但求解的未知数多,需要的采样值也多; 事实上,现在的装配工艺完全可以保证两个坐标系的相位差为90度的整数倍, 也就是说,上面的对应方程简化为
{ x="aX"+b, y="cY"+d   } 或者 { x="aY"+b, y="cX"+d }
这样,只需要2组采样值, 就可以确定对应系数!   两个坐标系的对应关系就明确了, 一切触摸屏坐标都将根据这个对应关系式转化成LCD坐标系中相应的坐标, OK.
---
当然, 具体设计工程中, 也有很多的技巧, 主要是误差处理方面,比如采样过程中的多次平均, 去抖动算法,选择采样点的位置等等。


3)、触摸屏的校准(ts_lib)


运行校准程序校准屏幕(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或者是<?XML:NAMESPACE PREFIX = ST1 />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


       第一行告诉tsliblinux的输入设备读取数据,需要用到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_PLUGINDIRtslib从你指定的目录中没有找到plugin需要的模块文件,请检查你的路径和文件。








(3)gtddfb+tslib






      from:http://blog.csdn.net/csdnxw/archive/2008/07/09/2630389.aspx




      昨天晚上跑起来了ts_test后,今天对tslib有了进一步的理解。由于昨天使用/dev/input/ts0,这个是经过校准的数据。后来又使用/dev/input/tsraw0进行校准,校准后,在ts_print,竟然,,还是原始数据,并不是经过校准的数据。检查了一下ts.conf,并且看了一下tslib的文档,原来是linear模块没有被加载导致的。因为一开始的时候,加载linear会导致ts_test跑不起来(后来发现原因,我在linear.c中打log时,有一行使用了printk,导致这个linear.so不能被dlopen加载)。


        这个问题解决了之后,可以通过ts_lib读取校准过的数据后,继续努力,尝试使用/dev/input/event1来做为数据源,修改ts.conf 配置,将raw 选取为input,屏蔽掉h3600那一行。注意input那行最前面不要有空格,否则ts_calibrate会crash。


       经过这步修改后,ts_calibrate也可以校准/dev/input/event1的数据啦~~太好了,继续尝试dfb,发现dfb在使用ts_lib的时候,报告Couldnt load module pthres,在ts.conf中,屏蔽掉pthres,启动dfb应用程序df_window,还是报错,呵呵,继续屏蔽,屏蔽了2个之后,感觉不太对劲,上网找答案,还好,发现了一个tslib的patch。


    


     from:http://blog.csdn.net/csdnxw/archive/2008/07/09/2629312.aspx




     使用自己的directfb,总是认不到正确的touchscreen,虽然dfb已经认出来/dev/input/event0为按键设备,/dev/input/event1为touchscreen。但是这个/dev/input/event2是没有校准过的数据,df_window运行的时候总是不正确,因为其获取到的触摸坐标总是在屏幕的最右边。以x值为例,我的这个触摸屏最右边的值大概为180,越是往左,数据值越大。结果导致从最右边在向左移动触摸点的时候,df_widow会被向右拖动,在触摸点向左走到大概屏幕中间的时候,x的值已经超过了240,故,df_window就再也拖不动了。如果/dev/input/event1传出来的是校准过的值就好了。


       在directfbrc中设置了h3600的设备也不行!可能是Directfb没有认这个设备。但是单独使用ts_lib读取/dev/input/ts0,运行ts_test是可以正常运行的。没有办法,只能把Mizi启动起来后,使用lsof | grep event看了一下,原来Mizi在运行的时候只使用了以下3个设备: 1、/dev/input/event0 #keypad


2、/dev/input/ts0 # 校准过的ts


3、/dev/input/ts_raw0 看来Mizi并没有使用我们的/dev/input/event1啊。


如果将上报给/dev/input/event1的数据修改为校准过的数据,那么我自己编译的dfb也可以正常使用触摸屏了。而对这个的修改,也不会影响 Mizi的运行。


遗留问题:


1、dfb不能使用tslib出来的数据,其实我现在也并不知道tslib读取/dev/inut/ts_raw0数据后,校准过的数据是怎么传递给其他应用程序的。


2、dfb不能直接使用h3600设备,如果配置h3600=/dev/input/ts0能生效的话,dfb也能正常使用触摸了。


3、上报给event1的数据是ts_raw0中的数据,修改为ts0中的数据肯定就没有问题了。


4)、添加MiniGUI 的IAL的支持


此步骤的目的是使miniGUI既支持鼠标、键盘和触摸屏,修改libminigui-1.6.10-linux\src\ial\native(我用的是MiniGUI1.60商用版)下的native.c文件。


修改后的文件如附件。


然后重新编译miniGUI库,在Makefile文件中加入ts_lib库的路径,


make -L /usr/lib //其中/usr/lib为ts_lib库所在的路径。即与LD_LIBRARY_PATH制定的路径。


make install


编译安装完成之后直接将其拷贝到平台下即可。


然后重新启动系统,进入miniGUI,就可以使用触摸屏了。


 








(4)相关参考:






   1,初手解惑:http://www.directfb.com.cn/viewthread.php?tid=293


   2,direct:http://dev.csdn.net/author/ganxingming/88a1ac1e65874f43a887db4be25c7d38.html


 


 

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条