linux 程序员 HTML5 java mysql Android linux命令 Windows wordpress apache nginx google php Ubuntu Python 开源 Firefox centos 微软 shell

交叉编译tslib,嵌入式系统触摸屏校准程序,移植tslib

环境:

  • 编译链:arm-Linux-gcc version 4.4.1
  • busybox版本:busybox-1.15.1
  • tslib版本:tslib-1.4
  • QTE版本:qt-everywhere-opensource-src-4.7.3
  • Linux发行版:Fedora Core release 6 (Zod)

tslib背景:​

在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确,有抖动等问题.Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波,去抖,校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口.

下载tslib源码,下载的话直接谷歌百度,下载之后然后解压,本人在root目录下解压

[root@localhost ~]# tar zxf tslib-1.4.gz

执行配置

[root@localhost tslib]# ./autogen.sh
[root@localhost tslib]# echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.cache

上面这句echo “ac_cv_func_malloc_0_nonnull=yes” > arm-linux.cache必须加,如果不加的话,会在后边make产生如下错误:

ts_test.o(.text 0×218): In function `main’:
: undefined reference to `rpl_malloc’

在当前目录查找了rpl_malloc,发现configure里有#define malloc rpl_malloc一行.分析configure 脚本相关的代码,原来是ac_cv_func_malloc_0_nonnull引起的,OK我们不让它检查了,产生一个cache文件arm-linux.cache,欺骗configure:

echo “ac_cv_func_malloc_0_nonnull=yes” >$Arch-linux.cache

上述执行之后,我们就配置安装的环境以及安装目录,这里为:/usr/local/tslib

[root@localhost tslib]# CC=arm-linux-gcc ./configure –host=arm-linux –cache-file=arm-linux.cache -prefix=/usr/local/tslib

编译安装

[root@localhost tslib]# make
[root@localhost tslib]# make install

那么便可以在/usr/local/tslib目录下产生/bin、/etc、/include、/lib 4个文件夹,如下:

[root@localhost tslib]# ls
bin etc include lib
[root@localhost tslib]# pwd
/usr/local/tslib

修改tslib目录下/etc/ts.conf文件,删除其中文件,改为:

module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
  • 第一行是tslib从linux的输入设备读取数据时需要用到的模块,这里指定的模块为input,具体需要用到哪个模块,需要参考其他数据。
  • 第二行的pthres为Tslib提供的触摸屏灵敏度门槛插件。
  • 第三行的variance为Tslib提供的触摸屏滤波算法插件。
  • 第四行的dejitter为Tslib 提供的触摸屏去噪算法插件。
  • 第五行linear为Tslib提供的触摸屏坐标变换插件。

把/usr/local目录下的tslib文件夹全部拷贝到开发板的根文件系统目录下,我放在/opt目录下

在根文件系统中对/etc/profile文件设置tslib环境变量:

[root@localhost fs_mini]# vi /etc/profile

添加内容如下:

# 指定tslib主目录位置
export TSLIB_ROOT=/opt/tslib
# 指定触摸屏设备
export TSLIB_TSDEVICE=/dev/event1
# 指定触摸屏校准文件pointercal存放位置
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
# 指定TSLIB配置文件的位置
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
# 指定触摸屏插件所在路径
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
# 指定帧缓冲设备
export TSLIB_FBDEVICE=/dev/fb0
# 设定控制台设备为none
# 否则默认为/dev/tty,
# 这样会出现”open consol device:No such file or directory KD…..”的错误
export TSLIB_CONSOLEDEVICE=none
# 指定TSLIB的库文件路径
export LD_LIBRARY_PATH=/opt/tslib/lib
# 指定触摸屏设备
export QWS_MOUSE_PROTO=Tslib:/dev/event0
export QWS_DISPLAY=”LinuxFb:mmWidth100:mmHeight130:0″
export QWS_SIZE=320×240

注意:

  1. /etc/profile文件是指开发板根文件系统上的/etc/profile,不是PC机
  2. /opt/tslib是我自己存放tslib的文件路径,其他人可自定义
  3. /etc/pointercal是tslib/bin/ts_calibrate程序生产的

另外,TSLIB_TSDEVICE 和QWS_MOUSE_PROTO这两项需要查看自己的板子的触摸屏设备对应/dev/input/下那个文件

将tslib移植入开发板,在开发板终端上运行:

cd /opt/tslib/bin
./ts_calibrate

之后用手指点击液晶屏上的“+”,如此5次之后,便会自动在/opt/tslib/etc下生成pointercal文件

8:设置链接,在QTE开发中,Qt程序要去/etc目录下读取这个pointercal的文件,假如没有的话,那么未来可能报如下错:

[h@/opt/QtEmbedded-4.7.3-arm/demos/mainwindow]# ./mainwindow -qws
[ 52.824751] s3cfb s3cfb: [fb2] already in FB_BLANK_UNBLANK
Could not read calibration: “/etc/pointercal”

因此,必须进行一个软连接:

ln -s /opt/tslib/etc/pointercal /etc/pointercal

这样就不会出现上述问题了.至此,tslib1.4移植完成.

延伸阅读

  • 抱歉,暂无相关内容!

评论