Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2132366
  • 博文数量: 288
  • 博客积分: 10594
  • 博客等级: 上将
  • 技术积分: 3469
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-27 19:27
文章分类

全部博文(288)

文章存档

2012年(4)

2011年(30)

2010年(40)

2009年(32)

2008年(71)

2007年(79)

2006年(32)

分类: LINUX

2009-01-08 15:39:08

slib为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能。

1).下载source code并解压
   我用的是tslib-1.3.tar.bz2。
   下载地址:
2). 配置
./autogen.sh
./configure --host=arm-linux --target=arm-linux --prefix=$PWD/build --enable-static=yes --enable-shared=no
3).修改source code
1。make的时候libtool:link: only absolute run-paths are allowed错误
解决办法:要修改/tslib/plugins/Makefile里面找rpath
将LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)
修改为:
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`

2。修改src/ts_read_raw.c中的char *defaulttseventtype="H3600",因为我的触摸屏驱动对应此结构。

3。修改src/ts_read_raw.c  中的 ts_config.c文件中 int ts_config(struct tsdev *ts) return ret改为 return 0;
使用默认配置即可,因为这个地方会出现一个错误,错误原因不明,请赐教。

4). 编译与安装
make
make install
cd tests
arm-linux-gcc -o ts_calibrate ts_calibrate.o fbutils.o font_8x8.o font_8x16.o  ../src/.libs/libts.a -ldl -static
cd ../
mv tests/ts_calibrate build/bin/
mv build/etc/ts.conf build/etc/conf

5). 运行
export QT_QWS_FONTDIR=/mnt/qt/lib/fonts
export QWS_MOUSE_PROTO="linuxtp:/dev/ts"
mknod /dev/ts c 13 128

export V_ROOT=/mnt/build
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/ts 
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$V_ROOT/etc/conf
export TSLIB_PLUGINDIR=$V_ROOT/share/ts/plugins
export LD_LIBRARY_PATH=$V_ROOT/lib
最后就可以运行build/bin/ts_cXX应用程序了,运行中将会出现屏幕矫正,矫正完成会在TSLIB_CALIBFILE目录下生成QT或是MINIGUI所需要的标准校验文件。


PS:
   1.  由于我使用的是静态连接,生成的ap不需要到库就可以执行。
   2.  SD文件名错误的关系将ts.conf 改为 conf。








  [root@localhost tslib-1.3]# cd /opt/host/armv4l/armv4l-unknown-linux/tslib
    # ls
      bin etc include lib share
    # ls bin/
      ts_calibrate ts_print ts_test
    # ls etc/
      ts.conf ts.conf~
    # ls include/
      tslib.h
    # ls lib/
      libts-0.0.so.0 libts-0.0.so.0.1.0 libts.a libts.la libts.so
     
几个必须的文件是:ts.conf,应该把它复制到目标板环境变量TSLIB_CONFFILE指定的目录下;libts-0.0.so.0libts -0.0.so.0.1.0libts.so,这三个文件应该被复制到目标板的LD_LIBRARY_PATH环境变量指定目录下。

     
如果需要对触摸屏进行校准,那么还需要把 ts_calibrate 也拷贝到目标板上,具体位置可以任选,拷贝到目标板上之后将文件属性改为可执行即可。ts_print ts_test 可以用来对生成的 tslib 进行测试,读者可以根据自己的需要决定是否将其拷贝到目标板上。

我的做法:(本人原来的文件系统放于/nfs/cramfs下)

我在/nfs/cramfs下新建了一个tslib目录,copy了一些需要的文件

mkdir /nfs/cramfs/tslib

mkdir /nfs/cramfs/tslib/tests    //
放置测试程序

mkdir /nfs/cramfs/tslib/plugins  

mkdir /nfs/cramfs/tslib/lib

mkdir /nfs/cramfs/tslib/config

开始拷贝文件到文件系统

cp    /opt/host/armv4l/armv4l-unknown-linux/tslib/bin/*    /nfs/cramfs/tslib/test

cp    /opt/host/armv4l/armv4l-unknown-linux/tslib/etc/*    /nfs/cramfs/tslib/config

cp    /opt/host/armv4l/armv4l-unknown-linux/tslib/lib/*    /nfs/cramfs/tslib/lib //其实不需要 .a .la 的文件

   安装的时候你可能没有看到plugins目录,要是在/opt/host/armv4l/armv4l-unknown-linux/tslib下没有,你就到你编译tslib的当前目录去找下plugins

我是自己找到之后copy/opt/host/armv4l/armv4l-unknown-linux/plugins目录的

cp    /opt/host/armv4l/armv4l-unknown-linux/plugins/*.so   /nfs/cramfs/tslib/plugins/            //触摸屏插件模块库

mount –t nfs –o nolock 192.168.0.155:/nfs /tmp
使板子mountPC

要是你不想自己指定环境变量,你可以做一些硬链接,包括以下内容:(要自己指定环境变量此步骤不需要)(建议初学者还是直接指定环境变量吧)

ln -s /dev/fb/0 /dev/fb0

//
帧缓冲设备板子上为/dev/fb/0,但程序默认为/dev/fb0,所以做了一个链接/dev/fb0
/dev/fb/0

ln -sf /dev/touchscreen/0raw /dev/touch/UCB1x00(
若上文中你修改了了tslib关于打开触摸屏驱动设备结点的位置,这里也不需要修改)

我得触摸屏设备节点文件为/dev/touchscreen/0raw所以,建立链接 /dev/ts /dev/touchscreen/0raw

(这里要自己针对自己板子具体的文件进行设置,要不然也会报错)

还有一些库之间的链接,你就自己解决吧,比如,lib默认库的位置是/lib,因此你需要做链接到/lib ,还有配置文件等等.我这里就不罗嗦了。

指定环境变量
export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/0raw

export T_ROOT=/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的存放位置

export TSLIB_CONFFILE=$T_ROOT/config/ts.conf   //指定TSLIB配置文件的位置

export TSLIB_PLUGINDIR=$T_ROOT/plugins    //
指定触摸屏插件所在路径

校准
运行校准程序校准屏幕(5点校准)
cd $T_ROOT/tests

./ts_calibrate   //
板子上陆续出现5个光标,点击完毕后会生成校准文件pintercal存放在$T_ROOT/etc/下面

********************************************

ts_calibrate
是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和
屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里。
******************************************

可能遇到的错误分析:
在测试的时候,运行./ts_calibrate又出现了令人十分之郁闷的错误:
ts_config: Success
追查后应该是在打开ts_config中出现了错误(居然报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
(上面修正后作了这一步,就可以拉,就不会出现错误拉)

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