第一部分:移植前述
现在ARM行业如火如荼,使用linux作为操作系统的也较多,本文只针对ARM和linux平台下的QT移植和程序测试做一翻详解,对于 wince等系统不涉及。
ARM开发的话必须具备以下硬件或平台条件:
1. ARM硬件开发板,现在处理器用的多是ARM9或者ARM11
2. 针对嵌入式行业的Linux系统内核,以及PC机上的Linux系统开发环境,比如Ubuntu,Redhat,CentOs等
3. ARM软件开发环境,这个比较复杂多样。ARM开发无非是底层驱动移植和开发,以及顶层的应用程序开发,还有相对应的各种调试。不管是开发还是调试,都要用到相对应的工具或软件。驱动开发的领域本文不涉及,而顶层应用程序开发的一个重要环节就是面向客户的图形界面开发,而图形界面开发嵌入式领域用的比较多的是QT。
Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。
4.应用程序在pc机上开发,完成后希望在ARM板上调试,以确认程序的正确性和完整性等,这时应该如何办呢?
这里面涉及的知识比较多,有:开发板引导启动文件Uboot;Linux内核镜像的烧写;交叉编译;搭建QT开发环境;开发板与PC机Linux系统的NFS挂载连接;再就是QT程序在线测试等。
上述中交叉编译之前的所有操作本文不涉及,读者如有不明之处请另找资料,本文意在构建一个QT开发环境,和使用开发板通过NFS挂载后的QT应用程序测试环境。
第二部分:QT移植具备条件
1. 交叉编译器:版本较多,现在常用的是arm-linux-gcc-4.3.2.或者arm-linux-gcc-4.1.2
2. QT版本:qt-embedded-linux-opensource-src-4.5.3.tar.gz和qt-x11-opensource-src-4.5.3.tar.gz,可以从QT官网上下载各种版本(注:开发QT的公司已被诺基亚公司收购)官网地址:http://qt.nokia.com/
ftp://ftp.qt.nokia.com/qt/source
3. 触摸屏支持tslib
4. Linux系统上的一些编译工具或者库
说明:(1)交叉编译工具是在QT库安装时要用到它来编译,然后QT应用程序调试时需要要到它编译成ARM板上能运行的代码。
(2)qt-embedded-linux-opensource-src包含了支持最终到ARM开发板上运行的应用程序的库文件,而qt-x11-opensource-src则是为了能在PC机上进行针对ARM板环境的模拟程序调试,比如说没有开发板的时候,但又想验证能否在ARM板上运行,此时需要用到。
(3)tslib则是用来校准触摸屏用的,触摸数据最先由开发板上驱动程序得到,(驱动已经加载到内核中),然后传递给tslib,tslib将原始数据进行一定去抖,校准等工作,然后把数据传给顶层应用程序,我是这样理解的,不知道正确否。
第三部分:QT移植详情
注:此移植过程在Ubuntu9.04系统下完成
带#开头的表示终端运行的命令
带//开头的表示注释
红色字体表示应该特别注意的地方
我的移植环境
1. 开发板:友坚恒天公司的s3c6410
2. PC机系统windos xp
3. PC机上装Vware虚拟机系统:Ubuntu9.04
4. 交叉编译工具:arm920t-eabi-4.1.2.tar.gz
5. Qt版本:qt-embedded-linux-opensource-src-4.5.3.tar.gz
6. 触摸屏校准:tslib1.4.tar.gz
第一步:安装交叉编译工具(解压就行,然后设置一个环境变量)
先将arm920t-eabi-4.1.2.tar.gz拷贝到/home/resource下,然后解压到根目录
#cd /home
#mkdir resource
# cd /home/resource
# tar zxvf arm920t-eabi-4.1.2.tar.gz –C /
注:zxvf是解压参数,-C是改变解压路径,/表示到根目录
完成后在它的安装路径是:/opt/toolchains/arm920teabi/,可以查看到。
为了后续QT安装能够调用arm-linux-gcc等命令,需要设置环境变量
# gedit /etc/bash.bashrc (手动以记事本打开一样的,后续同理)
//添加linux系统环境变量
在该文件的末尾加上
exportPATH=$PATH:/opt/toolchains/arm920teabi/bin
保存关闭
# source /etc/bash.bashrc
#arm-linux-gcc –v //查看编译器版本
注:
1.至于安装路径选择哪里,可以自己定,但是之后的环境变量设置就一定要跟你的安装路径对应好。就比如说我的是/opt/toolchains/arm920teabi/,在该目录下有一个bin目录,里面你可以查看到一些arm-linux-gcc等命令,那如果你更换了路径,则一样要找到那个bin目录,然后设置环境变量。
若能通过arm-linux-gcc –v命令查看到该交叉编译器的版本,则表示安装完成,并且环境变量设置成功。
2.不同的交叉编译工具默认的安装路径是不同的,比如说arm-linux-gcc-4.3.2的默认安装是在/usr/local/arm/下,这个自己知道就行,关键是环境变量要设好。
第二步:安装tslib(解压并安装,然后设置配置文件)
注:此步需要一些工具,ubuntu 下需要安装
automake、autoconf、libtool,可以执行下面语句安装
#apt-get install automake autoconf libtool
注:tslib是支持触摸品用的,触摸屏最终能够使用的条件是:
a. 硬件支持触摸屏
b. 内核已经加载触摸屏驱动,可以在nfs挂载的方式下用命令cat /dev/input/event0来测试是是否加载了驱动,如果已经加载,这个时候你点击触摸屏终端是有反应的(出现一些乱码)。前面的命令中event0是对应触摸屏的硬件设备号,你可能不是event0,但一般用event0或者event1
c. 有支持触摸屏校准的库或者程序,用的多的是tslib,另外linuxtp好像也可以。。。
d. 应用程序支持触摸屏
将tslib1.4.tar.gz拷贝到/home/resource下,然后解压到/home目录下
# cd /home/
#tar zxvf ./resource/tslib1.4.tar.gz //解压到/home
(不行的话使用#tar zxvf ./resource/tslib1.4.tar.gz -C ./ 命令,后续操作同理 )
# cd tslib
#./autogen.sh
#./configure --prefix=/usr/local/tslib/ --host=arm-linuxac_cv_func_malloc_0_nonnull=yes
//配置tslib安装(路径设置在/usr/local/tslib/)
# make //生成Makefile
# make install //安装
# cd /home
#rm –r tslib //安装完成,可以选择删除解压文件
注:安装过程中若没有出现错误,则表示安装成功,此时应该可以在/usr/local/tslib/下看到安装好的文件,若中途出现错误,则应该检查交叉编译器是否安装好,环境变量是否设置好,然后tslib的配置命令是否有错。(注:#./configure --prefix 语句中的--prefix 可以换成–prefix 试一试)
第三步:安装qt-embedded-linux-opensource-src-4.5.3.tar.gz
注:先安装Linux下的G++工具
#apt-getinatall g++ //已安装则不需要
把qt-embedded-linux-opensource-src-4.5.3.tar.gz拷贝到/home/resource下
#cd /home
#tar zxvf./resource/qt-embedded-linux-opensource-src-4.5.3.tar.gz
//将其解压到/home下
# cd qt-embedded-linux-opensource-src-4.5.3
#./configure-prefix /usr/local/Trolltech/QtEmbedded-4.5.3 \ //指定安装目录
-release-shared \ //配置QT库裁剪参数
-fast \
-pch \
-no-qt3support \
-qt-sql-sqlite \
-no-libtiff -no-libmng \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-no-openssl \
-nomake examples -nomake demos-nomake tools \
-optimized-qmake \
-no-phonon \
-no-nis \
-no-opengl \
-no-cups \
-no-xcursor -no-xfixes -no-xrandr-no-xrender -no-xkb -no-sm \
-no-xinerama -no-xshape \
-no-separate-debug-info \
-xplatform qws/linux-arm-g++ \
-embedded arm \
-depths 16 \
-no-qvfb \
-qt-gfx-linuxfb \
-no-gfx-qvfb-no-kbd-qvfb -no-mouse-qvfb \
-qt-kbd-usb\
-confirm-license \
-no-armfpa
-qt-mouse-tslib \
-L /usr/local/tslib/lib \ //不定的,对应你的tslib安装库位置
-I /usr/local/tslib/include //不定的,对应tslibin头文件位置
去除鼠标 -no-feature-CURSOR
Gmakeconfclean 清除配置
注:上面的代码比较长,复制时小心,该代码用于对QT库的裁剪配置,因为QT库过大,如果完全编译的话,可能最终arm板负载不了,所以需要裁剪。而裁剪的参数没有规定的,你甚至可以不裁剪,但一般情况会把鼠标库,例子,样例代码等去掉。你可以输入./configure -help来查看各选项的含义,但都是英文的。以上“\”符号表示该行命令没有结束,接着下一行。如果把上述代码复制到终端命令行没有出错,则会出现一个提示选择信息,那是QT安装的版本选择信息,一般选择“O”,意思是开源(opensource),然后继续。
………………………………………..……..…等待一点时间.…..……..……..……..……..………..………..………..………..…
#make
………………………………………..……..…等待大概2个小时…..……..……..……..………..………..……..……..……..
#makeinstall
………………………………………..……..…同样等待大概两个小时,安装完成………………………………………..…
注:若安装过程中出现问题,可能前两步安装没有到位,返回去检查。若无错误,安装成功,会在目录/usr/local/Trolltech/QtEmbedded-4.5.3下看到对应安装好的文件。
#cd /usr/local/Trolltech/QtEmbedded-4.5.3
#ls
#cd /usr/local/Trolltech/QtEmbedded-4.5.3/bin
#ls
#mv qmakeqmake-arm //修改qmake为qmake-arm
#gedit/etc/bash.bashrc //添加linux系统环境变量
在文件末尾加上环境变量
exportPATH=$PATH: /usr/local/Trolltech/QtEmbedded-4.5.3/bin
保存关闭
#qmake-ar(按Tab建,会出现qmake-arm表示环境变量设置成功)
注:此步也比较重要,一个linux系统多安装几个QT程序的话,会出现相同的qmake命令,所以为了区分qmake,改名成qmake-arm,而后面添加环境变量是因为以后编译QT应用程序要用到。
……………………………………………………………………………………………………………………………………………………...
自此,要安装的程序已经安装完毕,接下来就是一些修改设置操作。
……………………………………………………………………………………………………………………………………………………...
第四步:启动NFS服务
一般程序做调试都会使用nfs挂载的方法,这样做方便,节省资源。首先确保你的Ubuntu安装过nfs服务,没有的话使用命令安装
#apt-get install nfs-kernel-server //安装nfs服务,
#gedit /etc/exports //修改nfs配置
在该文件末尾加入
/home/nfs192.168.1.128(rw,sync,no_root_squash) //192.168.1.128 为开发板的IP
保存关闭
# /etc/init.d/portmap restart //重启nfs服务
#/etc/init.d/nfs-kernel-server restart //重启nfs服务
注:上述ip地址的对应很重要,否则nfs不能挂载,ip地址的设置不一定要死定,但是要保证开发板和Ubuntu在同一个网段。如果Ubuntu使用虚拟机安装的话,还要顾及虚拟机和pc机windows系统的链接,最好保证上述三者在同一网段,另外虚拟机和pc机的连接到底是使用桥接(bridged)还是NAT(network address translate)这个可以自己试一试,哪种行就行,一般两种都可以的,这个设置是在虚拟机里完成的。至于开发板的ip怎么设,卖家也会给你一些教程的。
我是做法是:
开发板ip地址:192.168.1.128 //看下条注释
主机(虚拟机)ip地址:192.168.1.110 //在第七步操作中设置
注:设置开发板的ip地址:
串口终端#setenv bootargs “root=/dev/nfs nfsroot=192.168.1.110:/home/nfs(+空格)
ip=192.168.1.128:192.168.1.110:192.168.1.1:255.255.255.0:www.urbetter.com:eth0:offconsole=ttySAC0,115200”
串口终端#saveenv //保存配置
该设置语句是在开发板启动时进入开发板的uboot(类似pc机的bios)时输入完成的,这要用到一些串口调试工具,我直接用的windows的超级终端,开发板(跟pc机已经串口、网线连接好)开机时按空格键进入uboot,然后在串口终端输入上述语句,最后保存参数配置。可以查看第七步操作。
第五步:修改文件系统
注:要想开发板能在nfs挂载成功并运行程序,必须要一个针对ARM的硬件平台的文件系统,这种文件系统一般开发板供应商都会给你的。我使用的是urbetter-rootfs-qt-2.2.0.tgz。
1.
将urbetter-rootfs-qt-2.2.0.tgz拷贝到/home/resource下
在home目录下建一个nfs挂载用的共享文件夹
#cd/home
#mkdirnfs //创建一个nfs共享目录
#cd/home/resource
#tarzxvf urbetter-rootfs-qt-2.2.0.tgz -C /home/nfs //解压文件系统到/home/nfs
#cd/home/nfs
#ls
删除 /home/nfs /opt/Qtopia 下所有内容(可以手动删)
//删除文件系统自带的系统软件等
删除 /home/nfs/usr/local 下的所有内容删除(可以手动删)
//删除文件系统自带的用户程序等
打开/home/nfs/etc/init.d/rcS 文件 //屏蔽系统默认启动代码
删除如下内容:
/bin/qtopia & //启动代码
echo " " > /dev/tty1
echo "Starting Qtopia, pleasewaiting..." > /dev/tty1 //提示信息
echo" "
echo"Starting Qtopia, please waiting..."
保存关闭
2.
到qt的安装目录下将库文件/usr/local/Trolltech/QtEmbedded-4.5.3/lib全部拷贝到/home/nfs /opt/Qtopia
#cp –r /usr/local/Trolltech/QtEmbedded-4.5.3/lib /home/nfs/opt/Qtopia/ (-r是递归拷贝)
到tslib的安装目录将整个文件夹拷贝到/home/nfs/usr/local/
#cp –r /usr/local/tslib/ /home/nfs /usr/local/ (-r是递归拷贝)
#cd/usr/local/tslib/
#ls
应该看到以下目录
/bin, //包含一些触摸屏的可执行文件,如校准文件,测试文件
/etc, //触摸屏初始化配置文件,下面是要修改的
/include, //包含头文件等
/lib //包含触摸屏支持库
#cd ./bin
应该看到一些可执行文件,其中ts_calibrate是校准程序,ts_test是测试程序
#cd ..
#cd ./etc
应该看到一个触摸屏的配置文件/ts.conf
打开该文件,进行编辑
在文件末尾添加以下语句
module_raw input //启动触摸屏的数据输入方式,这样tslib才能从底层获得数据
module pthres
module variance delta=30
module dejitter delta=100
module linear
保存并关闭该文件。
3.设置nfs文件系统的环境变量
# gedit /home/nfs/etc/profile(手动以记事本打开一样的)
在该文件末尾加上如下内容:
export QTDIR=/opt/Qtopia //Qt根目录
exportPATH=$QTDIR/bin:$PATH //Qt可执行文件目录
exportQT_QWS_FONTDIR=/opt/Qtopia/lib/fonts //Qt字体库
exportTSLIB_ROOT=/usr/local/tslib //tslib路径
exportTSLIB_TSDEVICE=/dev/input/event1 //指定触摸屏对应驱动设备
exportTSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
exportTSLIB_CALIBFILE=/etc/pointercal //指定校准文件生成目录
exportTSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf //指定tslib配置文件
exportTSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts //指定tslib数据读取库
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:$LD_LIBRARY_PATH
//指定QT库和tslib校准库
保存并关闭
第六步:找到QT测试程序
为了验证qt移植成功否,需要做qt程序测试。测试程序有很多,比如在之前解压的/home/qt-embedded-linux-opensource-src-4.5.3/文件下就有许多样例,比如./demos, ./examples等 你也可以拿自己开发的QT应用程序来测试,我就拿./demos/embedded做测试。但是注意程序测试前应该先编译,编译使用qmake-arm(qmake的改名)命令,就是上面qt移植时设置的环境变量。
编译方法:首先确保程序正确并且完整,把与程序有关的所有文件(头文件等)放在同一个文件夹下。在终端上使用cd命令进入到该文件夹,然后
#qmake –project
#qmake
#make
make完之后生成能够在arm板上运行的可执行文件(在pc机上不能运行),然后将该可执行文件拷贝到nfs目录(/home/nfs)下的任何地方,最好是连同整个文件夹一起拷贝过来。
我的测试程序./demos/embedded,该程序下有三个小的测试程序,可以一起编译,也可以单个编译。
下面是我的做法:
将/home/qt-embedded-linux-opensource-src-4.5.3.tar.gz/demos/embedded拷贝到/home/nfs目录
#cd/home/nfs/embedded
#ls //3个小测试程序
#qmake-arm
#make //3个测试程序编译完成
此时测试程序已经准备好了,等待测试。
第七部:nfs挂载测试
1.
将开发板与pc机连接好,包括网线连接,串口连接
打开终端调试工具(xshell比较好用),我就直接用的windows下的超级终端,当然不管用哪个终端工具,波特率要设对,应该是115200。
2.设置虚拟机ubuntu的ip地址
#ifconfig //查看ip
#ifconfigeth5 192.168.1.110 up //配置ip地址,看下注释
#ifconfig //确认ip是192.168.1.110
注:上述配置ip地址时,eth后面的数字是不定的,在查看ip时你可以看到自己的eth号数,我的是eth5,自己的是eth几就改成eth几就行了。
3.打开arm开发板电源,此时你应该看到终端工具上有反应(出现一系列数据,不太懂,不用管),等出现提示信息:Please pressEnter to active this console.时按回车键(别慌,你没按键它停在那的)
4.在串口终端上运行命令
串口终端#ls //显示nfs文件系统下的所有文件
串口终端#cd /embedded
串口终端#ls
串口终端#cd ./styledemo
串口终端#ls
串口终端#./styledemo –qws //运行测试文件 -qws是参数
等待片刻,能看到arm板显示屏上出现一些qt程序画面,你可以插上鼠标进行测试,但是触摸屏应该是用不了的,此问题一直困扰我很久,最终已被我解决,方法不会太难。但此文档不涉及,需要的话,可以在我的百度文库上下载《GPS触摸屏校准》。
注:如果运行时串口终端提示找不到某个库文件(问题不大),原因可能是环境变量没有设置好,也有可能是真的缺少这个库文件,这时你可以在linux终端下输入:
#locate 这个库的名字 //找出存在该库的路径
(如缺少库libts-1.0.so.0 则输入:#locate libts-1.0.so.0)
你会发现有一些地方有这个库,甚至是在/home/nfs/opt/Qtopia/lib下也有(替换掉),但是应该到试着把交差编译器安装目录下的对应库拷贝到/home/nfs/opt/Qtopia/lib,如果缺少的是是库连接文件,那拷贝时最好连同库和库链接一起拷贝。拷贝完之后,开发板要重启,在串口终端上重复上述测试看行不行。如果交差编译器安装目录下的对应库没有或者试了还是不行,那就到换到qt的安装目录下去寻找对应库并拷贝(替换原来库),开发板重启再试