Qtopia4.2.4移植
内核版本:
Linux-2.6.31
Qtopia版本:
Qtopia-opensource-4.2.4,这个版本带有手机桌面环境
交叉编译器:
arm-linux-gcc 4.1.2 支持EABI
操作系统平台:
Linux -- Red Hat 9.0
开发板平台:
Arm -- S3C2440(TX2440A )
交叉编译器说明:我们使用的这个4.1.2版本的交叉编译器是openmoko提供的,目 前只能用这个编译,因为我以前用过4.3.2版本的编译器,能正常编译,但运行时出现了段错误,换用3.4.1版本的,部分程序不能正常运行。很多网友也遇到了这个情况,后来查出原因是编译器的问题,换了4.1.2就可以了。
说明:由于移植完Qtopia后,制作的根文件系统的大小是70M左右,TX2440A开发 板的NANDFLASH容量是256M的,但SDRAM是64M的,使用uboot的USB下载功能不 能下载大于内存容量(64M)的文件,现在你有三种方法来运行文件系统: 一、裁剪qtopia,把所有不需要的功能全裁剪掉,将文件系统裁剪到64M以下,再 用uboot将文件系统下载到nandflash中。(裁剪qtopia并非易事) 二、通过挂载NFS,实现qtopia的启动,推荐用这种方法,可以方便调试qtopia应 用程序,后面会介绍这种方法。(挂载NFS,参考《NFS服务器配置》) 三、将文件系统中的部分文件分离出来,制作成压缩包,存入U盘中,先用uboot 将这个文件系统下载到nandflash中,运行系统后再用U盘,传输被分离出来 的文件。
移植前准备工作:
1. 搭建交叉编译环境
安装arm-linux-gcc 4.1.2交叉编译器,参考视频教程《第七讲》 使用arm-linux-gcc -v 查看编译器版本,确保是4.1.2的
2. 移植触摸屏校正程序:
参考《tslib-1.4移植手册》,将编译安装好的tslib目录在根文件系统的 /usr/local目录下
3. 制作精简文件系统
参考《文件系统制作手册》,制作好文件系统,改名为 qtopia_root,后面的移植工作就在这个文件系统的基础上做
下面开始移植:
安装目录是个比较重要的地方,编译Qtopia不同于其他的程序,Qtopia不应当 在源码目录下编译。
1、首先最好设置两个目录,一个是源代码目录,一个是编译目录。
#mkdir qtopia,把qtopia源码包解压到该目录下,并改名为source
#tar xzvf qtopia-opensource-src-4.2.4.tar.gz
#mv qtopia-opensource-src-4.2.4 source
再建一个编译目录:
#mkdir target
(然后进入target目录下,修改完source的代码,再执行../source/configure ………,就可以在target 目录下编译source的源码了。建这个目录是为了和qtopia进行交互,后面将会详 细介绍。)
再建一个安装目录,就是执行make install时的安装目录
#mkdir -p /usr/local/qtopia 这个建在虚拟机下,同样要在根文件系统中创建这个目录,做为qpe的启动目录。 (可以不用在虚拟机下见,安装时会自动创建)
2、以下操作都是在source中进行的.
修改qtopiacore的一些宏定义:
①进入source/qtopiacore/qconfig-qpe.h
首先注释掉关于鼠标光标的宏定义,让程序运行时,触摸屏中央有光标出现: // Qtopia Core
/*
#ifndef QT_NO_QWS_CURSOR
# define QT_NO_QWS_CURSOR
#endif
*/
/*
#ifndef QT_NO_QWS_MOUSE
# define QT_NO_QWS_MOUSE
#endif
#ifndef QT_NO_QWS_MOUSE_AUTO
# define QT_NO_QWS_MOUSE_AUTO
#endif
*/
其它宏定义根据需要进行注释。
保存后将qconfig-qpe.h拷贝到global目录。
# cp qtopiacore/qconfig-qpe.h
qtopiacore/qt/src/corelib/global/qconfig-qpe.h
②注释掉其他文件里的QT_NO_QWS_CURSOR的定义
# vi qtopiacore/qt/src/corelib/global/qfeatures.h
注释掉如下内容:
/*
#if !defined(QT_NO_QWS_CURSOR) && (defined(QT_NO_CURSOR)) #define QT_NO_QWS_CURSOR
#endif
*/
保存退出。
③# vi qtopiacore/qt/src/corelib/global/qglobal.h
注释掉以下内容:
//# define QT_NO_QWS_CURSOR
④修改源码包中两个头文件的名字
# cd src/libraries/qtopiabase/
# cp custom-linux-cassiopeia-g++.h custom-linux-arm-g++.h
# cp custom-linux-cassiopeia-g++.cpp custom-linux-arm-g++.cpp
⑤最后还有一个时区的问题,qpe默认到/usr/share/zoneinfo下找时区信息,如 果找不到时区信息,运行时会出错。
第一种方法是在根文件系统上建立文件夹zoneinfo
把虚拟机目录下/usr/share/zoneinfo中的所有文件拷到刚创建的文件夹中 #cd qtopia_root
#mkdir -p usr/share/zoneinfo
#cp /usr/share/zoneinfo/* usr/share/zoneinfo/
第二种方法是修改源代码,使它指向自己的文件夹,
在src/libraries/qtopia/qtimezone.cpp中,将114行的/usr/share/zoneinfo/改 为/usr/local/qtopia/zoneinfo,保存退出。这时qpe就到自定义的目录下找时区信息了。
3、配置:
关于配置的命令选项,网上写的都大体相同,但内容都不一样,五花八门,我 把这些综合一下:
有几点说明:我用的触摸屏是320x240的,tslib在/usr/local/tslib目录下
在target目录下执行:
#../source/configure -release -image /usr/local/qtopia -prefix /usr/local/qtopia -xplatform linux-arm-g++ -arch arm
-no-qvfb -displaysize 320*240 -no-modem -quicklaunch –no-bluetooth -no-drm -no-infrared -extra-qtopiacore-config "-little-endian -release -xplatform qws/linux-arm-g++ -embedded arm -qconfig qpe -depths 8,16,32 -qt-sql-sqlite -qt-kbd-usb -no-kbd-tty -no-mouse-linuxtp -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib"
主要配置选项解说如下:
-xplatform linux-arm-g++ -arch arm
目标平台为arm-linux,体系结构为arm。
-no-qvfb
目标平台已支持framebuffer,因而不使用虚拟帧缓冲。
-extra-qtopiacore-config
为Qtopia core 配置选项。
-xplatform qws/linux-arm-g++ -embedded arm
目标平台编译配置文件使用qtopiacore/qt/mkspecs/qws/linux-arm-g++目录下的 配置文件,嵌入式平台为arm。
-qconfig qpe 使用配置文件qconfig-qpe.h,若使用qconfig-large.h配置文件,则使用-qconfig large选项。
-qt-sql-sqlite
数据库支持Sqlite。
-qt-kbd-usb
键盘支持usb协议。
-no-mouse-linuxtp -qt-mouse-tslib
-I/usr/local/tslib/include -L/usr/local/tslib/lib
触摸屏协议不支持linuxtp,支持tslib,并在后面添加上刚才编译的tslib的头文 件和库。
4、如果没有什么错误,就可以 make, make install了,这个时间比较长,2个小时左右。 可以将上述配置写到myconfig,然后放到target目录下,直接./myconfig ,然后make,make install
Qtopia被安装到/usr/local/qtopia目录下
5、如果以上成功完成了,就可以准备运行了。
下面介绍两种文件系统启动方式:
1. 用挂载NFS方式启动
配置网络
参考《NFS服务器配置》手册,或参考视频教程第18讲,确保能正常挂载NFS 配置启动脚本
新建一个名为 qtopia的文件,加入可执行权限,并把它放到根文件系统的 /usr/bin目录下,内容为:
#!/bin/sh
mount -t nfs -o nolock 192.168.1.10:/usr/local/qtopia /usr/local/qtopia
echo "mount nfs OK!"
export T_ROOT=/usr/local/tslib
export QTOPIA=/usr/local/qtopia export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib:$QTOPIA/lib
export QWS_SIZE=320x240
export QWS_MOUSE_PROTO=“Tslib:/dev/event0”
export QWS_DISPLAY="LinuxFb:mmWidth35:mmHeight45:0
if [ -f "$TSLIB_CALIBFILE" ]; then
$QTOPIA/bin/qpe -qws
else
ts_calibrate
$QTOPIA/bin/qpe -qws
fi
然后在/etc/init.d/rcS文件中加入一句:
qtopia& <---开机自动运行qtopia脚本
将tslib放到根文件系统/usr/local目录下:
#cd qtopia_root/usr/local/
#cp -rf /usr/local/tslib ./
将触摸屏校正程序放到根文件系统/usr/bin目录下
#cp tslib/bin/ts_calibrate ../bin
创建qtopia文件夹,用于挂载NFS
#mkdir qtopia
制作文件系统,烧入nandflash,启动系统,qtopia脚本中的这句话:
mount -t nfs -o nolock 10.28.42.100:/usr/local/qtopia /usr/local/qtopia
就会将虚拟机linux的/usr/bin/qtopia目录下的内容挂载到开发板文件系统的 /usr/bin/qtopia目录下,然后启动/usr/bin/qtopia/bin/qpe程序
2. 将文件系统烧入nandflash(用U盘传输文件)
配置启动脚本
新建一个名为 qtopia的文件,加入可执行权限,并把它放到根文件系统的 /usr/bin目录下,内容为:
#!/bin/sh
export T_ROOT=/usr/local/tslib
export QTOPIA=/usr/local/qtopia export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib:$QTOPIA/lib
export QWS_SIZE=320x240
export QWS_MOUSE_PROTO=“Tslib:/dev/event0”
export QWS_DISPLAY="LinuxFb:mmWidth35:mmHeight45:0
if [ -f "$TSLIB_CALIBFILE" ]; then
qpe -qws
else
ts_calibrate
qpe -qws
fi
然后在/etc/init.d/rcS文件中加入一句:
qtopia& <---开机自动运行qtopia脚本
将tslib放到根文件系统/usr/local目录下:
#cd qtopia_root/usr/local/
#cp -rf /usr/local/tslib ./
将触摸屏校正程序放到根文件系统/usr/bin目录下
#cp tslib/bin/ts_calibrate ../bin
将qtopia目录放到根文件系统的/usr/local目录下 (与第一种方法不同的是要将虚拟接的qtopia安装文件拷到根文件系统中,然后裁减)
#cp –rf /usr/local/qtopia ./
将qtopia启动程序qpe放到根文件系统/usb/bin目录下 (可以不用这步,和第一种方法一样,修改qtopia脚本中的qpe路径)
#cp qtopia/bin/qpe ../bin
裁剪文件系统
将文件系统中的部分文件分离出来,制作成压缩包,存入U盘中,将文件系统的体积裁剪到64M以下,制作文件系统镜像,下载到nandflash中,系统启动后,将U 盘插入开发板USB HUB,挂载U盘,传输被分离出的文件到相应的目录下我的方法是分离这几个目录下的文件:
/usr/share/zoneinfo
/usr/local/qtopia/pics
/usr/loca/qtopia/lib/fonts 将这两个目录制作成压缩包:
#cd / <---回到根目录
#tar cjvf zoneinfo.tar.bz2 /usr/share/zoneinfo
#tar cjvf pics.tar.bz2 /usr/local/qtopia/pics
#tar cjvf fonts.tar.bz2 /usr/local/qtopia/lib/fonts
将这三个压缩包放到U盘中,然后在U盘中写一个压缩脚本,比如我写一个脚本,
取名为 install,内容如下:
tar xjvf zoneinfo.tar.bz2 -C/&
tar xjvf pics.tar.bz2 -C/&
tar xjvf fonts.tar.bz2 -C/&
将以上要分离的目录下的内容删除,制作文件系统
#cd qtopia_root
#rm -rf usr/share/zoneinfo/*
#rm -rf usr/local/qtopia/pics/*
#rm -rf usr/loca/qtopia/lib/fonts/*
#cd ../
#mkyaffs2img qtopia_root qtopia_root.bin
#chmod 777 qtopia_root.bin
方法一、直接将这几个安装包通过rz命令或者nfs传到开发板上,然后直接用tar命令解压会自动安装到需要的目录
方法二、将文件系统下载到开发板的nandflash中,系统启动后,插入U盘,使用命令挂 载U盘到/mnt/udisk1目录(20100612更新的文件系统支持自动挂载U盘和SD卡) 执行解压脚本:
#/mnt/udisk1/install
这样就会将这些文件分别解压至zoneinfo,pics,fonts目录下 运行系统:
首次运行系统,会先运行触摸屏校正程序,依次用触摸笔点击屏幕上出现的五个十字光标的中心,然后再进入qtopia,由于qtopia体积较大,启动速度会稍慢一些。正常启动后,屏幕中心会出现鼠标光标,然后出现启动LOGO,再进入主界面。 当执行过触摸屏校正程序,下次开机时就会直接进入qtopia,如果需要重新校 正触摸屏,请在终端下执行这个命令:
#rm /etc/pointercal
然后重启系统,就会执行触摸屏校正程序
不能正常进入qtopia系统,有以下几个原因:
1. 找不到qpe程序
2. 找不到时区文件zone.tab
3. 找不到字体文件fontdir
4. 加载共享库失败
qpe:error while loading shared libraries: libasound.so.2: Cannot open shared object file : No such file or directory
解决方法:从交叉编译器的库文件中找到libasound.so.2拷贝到根文件系统的lib库中,
cd /opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib