分类: LINUX
主机:Windows 7旗舰版,VMware7.1.2,Fedora9
编译环境:arm-linux-gcc 4.4.3
Linux版本:linux-2.6.32.2
目标板文件系统:busybox-1.19.4
参考资料:http://hi.baidu.com/vv1133/blog/item/b06c760a3c2a0332b0351d89.html
http://www.360doc.com/content/10/0225/22/79031_16834764.shtml#
http://blog.csdn.net/opensource2009/article/details/3444244
http://qt.csdn.net/articles.aspx?pointid=153&pointid2=7
http://blog.csdn.net/hadise/article/details/5416328
http://fanzhichao.blog.hexun.com/24027892_d.html
移植tslib1.4(用于Qt触摸屏支持)
确认Linux主机可以联网,下载tslib源码:
#svn co svn://svn.berlios.de/tslib tslib
或者在网上自己搜索下载。
我移植的版本是tslib v1.4,进入tslib目录执行以下操作:
#./autogen.sh
#echo ac_cv_func_malloc_0_nonnull=yes>arm-linux.cache
#./configure --host=arm-linux --prefix=/usr/local/tslib --cache-file=arm-linux.cache --enable-inputapi=no
--enable-inputapi=no:看你的触摸屏驱动是否支持ioctl操作,如果支持就不用写上,不支持就要添上,如果不添加会有
ts_open:Inappropriate ioctol for device
ts_open: No such file or directory
等错误(网上别人的文档是这么说的,我没有试过不加这个参数会怎样,感兴趣的试一下)
#make
#make install
编译并安装后会在/usr/local/tslib生成bin,etc,include,lib四个文件夹。
bin文件夹下是tslib的测试程序,把它们复制到开发文件系统下的/bin或者/usr/local/bin下,除了ts_calibrate触摸屏校准程序外,其他几个测试程序可有可无。
etc文件夹内只有一个文件ts.conf,把它复制到目标板文件系统下的/etc目录,修改/etc/ts.conf配置如下:
module_raw input (注意把这句前的注释符#删除)
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
include文件夹包含有关tslib的头文件tslib.h,不需要复制到目标板。
lib文件夹下是tslib的动态库的。在目标板文件系统/usr/local/下新建文件夹tslib,把lib文件夹下的所有文件都复制过去。
在你目标板的/etc/profile文件里添加运行tslib的环境变量。
export TSLIB_TSDEVICE=/dev/input/event0 (目标板触摸屏设备节点文件)
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/tslib/ts
export TSLIB_CALIBFILE=/etc/pointercal (触摸屏校准信息文件)
export LD_LIBRARY_PATH=/usr/local/tslib/:$LD_LIBRARY_PATH
以上是我在自己目标板添加的环境变量,可以正常运行,参考网友环境变量配置如下(这个环境变量多一些,比较全面,做下记录):
export TSLIB_ROOT=/usr/local
export TSLIB_TSDEVICE=/dev/event0 (目标板触摸屏设备节点文件)
export TSLIB_CALIBFILE=/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这样设置不安全,我的做法是把路径添加到/etc/ld.so.conf文件中,然后执行ldconfig命令,这样就可以了。ldconfig在你的交叉编译工具里就有)
修改/etc/profile后,执行:#source /etc/profile使刚配置的环境变量生效。
运行触摸屏校准程序ts_calibrate,会自动生成文件/etc/pointercal来保存校准信息。到此tslib移植工作完成!
移植Qt4.7.3
Qt源码下载地址:ftp://ftp.qt.nokia.com/qt/source/
下载qt-everywhere-opensource-src-4.7.3.tar.gz,解压缩到/opt目录下,重命名为qt-4.7.3-src。
交叉编译Qt与交叉编译其他源程序一样,三步曲:
./configure
make
make install
一般导致交叉编译不成功都是由于./configure时,参数配置错误。
在/opt下新建文件夹qt-4.7.3-target作为Qt编译的工作目录。创建配置文件script.sh,内容如下:
../qt-4.7.3-src/configure \
--prefix=/usr/local/qt-embedded-4.7.3 \
-release -opensource -shared -fast -confirm-license \
-no-largefile \
-no-exceptions \
-no-accessibility \
-no-stl \
-qt-sql-sqlite \
-no-qt3support \
-no-xmlpatterns \
-no-multimedia \
-no-audio-backend \
-no-phonon \
-no-phonon-backend \
-svg \
-no-webkit \
-no-javascript-jit \
-script \
-no-scripttools \
-declarative \
-no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon \
-qt-zlib \
-qt-gif \
-no-libtiff \
-qt-libpng \
-no-libmng \
-qt-libjpeg \
-no-openssl \
-nomake docs \
-nomake examples \
-nomake tools \
-nomake demos \
-optimized-qmake \
-no-nis \
-no-iconv \
-no-cups \
-no-pch \
-no-gtkstyle \
-no-nas-sound \
-no-opengl \
-no-openvg \
-no-sm \
-no-xshape \
-no-xvideo \
-no-xsync \
-no-xinerama \
-no-xcursor \
-no-xfixes \
-no-xrandr \
-no-xrender \
-no-mitshm \
-no-fontconfig \
-no-xinput \
-no-xkb \
-xplatform qws/linux-arm-g++ \
-embedded arm \
-qt-freetype \
-depths 16,18,24 \
-no-opengl \
-qt-gfx-linuxfb -qt-gfx-transformed \
-no-gfx-qvfb -no-gfx-vnc -no-gfx-multiscreen -no-gfx-directfb -no-gfx-qnx \
-no-kbd-qvfb -no-kbd-qnx \
-qt-mouse-tslib \
-no-mouse-qvfb -no-mouse-qnx \
-no-glib
运行Qt配置脚本script.sh,生成Makefile文件。configure的配置选项可以运行/opt/qt-4.7.3-src/configure --help查看,可参考网友的配置选项说明:
http://www.360doc.com/content/10/0225/22/79031_16834764.shtml#
生成Makefile后,执行make && make install,编译安装Qt。完成后我们所需用到的工具和库都在目录/usr/local/qt-embedded-4.7.3下。
下面就是移植工作了,目标板需要用到的只有动态库、字库等,都在编译安装后生成的lib文件夹下,大概25.4M大小。其他文件和可执行程序是主机交叉编译目标板的Qt应用程序时用到的,不需要复制到目标板文件系统中。复制lib下所有文件到目标板/usr/local/qt473lib。修改目标板/etc/profile文件,添加环境变量如下:
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
export QWS_SIZE=480*272 (LCD分辨率)
export QWS_DISPLAY=LinuxFb:mmWidth95:mmHeight54:0
export QT_PLUGIN_PATH=/usr/local/qt473lib/plugins
export QT_QWS_FONTDIR=/usr/local/qt473lib/fonts
export LD_LIBRARY_PATH=/usr/local/tslib/:/usr/local/qt473lib/:$LD_LIBRARY_PATH
环境变量说明:
QWS_MOUSE_PROTO是鼠标的设置,Tslib表示使用tslib类型鼠标,即触摸屏,/dev/input/event表示触摸屏对应的设备节点,要与移植tslib时设置的环境变量TSLIB_TSDEVICE一致。如果想要同时支持USB鼠标,设置如下:
export QWS_MOUSE_PROTO="Tslib:/dev/input/event0 Intellimouse:/dev/input/mouse0"
QWS_DISPLAY指定显示形式和framebuffer。格式如下:
export QWS_DISPLAY="<driver>[:<driver specific options>] [:<display num>]"
<driver>的有效参数是LinuxFb, QVFb, VNC, Transformed, Multi 和 keys identifying custom drivers,<display num>的参数通常是用来区分是否是相同的显示屏和是否支持多显示屏,这里设置为0。
驱动详细选项 | 可用的 | 描述 |
LinuxFb, QVFb | 屏幕的物理宽度 (通常是按分辨率计算). | |
LinuxFb, QVFb | 屏幕的物理宽度 (通常是按分辨率计算). | |
<subdriver> | VNC, Transformed, Multi | 指定一个子驱动. |
<RotX> | Transformed | 屏幕的旋转角度x的有效值为90,180,270. |
mmWith和mmHeight的值的大小与Qt应用程序在LCD上显示的字体和控件大小有关系。VNC, Transformed和Multi screen drivers都依赖子驱动. 指定一个驱动的一般方法如下:
export QWS_DISPLAY="<driver>[:<subdriver>][:<subdriver options>] [:<display num>]
如果想要在原来设置的基础上把屏幕旋转90度,参数值设置如下:
QWS_DISPLAY=Transformed:Rot90:LinuxFb:mmWidth95:mmHeight54:0
Qt环境变量说明详见:http://qt.csdn.net/articles.aspx?pointid=153&pointid2=7
环境变量配置完成后,执行#source /etc/profile使之生效。然后在主机交叉编译一个Qt测试程序,在目标板运行测试是否成功移植Qt。测试程序hello.cpp如下:
点击(此处)折叠或打开
- #include <QApplication>
- #include <QLabel>
- int main(int argc, char** argv)
- {
- QApplication app(argc, argv);
- QLabel *label = new QLabel("Hello World!");
- label->show();
- return app.exec();
- }
使用我们刚刚在/usr/local/qt-embedded-4.7.3/bin下生成的qmake,交叉编译生成目标板可执行文件hello。
#qmake -project
#qmake hello.pro
#make
下载到目标板,运行./hello -qws。目标板LCD显示出Hello World的窗口,Qt移植成功!