环境
host: Ubuntu 12.04
target:ok6410
交叉编译链:arm-linux-gcc-4.3.2
tslib源代码:tslib-1.4.tar.gz
tslib安装目标路径:/usr/local/tslib
准备工作
首先在编译tslib包之前,先下载autoconf-2.64.tar.bz2、libtool-1.5.22.tar.gz、automake-1.11.1.tar.bz2 3个软件包。
http://ftp.ntu.edu.tw/gnu/autoconf/
http://mirror.hust.edu.cn/gnu/libtool/
http://mirror.bjtu.edu.cn/gnu/automake/
(1)解压automake-1.11.1.tar.bz2,输入命令tar jxvfautomake-1.11.1.tar.bz2后,在终端切换进入解压的目录cd automake-1.11.1,再输入命令./configure,生成Makefile文件后,接着输入make,然后输入make install安装,命令如下:
# tar jxvfautomake-1.11.1.tar.bz2
# cdautomake-1.11.1
#./configure
# make
# makeinstall
(2)同理,autoconf-2.64.tar.bz2、libtool-1.5.22.tar.gz两个软件包也按照步骤(1)来操作。
编译tslib
1、下载tslib-1.4.tar.gz
http://download.csdn.net/source/3177449 。
2、解压安装tslib
# tar -zxvf tslib-1.4.tar.gz
# cd tslib
# ./autogen.sh
# echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache
# ./configure --host=arm-linux--cache-file=arm-linux.cache --enable-inputapi=no -prefix=/usr/local/tslib
# mkdir/usr/locoal/tslib
# make
# make install
说明:(1) 红色的“0”是数字0;(2) /usr/local/tslib表示tslib安装后的路径
编译并安装后会在/usr/local/tslib生成bin,etc,include,lib四个文件夹。
bin文件夹下是tslib的测试程序,把它们复制到开发文件系统下的/bin或者/usr/local/bin下,除了ts_calibrate触摸屏校准程序外,其他几个测试程序可有可无。
etc文件夹内只有一个文件ts.conf,把它复制到目标板文件系统下的/etc目录,修改/etc/ts.conf配置如下:
module_rawinput (注意把这句前的注释符#删除)
modulepthres pmin=1
modulevariance delta=30
moduledejitter delta=100
modulelinear
include文件夹包含有关tslib的头文件tslib.h,不需要复制到目标板。
lib文件夹下是tslib的动态库的。在目标板文件系统/usr/local/下新建文件夹tslib,把lib文件夹下的所有文件都复制过去。
在你目标板的/etc/profile文件里添加运行tslib的环境变量。
exportTSLIB_TSDEVICE=/dev/input/event0 (目标板触摸屏设备节点文件)
exportTSLIB_CONFFILE=/etc/ts.conf
exportTSLIB_PLUGINDIR=/usr/local/tslib/ts
exportTSLIB_CALIBFILE=/etc/pointercal (触摸屏校准信息文件)
exportLD_LIBRARY_PATH=/usr/local/tslib/:$LD_LIBRARY_PATH
以上是我在自己目标板添加的环境变量,可以正常运行,参考网友环境变量配置如下(这个环境变量多一些,比较全面,做下记录):
exportTSLIB_ROOT=/usr/local
exportTSLIB_TSDEVICE=/dev/event0 (目标板触摸屏设备节点文件)
exportTSLIB_CALIBFILE=/etc/pointercal
exportTSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
exportTSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
exportTSLIB_CONSOLEDEVICE=none
exportTSLIB_FBDEVICE=/dev/fb0
修改/etc/profile后,执行:#source /etc/profile使刚配置的环境变量生效。
运行触摸屏校准程序ts_calibrate,会自动生成文件/etc/pointercal来保存校准信息。到此tslib移植工作完成!可能出现的错误:
(1)编译tslib,执行make时提示
ts_test.o:In function`main':
ts_test.c:(.text+0x1d4): undefinedreference to `rpl_malloc'
fbutils.o: In function `open_framebuffer':
fbutils.c:(.text+0x9f4):undefined reference to `rpl_malloc'
collect2: ld returned 1 exit status
make[2]: *** [ts_test] 错误 1
make[2]:正在离开目录 `/home/zhuandi/programs/tslib1.4/tslib/tests'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/home/zhuandi/programs/tslib1.4/tslib'
make: ***[all] 错误 2
这是因为config.h.in文件中有
/* Define to rpl_mallocif the replacement function should be used. */
#undef malloc
把#undef malloc注释掉重新make即可
(2)
将交叉编译器的lib下的库全部复制到开发板的lib目录下即可
(3)
但我在执行ts_calibrate命令的时候出现了下列提示错误:
selecteddevice is not a touchscreen I understand
经过仔细阅读代码,发现错误发生在tslib中的plugins目录下input-raw.c文件中的check_fd函数内:
static intcheck_fd(struct tslib_input *i)
{
structtsdev *ts = i->module.dev;
intversion;
u_int32_tbit;
u_int64_tabsbit;
if (!((ioctl(ts->fd, EVIOCGVERSION,&version) >= 0) &&
(version == EV_VERSION)&&
(ioctl(ts->fd,EVIOCGBIT(0, sizeof(bit) *8), &bit) >= 0) &&
(bit & (1 <<EV_ABS)) &&
(ioctl(ts->fd,EVIOCGBIT(EV_ABS,sizeof(absbit) * 8), &absbit) >= 0) &&
(absbit & (1 <<ABS_X)) &&
(absbit & (1 <<ABS_Y)) &&(absbit & (1 << ABS_PRESSURE)))) {
fprintf(stderr,"selecteddevice is not a touchscreen I understand ");
return-1;
}
if(bit & (1 << EV_SYN))
i->using_syn= 1;
return0;
}
首先tslib通过EVIOCGVERSION来获取驱动的版本号,然后再通过EVIOCGBIT来判断设备是否为触摸屏,因为触摸屏的事件是绝对值事件(EV_ABS),最后获取触摸屏的X轴(ABS_X),Y轴(ABS_Y),以及压力(ABS_PRESSURE)。其中只要有一项内容不正确,tslib都会认为该设备不是触摸屏,而打印出“selecteddevice is not a touchscreen I understand”错误。
版本号EV_VERSION是容易不一致的,我的交叉编译器定义的EV_VERSION值在编译器目录下的arm/usr/include/linux/input.h中给出的:
#defineEV_VERSION 0x010000
linux-3.0.1中的EV_VERSION是在include/linux/input.h中定义的:
#defineEV_VERSION 0x010001
两者不一致,改变任一一个都可以。
tslib 移植成功
下载qt-everywhere-opensource-src-4.7.1.tar.gz,解压重命名为qt-4.7.3-src。
一键编译脚本如下:
#/bin/bash
exportPATH=/usr/local/arm/4.3.2/bin:$PATH
exportPKG_CONFIG_PREFIX=$TOOLCHAIN/arm-none-linux-gnueabi
exportTB_CC_PREFIX=arm-linux-
exportTOOLCHAIN=/usr/local/arm/4.3.2
rm-fr qt-everywhere-opensource-src-4.7.1
rm-fr /opt/qt-4.7.1
tarxfvz qt-everywhere-opensource-src-4.7.1.tar.gz
cdqt-everywhere-opensource-src-4.7.1
echoyes | ./configure -opensource -embedded arm -xplatform qws/linux-arm-g++ -no-webkit -qt-libtiff -qt-libmng -qt-mouse-tslib -qt-mouse-pc-no-mouse-linuxtp -prefix /opt/qt-4.7.1 -I /usr/local/tslib/include -L /usr/local/tslib/lib
make2>&1 | tee ../qte4.7.1Makelog && make install
下面就是移植工作了,目标板需要用到的只有动态库、字库等,都在编译安装后生成的lib文件夹下,大概25.4M大小。其他文件和可执行程序是主机交叉编译目标板的Qt应用程序时用到的,不需要复制到目标板文件系统中。复制lib下所有文件到目标板/usr/local/qt-4.7.1-lib。修改目标板/etc/profile文件,添加环境变量如下:
exportQWS_MOUSE_PROTO=Tslib:/dev/input/event0
exportQWS_SIZE=480*272 (LCD分辨率)
exportQWS_DISPLAY=LinuxFb:mmWidth95:mmHeight54:0
exportQT_PLUGIN_PATH=/usr/local/qt473lib/plugins
exportQT_QWS_FONTDIR=/usr/local/qt473lib/fonts
exportLD_LIBRARY_PATH=/usr/local/tslib/:/usr/local/qt473lib/:$LD_LIBRARY_PATH
环境变量说明:
QWS_MOUSE_PROTO是鼠标的设置,Tslib表示使用tslib类型鼠标,即触摸屏,/dev/input/event表示触摸屏对应的设备节点,要与移植tslib时设置的环境变量TSLIB_TSDEVICE一致。如果想要同时支持USB鼠标,设置如下:
exportQWS_MOUSE_PROTO="Tslib:/dev/input/event0Intellimouse:/dev/input/mouse0"
QWS_DISPLAY指定显示形式和framebuffer。格式如下:
export QWS_DISPLAY="[:] [:]"
的有效参数是LinuxFb, QVFb, VNC, Transformed, Multi 和keys identifying custom drivers,的参数通常是用来区分是否是相同的显示屏和是否支持多显示屏,这里设置为0。
驱动详细选项
可用的
描述
mmWidth=
LinuxFb,QVFb
屏幕的物理宽度 (通常是按分辨率计算).
mmHeight=
LinuxFb,QVFb
屏幕的物理宽度 (通常是按分辨率计算).
VNC,Transformed, Multi
指定一个子驱动.
Transformed
屏幕的旋转角度x的有效值为90,180,270.
mmWith和mmHeight的值的大小与Qt应用程序在LCD上显示的字体和控件大小有关系。VNC, Transformed和Multi screen drivers都依赖子驱动. 指定一个驱动的一般方法如下:
exportQWS_DISPLAY="[:][:] [:]
如果想要在原来设置的基础上把屏幕旋转90度,参数值设置如下:
QWS_DISPLAY=Transformed:Rot90:LinuxFb:mmWidth95:mmHeight54:0
Qt环境变量说明详见:环境变量配置完成后,执行#source/etc/profile使之生效。然后在主机交叉编译一个Qt测试程序,在目标板运行测试是否成功移植Qt。
测试程序hello.cpp如下:
#include<QApplication>
#include<QLabel>
intmain(int argc, char** argv)
{
QApplication app(argc, argv);
QLabel *label = new QLabel("HelloWorld!");
label->show();
return app.exec();
}
使用我们刚刚在/usr/local/qt-embedded-4.7.1/bin下生成的qmake,交叉编译生成目标板可执行文件hello。
#/usr/local/qt-embedded-4.7.1/bin/qmake -project
#/usr/local/qt-embedded-4.7.1/bin/qmake hello.pro
#make
下载到目标板,运行./hello -qws。目标板LCD显示出Hello World的窗口,Qt移植成功!