概述
优龙FS2410开发板的内核与根文件系统已经烧写完好,不需要我们再烧写。鉴于目前发行的套件中所安装的 arm linux 均采用只读文件系统作为其根文件系统,因此其目录大多是不可写的。只有/var,/tmp 是 RAM 盘可写,但板子一掉电里面的内容就丢失了,因此只能作临时文件保存,无法永久的保存数据,例如配置文件等。但是/var,/tmp这些目录可作为调试程序的目录,可以把编译好的
Qt/Embedded 应用程序传送到这些目录,并运行。PC机与开发板通过串口连接,用DNW工具实现对开发板的命令控制,DNW是安装在Windows下的。而虚拟机下的Linux与开发板是通过NFS网络文件系统进行文件挂载的,物理设备是一根交叉网线。
一、准备工作
1.硬件环境
A.
主机: x86 系列 PC 机。
B.
开发板:优龙FS2410。
C.
通讯连接:串口和交叉网线。
2.软件环境
A.
主机操作系统:VMware 虚拟机下的 Redhat linux 9.0( 完全安装 ) ,内核版本:2.4.20-8。
下载地址:
(1)shrike-i386-disc1.iso:
http://www.mirror.ac.uk/sites/ftp.redhat.com/pub/redhat/linux/9/en/iso/i386/shrike-i386-disc1.iso
(2)shrike-i386-disc2.iso:
http://www.mirror.ac.uk/sites/ftp.redhat.com/pub/redhat/linux/9/en/iso/i386/shrike-i386-disc2.iso
(3)shrike-i386-disc3.iso:
http://www.mirror.ac.uk/sites/ftp.redhat.com/pub/redhat/linux/9/en/iso/i386/shrike-i386-disc3.iso
B.
开发板操作系统:嵌入式 Linux,内核版本为2.6.8。
C.
交叉编译器:arm-linux-gcc-3.3.2 。
D.
通讯方式:虚拟机与主机( Windows XP )使用共享文件夹通讯,或者直接把需要的文件制作成.iso挂载到虚拟机上;主机与开发板使用 DNW 和NFS通讯。
3.
相关说明
A.
命令:所有以 # 开头的均为在 shell 中执行的命令。
B. linux系统均是以root登录。
4.
准备源码包
A. tmake 1.11
软件包tmake-1.11.tar.gz或更高版本,用于生成Qt/Embedded应用工程的 Makefile文件;
B. Qt 2.3.2 for X11软件包qt-x11-2.3.2.tar.gz,Qt的X11版的安装包, 它将产生x11开发环境所需要的两个工具:qvfb和Designer;
C. Qt/Embedded
软件包qt-embedded-2.3.7.tar.gz,Qt/Embedded 图形库。
以上源码包都在随板光盘FS2410/Linux内核源码包和工具/GUI目录下。
5. DNW使用简介
随板光盘已自带DNW工具,或者下载一个,直接打开DNW.exe即可使用。
A.
要确定所连的串口位置,电脑—属性—硬件里面,查看下串口位置,一般是COM3或COM4,我的是COM4;
B. DNW—Configuration—Options,Baud Rate:115200,COM Port:COM4,Download Address:0x30800000,点OK;
C.
开发板上电,Serial Port—Connect,只要DNW最上方的[COMx]变为:[COM4,115200bps],就表明已经连接上,此时复位开发板,就可在DNW上显示开发板的BIOS主功能菜单。
D. DNW还有一个USB传输文件功能,这是超级终端不具备的功能。USB传输功能是用来在PC机与开发板之间通过USB接口传送文件的,可以向开发板内烧写内核和根文件。我们在这里不需要这个功能,开发板是通过NFS来访问的PC机上文件。
二.开始搭建
1.安装交叉编译器
编译嵌入式 linux 内核前,要先安装交叉编译工具 toolchain,随板光盘已附带编译工具。
交叉编译器为cross-3.3.2.tar.bz2,安装此编译器只需要在/usr/local目录下建一个arm的目录,先将光盘目录“Linux 源码和工具”下“toolchain”文件夹下的cross-3.3.2.tar.bz2 拷贝到arm目录下,然后进入该目录:
# cd /usr/local/arm
执行解包命令:
# tar zxvf cross-3.3.2.tar.bz2
之后可编辑/etc/bashrc文件:
# gedit ~/.bashrc
在最后增加路径 export PATH=/usr/local/arm/3.3.2/bin:$PATH,以后编译内核或其他应用程序均可用 arm-linux- 来指定交叉编译器。
注:一定要把压缩包解压到/usr/local/arm这个目录下。
2.
搭建 Qt/Embedded 仿真开发环境(x86)
# cd /root
# mkdir qt-x86(仿真开发目录)
# cp …(复制三个软件包到此目录下)
(1)安装tmake
# cd qt-x86
# tar xfz tmake-1.11.tar.gz
# export TMAKEDIR=$PWD/tmake-1.11
# export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
# export PATH=$TMAKEDIR/bin:$PATH
(2)编译Qt/Embedded 2.3.7
# tar xfz qt-embedded-2.3.7.tar.gz
# cd qt-2.3.7
# export QTDIR=$PWD
# export QTEDIR=$QTDIR
# export PATH=$QTDIR/bin:$PATH
# export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
# ./configure –qvfb -depths 4,8,16,32
# make sub-src
# cd ..
注:configure时出错,不能正常设置,尝试重新写一遍configure及参数,参数与参数之间有一个空格,不要复制文档上的,因为有些空格什么的是看不到的。
(3)安装Qt/X11 2.3.2
# tar xfz qt-x11-2.3.2.tar.gz
# cd qt-2.3.2
# export QTDIR=$PWD
# export PATH=$QTDIR/bin:$PATH
# export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
# ./configure -no-opengl
# make
# make -C tools/qvfb
# mv tools/qvfb/qvfb bin
# cp bin/uic $QTEDIR/bin
# cd ..
注:在make时出现一个错误提示:
make[2]: *** [kernel/qpsprinter.o] Error 1
make[2]: Leaving directory `/opt/qt-2.3.2/src'
make[1]: *** [sub-src] Error 2
make[1]: Leaving directory `/opt/qt-2.3.2'
make: *** [init] Error 2
解决方法:
# cd /usr/include
# ln -s freetype2/freetype freetype
再回到qt-2.3.2 目录下make 即可
(4)测试Qt/Embedded 仿真开发环境
qt-embedded-2.3.7.tar.gz解压缩之后里面自带例子程序,目录为:/root/qt-x86/qt-2.3.7/examples。我们以hello为例。
# cd /root/qt-x86/qt-2.3.7/examples/hello
# make clean
# tmake hello.pro –o Makefile
# make(make成功之后,就生成了可执行文件)
# qvfb &(执行 Qt 虚拟缓冲帧,用于仿真,此时应出现qvfb黑 {MOD}的界面)
# ./hello -qws
出现hello,world字样,即表示仿真成功
注:Qvfb启动时出错,qvfb找不到命令。这可能是路径问题,把/root/qt-x86/qt-2.3.2/bin下面的qvfb复制到/usr/bin的目录下。
总结:
①一般configure的错误都是参数书写错误;
②路径问题最麻烦,一定要设置好环境变量,一般的命令找不到或者make时出错,都是路径问题。
3.
建立NFS网络文件系统
这个NFS是由建立在虚拟机上的NFS服务器和建立在开发板上的NFS客户端组成。虚拟机中的Linux不需要联网,虚拟机与开发板通过一根交叉网线通讯,开发板配套有交叉网线。
(1)宿主机建立NFS
server
①网卡设置
# ifconfig eth0 192.168.15.110
将虚拟机的IP地址设置为192.168.15.110. (IP地址的第四位110,可以使0~255除去15的任何数。)而目标板的IP地址为192.168.15.15.这两个IP地址的前三位是相同的,为的是使之存在于同一个网段之中,不需要路由器可以直接通信。
在系统设置—网络,设置IP地址,并保持eth0活跃。还需要把虚拟机上的网络设置成桥接,VM—Setting—Network Adapter—Network connection:Bridged。
②关闭防火墙
由于REDHAT 9.0默认安装时启动了防火墙,它将拒绝其他所有外来IP对它的访问。要使用NFS服务,必须将防火墙关闭。系统设置---安全级别,将安全级别设置为“无防火墙”。
系统设置---服务器设置---服务,在弹出的对话框中将iptables和ipchains前的勾去掉,并将nfs前面打勾。
③设置NFS服务
系统设置---服务器设置---NFS服务器,点击“Add”。在相应拦分别填入共享目录以及可以访问该共享目录的主机的IP.共享目录设置为/root/work,设置主机IP为:192.168.15.*,表示处于网段192.168.15的主机均可以对共享目录进行访问。
有些REDHAT 9.0不完全安装时,在系统设置---服务器设置里面没有NFS服务器,则可按一下方法设置:
#gedit /etc/exports
在该文件中添加:
/root/work 192.168.1.*(rw,sync,no_root_squash)
添加的内容表示允许IP范围在192.168.1.*的计算机以读写的权限来访问共享目录/root/work。
[注:参数说明如下:
rw---读/写权限。如果设定只读权限,则设为ro。但是一般情况下,为了方便交互,要设置为rw。
sync--数据同步写入内存和硬盘。
no_root_squash--此参数用来要求服务器允许远程系统以它自己的root特权存取该目录。就是说,如果用户是root,那么他就对这个共享目录有root的权限。很明显,该参数授予了target board很大的权利。安全性是首先要考虑的,可以采取一定的保护机制,在下面会讲一下保护机制。如果使用默认的root_squash,target board自己的根文件系统可能有很多无法写入,所以运行会受到极大的限制。在安全性有所保障的前提下,推荐使用no_root_squash参数。]
可以通过设定/etc/hosts.deny和/etc/hosts.allow文件来限制网络服务的存取权限。
#gedit /etc/hosts.deny
添加:portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
#gedit /etc/hosts. allow
添加:portmap:192.168.1.100
lockd:192.168.1.100
mountd:192.168.1.100
rquotad:192.168.1.100
statd:192.168.1.100
同时使用这两个文件就会使得只有ip为192.168.1.100的机器使用NFS服务。你的target board的ip地址设定为192.168.1.100,这样就可以了。
④启动NFS服务
首先要启动portmapper(端口映射)服务,这是NFS本身需要的。
#/etc/init.d/portmap start
然后启动NFS Server。此时NFS会激活守护进程,然后开始监听客户端的请求。
#/etc/init.d/nfs start
⑤NFS回环测试
可以首先在linux server上面进行NFS的回环测设。修改/etc/hosts.allow,把ip改为linux server的ip地址,然后在linux server上执行命令:
#mount -t nfs :/home/lqm /mnt
#ls /mnt
如果NFS Server正常工作,应该在/mnt下面看到共享目录/home/lqm的内容。
(2)目标板建立NFS Client
目标板的内核已经配置了NFS System support和Provide NFSvs client support,所以不用重新配置。
打开DNW,配置好,connect。复位开发板,在DNW上显示开发板的主功能菜单后,选择3,进入Linux。由于目标板的文件系统大部分是只读的,所以我们选择/tmp/Documents做为我们的共享目录。
Linux启动之后,回车,进入Linux命令行模式:
# ifconfig eth0 192.168.15.100(配置目标板的IP地址)
此时可以在宿主机上ping一下IP,看宿主机与目标板的网络是否通畅。
#mount -o nolock -t nfs :/root/work
/tmp/Documents
#ls /mnt/nfs
由于很多嵌入式设备的根文件系统中不带portmap,所以一般都使用-o nolock参数,即不使用NFS文件锁,这样就可以避免使用portmap。如果顺利,在/mnt/nfs下,就可以看到linux server的共享文件夹下的内容了,而且两个文件夹内的修改是同步的。
注:①由于每次要挂载时都要重新开启NFS和portmapper,很麻烦。所以找个解决办法:应该设置系统在指定的运行级别(通常为3和5)自动启动portmap和nfs服务。
# chkconfig --level 35 portmap on
# chkconfig --level 35 nfs on
执行“ntsysv”命令启动服务配置程序,找到“nfs”和“portmap”服务,分别在其前面加上“*”,然后选择“确定”即可。
②开发板是只读的,所以每次掉电后,都需要重新配置IP地址,并重新执行挂载命令。
③执行挂载命令后,有时或出现错误提示,可以尝试去掉-o nolock。还有的时候,会出现错误提示,你先查看时候已经挂载上,如果已经挂载上,就可以忽略出现的错误提示。
④可能出现ping不通,检查所有的防火墙是否关闭,宿主机的eth0是否活跃,交叉网线是否连接好,目标板IP地址是否配置等。
4.交叉编译 Qt/Embedded 图形库
开发居于 Qt/Embedded 的应用程序要使用到 Qt/Embedded 的库,编写的 Qt 嵌入式应用程序最终是在 FS2410 开发板上运行的, 因此在把 Qt 嵌入式应用程序编译成支持 YL2410 的目标代码之前,需要两样东西,一个是 arm9 的 linux 编译器,另一个是经 arm9 的 linux 编译器编译过的
Qt/Embedded 的库。
交叉编译器我们已经安装完了,可以使用如下命令测试:
# which arm-linux-gcc
如果所显示的arm-linux-gcc的版本和路径与你所安装的一致,那么就可以用它来交叉编译 Qt 库和应用程序了。
# cd /root
# mkdir qt-arm(交叉编译目录)
# cp …(复制tmake和Qt/Embedded 2.3.7软件包到此目录下)
(1)设置tmake环境变量
tmake生成Makefile文件,由于x86版本与arm版本的QT编译时需要的编译器不用,所以在编译arm版本时需要重新指定编译器。
# cd /root/qt-x86
# export TMAKEDIR=$PWD/tmake-1.11
# export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
# export PATH=$TMAKEDIR/bin:$PATH
(2)编译Qt/Embedded 2.3.7
当有了 arm9的linux 编译器之后,就可以使用这个编译器交叉编译 Qt/Embedded 库的源代码,从而产生一个以ARM9为目标代码的Qt/Embedded库。具体过程如下
解包这个Qt/Embedded2.3.7压缩包时,应把它解压缩到不同于您的机器的处理器使用的Qt/Embedded2.3.7 的安装路径。
由于是用在板子上的qt/embedded,所以需要触摸屏的配置文件qconfig-local.h,在安装Qt/Embedded的时候,需要把这个文件复制到 Qt/Embedded 的安装路径的/src/tools 子路径下。
cd /root/qt-arm/qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
make clean
./configure
–xplatform linux-arm-g++ -shared –debug -qconfig local -qvfb -depths 4,8,16,32
make
cd ..
注:①之前我们的环境变量都是在命令行下设置的,重启机器之后就需要重新配置,所以我们要把环境变量写入配置文件:
# gedit ~/.bashrc(或者在root根目录下 # gedit .bashrc)
我们之前在里面已经写入了交叉编译器的路径,我们在其后继续添加(此处#表示注释):
# x86:
# export TMAKEDIR=/root/qt/qt-x86/tmake-1.11
# export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
# export PATH=$TMAKEDIR/bin:$PATH
# export QTDIR=/root/qt/qt-x86/qt-2.3.7
# export QTEDIR=$QTDIR
# export PATH=$QTDIR/bin:$PATH
# export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
# arm:
export TMAKEDIR=/root/qt/qt-x86/tmake-1.11
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
export PATH=$TMAKEDIR/bin:$PATH
export QTDIR=/root/qt/qt-arm/qt-2.3.7
export QTEDIR=$QTDIR
由于我们现在有两个版本的Qt/Embedded,分别在不同的目录下。它们的路径也是不同的,所以我们分开设置,X86是pc机上的,arm是开发板需要的,如果要编译平台仿真的,需要x86的路径配置,就把arm的都注释掉,反之亦然。每次修改之后,要把终端关闭再重启才会生效。
②路径要配置正确,否则可能导致make不成功。
三.交叉编译程序
还是利用/root/qt-x86/qt-2.3.7/examples的例子程序。此时要把配置文件里面x86的配置文件注释掉,留下arm的环境变量配置。
# cd /root/qt-x86/qt-2.3.7/examples/hello
# make clean
# tmake hello.pro –o Makefile
把生成的Makefile文件做些修改:
(1)将 LINK = arm-linux-gcc 这句话改为
LINK = arm-linux-g++
这样做是因为要是用 arm-linux-g++进行链接
(2)将 LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm –lqte 这句话改为
LIBS = $(SUBLIBS) -L/usr/local/arm/3.3.2/lib -L$(QTDIR)/lib -lm –lqte
,这是因为链接时要用到交叉编译工具 toolchain的库。
# make
生成hello二进制文件。这个hello文件就是要在开发板上执行的文件,把它放到/root/work这个共享目录下,启动NFS,把hello挂载到开发板上。然后在DNW下的命令行运行命令:
# ./hello
开发板的触摸屏上将显示hello world的图案。
注:一定要分清楚两个版本的环境变量配置,弄混了一定会出错的!