全部博文(92)
分类: 嵌入式
2010-05-15 15:33:36
Qtopia 4.2.4 手机平台移植手册
Qtopia版本:
Qtopia-opensource-4.2.4,这个版本带有手机桌面环境
交叉编译器:
arm-linux-gcc 4.1.2 支持EABI
操作系统平台:
Linux -- Red Hat 9.0
开发板平台:
Arm -- TX2440A
说明:由于移植完Qtopia后,根文件系统的大小是70M左右,如果我们使用的是64M的NAND和64M的SDRAM,可能就装不下了,所以只能用挂载NFS的方法,实现qtopia的启动。(挂载NFS,参考《NFS服务器配置》),当然你也可以自己裁剪qtopia,可以裁到60M以下。
触摸屏校正程序:
tslib-1.4
tslib已经移植好,参考《tslib-1.4移植手册》,tslib的目录在根文件系统的/usr/local目录下
下面开始移植:
安装目录是个比较重要的地方,编译Qtopia不同于其他的程序,Qtopia不应当在源码目录下编译。
首先最好设置两个目录,一个是源代码目录,一个是编译目录。
#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/configure ………,就可以在target目录下编译source的源码了。建这个目录是为了和qtopia进行交互,后面将会详细介绍。
再建一个安装目录,就是执行make install时的安装目录
#mkdir /home/yan/root_2.6.31/usr/local/qtopia 这个建在虚拟机下,同样要在根文件系统中创建这个目录,做为qpe的启动目录。
以下操作都是在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/
注释掉其他文件里的QT_NO_QWS_CURSOR的定义
# vim 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下找时区信息,如果找不到时区信息,运行时会出错。
解决方法是在根文件系统上建立文件夹mkdir –p usr/share/zoneinfo
把虚拟机目录下/usr/share/zoneinfo中的所有文件拷到刚创建的文件夹中
关于配置的命令选项,网上写的都大体相同,但内容都不一样,五花八门,我把这些综合一下:
有几点说明:我用的触摸屏是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 320x240 -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"
我在target目录下
#vim myconfig
../source/configure -release -image /usr/local/qtopia -prefix /usr/local/qtopia -xplatform linux-arm-g++ -arch arm -no-qvfb -displaysize 320x240 -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的头文件和库。
如果没有什么错误,就可以make, make install了,这个时间比较长,2个小时左右。
make的时候可能会出现错误,应该是和交叉编译器有关,因为我们以前习惯是把交叉编译器放在/usr/local/arm/目录下,但是如果用4.1.2版本的就会出点问题,所以解压时加上参数:-C ,那么就直接解压到了:
/opt/toolchains/arm920t-eabi/目录下。然后设置环境变量,修改/etc/profile文件,加上一句export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH,保存退出,执行#source /etc/profile,查看一下版本:#arm-linux-gcc –v ,确保是4.1.2版本的,继续make
过一会还会出现一个错误,没有找到:arm-linux-ranlib
查看一下/arm920t-eabi/bin/目录下,发现没有arm-linux-ranlib这个文件,因为arm-linux-XXX文件是一个连接文件,它连接到
arm-angstrom-linux-gnueabi-XXX,我们把arm-linux-ranlib,做一个软连接:
#ln –s arm-angstrom-linux-gnueabi-ranlib arm-linux-ranlib
然后用ll命令查看:arm-linux-ranlib->arm-angstrom-linux-gnueabi-ranlib
说明已经建立软连接了,再继续编译就可以能过了。
Vim /usr/local/tslib/etc/ts.conf
将
# module_raw input
改为
module_raw input
拷贝/usr/local/tslib/bin/ts_calibrate到 root_2.6.31/usr/bin
拷贝/usr/local/qtopia/bin/ts_calibrate到 root_2.6.31/usr/bin
如果是用NFS方式启动,那么只需要确保虚拟机的Linux目录下有如下文件夹:
/usr/local/qtopia /usr/local/tslib /usr/share/zoneinfo
就可以,只需要配置一下启动脚本,开机自己挂载NFS,就能启动了。
新建一个名为 qtopia的文件,加入可执行权限,并把它放到root_2.6.31/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
$QTOPIA/bin/qpe -qws
else
ts_calibrate
$QTOPIA/bin/qpe -qws
fi
然后在/etc/init.d/rcS文件中加入一句:
qtopia&
到这里具有Qtopia手机界面的根文件系统制作完了,但是
#mkyaffs2image root_2.6.31 root_2.6.31.bin
发现生成的root_2.6.31.bin有72M,但是我们的SDRAM只有64M,大页NAND FALSH 256M是足够的,于是将
#tar cjvf qtopia.tar.bz2 /usr/local/qtopia/
#tar cjvf zoneinfo.tar.bz2 /usr/share/zoneinfo/
将打包文件通过NFS或rz命令通过串口发送到NAND FALSH中
解压时又有问题:
[root@TX2440A /]# tar xjvf zoneinfo.tar.bz2
usr/share/zoneinfo/
usr/share/zoneinfo/Africa/
tar: write error: No space left on device
[root@TX2440A /]# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 58.9M 58.8M 40.0K 100% /
tmpfs 29.8M 112.0K 29.7M 0% /tmp
tmpfs 29.8M 0 29.8M 0% /dev
var 29.8M 0 29.8M 0% /dev
192.168.1.110:/ 8.8G 8.0G 343.0M 96% /mnt
一看分区,知道NAND FLASH移植出了问题:
重新配置内核:
配置内核,支持NandFlash
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[*] S3C2410 NAND Hardware ECC //这个一定要选上
Nand Flash Capacity Select(256M Nand For TX-2440A)--->
()64M NAND FOR TX-2440A
(X)256M NAND FOR TX-2440A
#make zImage
下载到开发板,重启后
[root@TX2440A /]# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 250.9M 59.0M 191.9M 24% /
tmpfs 29.6M 112.0K 29.5M 0% /tmp
tmpfs 29.6M 0 29.6M 0% /dev
var 29.6M 0 29.6M 0% /dev