tslib触摸屏校准实践若干

tslib触摸屏校准实践若干
2008/08/28 18:39

嵌入式设备中触摸屏使用非常广泛,但触摸屏的坐标和屏的坐标是不对称的,需要校准。广泛使用的是开源的tslib。下面是两个稳定版本
tslib-0.1.1.tar.bz2
tslib-1.3.tar.bz2

在此先要感谢广大网友的无私奉献,很多的网友都把自己的经验放在网上分享,让我受益匪浅!
主机操作:
cd ~/tslib-1.3
CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
./configure --host=arm-linux --prefix=~/tslib
(如果你的触摸屏驱动不支持ioctl操作,就需要加上 --enable-inputapi=no)
make
make install

aclocal: configure.ac: 8: macro `AM_DISABLE_STATIC' not found in librar
这是因为没有安装libtool,安装libtool后即可
libtool:link: only absolute run-paths are allowed
要修改/tslib/plugins/Makefile里面找rpath
LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)

修改为:
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`

把tslib目录复制到NFS目录,因为这里面有bin etc lib include share目录

minicom操作:
挂载NFS到/mnt/nfs,这样tslib的路径:/mnt/nfs/tslib/...
接下来设置环境变量:
export QWS_MOUSE_PROTO=TPanel:/dev/input/ts0    触摸屏设备文件
export T_ROOT=/mnt/nfs/tslib          目录    
export LD_LIBRARY_PATH=$T_ROOT/lib    库文件目录         
export TSLIB_CONSOLEDEVICE=none        none的时候就默认是/dev/tty
export TSLIB_FBDEVICE=/dev/fb0                framebuffer设备文件
export TSLIB_TSDEVICE=/dev/input/ts0          同上
export TSLIB_CALIBFILE=/etc/pointercal         指定触摸屏校准文件pintercal的存放位置
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf      tslib模块配置文件
export TSLIB_PLUGINDIR=$T_ROOT/plugins       tslib插件库目录
export TSLIB_TSEVENTTYPE=H3600                 tslib的触摸屏设备结构体定义

进入BIN运行ts_calibrate,五点校正
ts_test检测一下校正结果,如果touch的时候,十字光标随着你移动,基本成功了。

几点疑问:
1。第一次当我校正好了以后运行ts_test的时候,光标不会随我移动,就修改了ts.conf里的模块加载设置。就可以了。默认的情况是这样的:
#module mousebuts
module variance xlimit=50 ylimit=50 pthreshold=3
module dejitter xdelta=1 ydelta=1 pthreshold=3
module linear
当我注释掉variance和dejitter的时候,光标会移动,但偏差较大,当我只注释variance时,仍然会随我移动,但当我都不注释回复到默 认的情况时,仍然不会随我移动。最后我把moudule mousebuts注释取消掉,光标又会随我移动了,并且效果比前面的都好。纳闷了
既然
module mousebuts会直接影响成功与否,variance,为什么最初会默认注释掉?而且 module mousebuts的作用我也不是很清楚?

答案:启用mousebuts就是启用触摸屏,我是这么认为。

2。运行ts_carlibrate的时候,偶尔会出现ts_open找不到,当我把ts_carlibrate设置成上电自动运行的时候也会出现这样的 情况,显然不是ioctl的问题,这是为什么呢?tslib的源码里有ts_open.c文件,并且ts_carlibrate.c也调用了 tslib.h头文件,而tslib.h里面就有ts_open()的定义,所以种种的很奇怪???

3。我的程序不是用在QT上,校准程序怎么设置,当用户在校准的时候没有校准正确,系统会让它重新校准,但现在的情况是tslib会让你校准,用户乱点5次就校准完了,这显然不能为后面的应用程序校准好触摸屏。还不能很明白这其中的道理,问题呀!
答案:把tslib库里的ts_read接口移植给microwin。
步骤:1。修改Makefile.rules
           添加:ifeq ($(HAVE_TSLIB_SUPPORT), Y)
                     DEFINES += -DHAVE_TSLIB_SUPPORT=1
                     MW_CORE_LIBS += $(LIBTS)
                     ifneq ($(INCTS),)
                     INCLUDEDIRS += -I$(INCTS)
                     endif
                     endif
          2。修改config
          添加:####################################################################
                    # TSLIB support through libts
                    ####################################################################
                    HAVE_TSLIB_SUPPORT        = Y
                    INCTS                  = /usr/include
                    LIBTS                  = /usr/lib/libts.so
          3。把tslib交叉编译生成的lib和include添加到上面指定的目录
                    tslib.h-->/usr/include
                    libts.so-->/usr/lib
          4。修改mou_touchscreen.c
                  #include <stdio.h>
                  #include <errno.h>
                  #include <unistd.h>
                  #include <fcntl.h>
                  #include <tslib.h>
                  #include "device.h"
                  #include "touchscreen_ipaq.h"
                 
                  #ifndef TS_DEVICE
                  #error "You didn't define a device for the generic touchscreen driver!"
                  #endif

                 static struct tsdev *ts=NULL;
                 extern SCREENDEVICE scrdev;

                 static int PD_Open(MOUSEDEVICE *pmd)
                 {
                      if(getenv("TSLIB_TSDEVICE")!=NULL)
                          ts=ts_open(getenv("TSLIB_TSDEVICE"),0);
                      else
                          ts=ts_open(TS_DEVICE_FILE,0);
                      if(ts==NULL) {
                          EPRINTF("Error %d opening tslib/n",errno);
                          return -1;
                      }
                      if(ts_config(ts)) {
                          EPRINTF("Error %d config tslib/n",errno);
                          return -1;
                      }

                      //GdHideCursor(&scrdev);
                      return ts_fd(ts);
                 }

                 static void PD_Close(void)
                 {
                     /* Close the touch panel device. */
                     if(ts == NULL) return;
                     ts_close(ts);
                     ts = NULL;
                 }

                 static int PD_GetButtonInfo(void)
                 {
                     /* get "mouse" buttons supported */
                     return MWBUTTON_L;
                 }

                 static void PD_GetDefaultAccel(int *pscale,int *pthresh)
                 {
                     *pscale = 3;
                     *pthresh = 5;
                 }

                 static int PD_Read(MWCOORD *px, MWCOORD *py, MWCOORD *pz, int *pb, int mode)
                 {
                     struct ts_sample event;
                     int bytes_read;

                     /* read a data point */
                     bytes_read = ts_read(ts, &event, 1);
   if (bytes_read < 0) {
                         EPRINTF("[%s] Error %d reading from tslib/n", TS_DEVICE, errno);
                         return -1;
                     }

                     *px = event.x;
                     *py = event.y;
                     *pb = (event.pressure) ? MWBUTTON_L : 0;
                     *pz = event.pressure;
                   if(!*pb)
                         return 3;
                     return 2;
                 }

                 MOUSEDEVICE mousedev = {
                     PD_Open,
                     PD_Close,
                     PD_GetButtonInfo,
                     PD_GetDefaultAccel,
                     PD_Read,
                     NULL,
                     MOUSE_TRANSFORM   /* Input filter flags */
                 };
          4。修改touchscreen_ipaq.h
               #ifndef TS_DEVICE
               #define TS_DEVICE "H3600"
               #define TS_DEVICE_FILE "/dev/input/ts0"
              
               struct ts_event {
                   int x;
                   int y;
                   unsigned int pressure;
                   struct timeval stamp;
               };
               #endi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值