感谢支持
我们一直在努力

Ubuntu下交叉编译tslib-1.4记录

在Ubuntu下移植好触摸屏的驱动后,一般都要移植一个tslib来配合,在用户层对触摸屏的数据进行滤波和矫正,同时也可以给应用程序一个统一的接口,很多GUI都支持tslib的接口.对于tslib的基础知识和移植,网上google一下就是一大把,下面简要地介绍一下我的交叉编译过程:


(1)下载最新版本的tslib,目前最新的是1.4版,下载方法是通过CVS下载:


$ mkdir – m777 cvs


$ cd cvs


$ export CVSROOT = : pserver : anoncvs@cvs . handhelds . org : / cvs


$ cvs login


Logging in to : pserver : anoncvs@cvs . handhelds . org : 2401 / cvs


CVS password : anoncvs


cvs login : CVS password file / home / daiq / . cvspass does not exist – creating a new file


$ cvs co apps / tslib


这样会在你的$PWD/cvs下建立一个 apps文件夹,其中的 tslib就是我们下载下来的源码.


(2)产生configure文件.


这里要先安装一些工具,我使用ubuntu9.10就不用安装,但是还是用新立得安装:autoconf、automake和libtool等软件包(新立得会自动添加其他需要的软件包).


sudo apt – get install m4 autoconf automake libtool


先设置好交叉编译环境:


$ export PATH = $ PATH : / work / cross / toolchain / gcc – 3 . 4 . 5 – glibc – 2 . 3 . 6 / arm – softfloat – linux – gnu / bin


$ export CC = arm – softfloat – linux – gnu – gcc


$ export CXX = arm – softfloat – linux – gnu – g + +


执行 ./autogen.sh


daiq@daiq – desktop : / work / cvs / apps / tslib$ . / autogen . sh


Libtoolize . . . libtoolize : putting auxiliary files in ` . ‘.


libtoolize: copying file `./ltmain.sh’


libtoolize : You should add the contents of the following files to `aclocal . m4 ‘:


libtoolize: `/usr/share/aclocal/libtool.m4′


libtoolize : ` / usr / share / aclocal / ltoptions . m4 ‘


libtoolize: `/usr/share/aclocal/ltversion.m4′


libtoolize : ` / usr / share / aclocal / ltsugar . m4 ‘


libtoolize: `/usr/share/aclocal/lt~obsolete.m4′


libtoolize : Consider adding `AC_CONFIG_MACRO_DIR ( [ m4 ] ) ‘ to configure.ac and


libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.


libtoolize: Consider adding `-I m4′ to ACLOCAL_AMFLAGS in Makefile . am .


Done .


Aclocal . . . Done .


Autoheader . . . Done .


Automake . . . configure . ac : 21 : installing ` . / config . guess ‘


configure.ac:21: installing `./config.sub’


configure . ac : 7 : installing ` . / install – sh ‘


configure.ac:7: installing `./missing’


plugins / Makefile . am : installing ` . / depcomp


Done.


Autoconf…Done.


Now you can do ./configure, make, make install.

(3)产生缓冲文件和配置.


直接运行configure 脚本相关的代码,会出现交叉编译错误: undefined reference to `rpl_malloc’,这是由ac_cv_func_malloc_0_nonnull检查引起的,为了不让它检查,产生一个cache文件daiq_tslib . cache,欺骗configure再执行:


$ export TSLIB_ROOT = /work/fs/rootfsln/usr/tslib


$ echo “ac_cv_func_malloc_0_nonnull=yes” > daiq_tslib . cache


$ . / configure – – host = arm – softfloat – linux – gnu – – prefix = ${TSLIB_ROOT} – – target = arm – softfloat – linux – gnu – – enable – h3600 – – disable – arctic2 – – disable – mk712 – – disable – collie – – disable – ucb1x00 – – disable – linear – – cache – file = daiq_tslib . cache – – enable – input = no


这里由于驱动是使用input子系统,所以很多都可以禁用,那些是针对别的特殊输出格式的驱动的.但是 –enable-inputapi=no 或者 –enable-inputapi=no 一定要加 (是哪一个要查看configure文件,上面的选项也是要根据自己下载下来后产生的configure文件作参考) .


执行./configure脚本错误时需执行,才能再次 执行./configure


$ rm daiq_tslib . cache


$ echo “ac_cv_func_malloc_0_nonnull=yes” > daiq_tslib . cache


(4)以上都顺利通过的话就可以make、make install了.


用以上的配置得到的编译好的代码在${TSLIB_ROOT}目录下.这由–prefix=决定,可以通过预先设定变量TSLIB_ROOT的值来改变.


之后就是将代码拷贝到根文件系统中(注意tslib依赖的动态链接库文件,记得要拷贝到根文件系统的/lib里),并修改/etc/porfile就好了.这些在我提供的网页里都有,我就不在这重复了,如果像我一样设置好开发板的根目录路径存放tslib(/work/fs/rootfsln/usr/tslib)就不用拷贝了.


如果忘了拷贝动态库,就会出现以下提示:


error while loading shared libraries : libdl . so . 2 : cannot open shared object file : No such file or directory


事实上,根目录、tslib和qt的交叉编译器应该一致才对,这样动态库就不会有冲突问题.


(5)$TSLIB_ROOT/ etc/ts.conf配置


module_raw input


module pthres pmin = 1


module variance delta = 30


module dejitter delta = 100


module linear


注意:如果使用了带滤波的触摸屏驱动,在ts.conf文件中可以屏蔽


#module pthres pmin=1


#module variance delta=30


#module dejitter delta=100


这三行,因使用内核滤波也可以保障稳定.但是再加上tslib的滤波也可以,效果更好.


(6) 在开发板的/work/fs/rootfsln/etc/profile文件里添加运行tslib的环境变量(一定要放到/etc/profile,放到/etc/init.d/rcS里就没有作用,原因是export只能在当前shell和它的子shell有用,不能影响登录的shell)


# Set TSLIB


echo “Set ENV for tslib……”


export QWS_MOUSE_PROTO = TPanel : / dev / event0


export TSLIB_ROOT = / usr / tslib


export TSLIB_TSDEVICE = / dev / event0


export TSLIB_CALIBFILE = $ TSLIB_ROOT / etc / pointercal


export TSLIB_CONFFILE = $ TSLIB_ROOT / etc / ts . conf


export TSLIB_PLUGINDIR = $ TSLIB_ROOT / lib / ts


export TSLIB_CONSOLEDEVICE = none


export TSLIB_FBDEVICE = / dev / fb0


export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH : $ TSLIB_ROOT / lib


(这句我注释掉的原因是:有一种说法是使用 LD_LIBRARY_PATH这样设置不安全,我的做法是把路径添加到/work/fs/rootfsln/etc/ld.so.conf文件中,然后执行ldconfig命令,这样就可以了.ldconfig在你的交叉编译工具里就有)


1. 环境变量


为了实现Tslib的正确运行,需要对如下的Tslib的环境变量进行配置:


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 //设备名


Default : / dev / fb0


以上环境变量在实际开发中的实际配置可以根据实际情况决定.

这样大概就差不多了,运行./ts_calibrate如果还提示ts_open: No such file or directory,用env命令看一下,当前系统是否有你设置的tslib环境变量,


没有的话会提示这个错误的,我在第一次设置/etc/profile文件就没有好使,修改了一下,重启系统就好用了.


(7) 运行校准程序校准屏幕(5点校准)


cd $T_ROOT/tests


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


ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和


屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里.


(7) 可能遇到的错误分析:


运行./ts_test


No raw modules loaded.


ts_config: No such file or directory


ts.conf文件中应该有一行


module_raw input


/nand1/tslib-1.4/lib/ts目录下应该有个文件叫


input.so


在测试的时候,运行./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中(上面修正后作了这一步,就可以拉,就不会出现错误拉)


以上文档是在参考很多网上的帖子并经过实践后写的,感谢这些帖子的作者和帮助过我的人,谢谢了!

赞(0) 打赏
转载请注明出处:服务器评测 » Ubuntu下交叉编译tslib-1.4记录
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏