分类: 嵌入式
2010-08-16 17:04:40
嵌入式学习入门 http://blog.chinaunix.net/u3/117680/showart.php?id=2300212
Qtopia版本:
Qtopia-opensource-4.2.4,这个版本带有手机桌面环境
交叉编译器:
arm-linux-gcc 4.1.2 支持EABI
操作系统平台:
Linux -- Red Hat 9.0
开发板平台:
Arm -- TX2440A
说明:这个交叉编译器是openmoko提供的,目前只能用这个编译,因为我以前用过4.3.2版本的,能正常编译,但运行时出现了段错误,换用3.4.1版本的,部分程序不能正常运行。很多网友也遇到了这个情况,后来查出原因是编译器的问题,换了4.1.2就可以了。
说明:由于移植完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 –p /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/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下找时区信息,如果找不到时区信息,运行时会出错。
一种方法是在根文件系统上建立文件夹mkdir –p usr/share/zoneinfo
把虚拟机目录下/usr/share/zoneinfo中的所有文件拷到刚创建的文件夹中
第二种方法是修改源代码,使它指向自己的文件夹,
在src/libraries/qtopia/qtimezone.cpp中,将114行的/usr/share/zoneinfo/改为/usr/local/qtopia/zoneinfo,保存退出。这时qpe就到自定义的目录下找时区信息了。
配置:
关于配置的命令选项,网上写的都大体相同,但内容都不一样,五花八门,我把这些综合一下:
有几点说明:我用的触摸屏是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"
主要配置选项解说如下:
-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-linux-ranlib arm-angstrom-linux-gnueabi-ranlib
然后用ll命令查看:arm-linux-ranlib->arm-angstrom-linux-gnueabi-ranlib
说明已经建立软连接了,再继续编译就可以能过了。
如果以上成功完成了,下面就可以准备运行了。
如果是用NFS方式启动,那么只需要确保虚拟机的Linux目录下有如下文件夹:
/usr/local/qtopia /usr/local/tslib /usr/share/zoneinfo
就可以,只需要配置一下启动脚本,开机自己挂载NFS,就能启动了。
如果是直接烧入到NAND中,需要把以上这三个文件夹中的内容拷贝到根文件系统中的相应目录下,把tslib/bin/ts_calibrate和/usr/local/qtopia/bin/qpe拷贝到/usr/bin/目录下,再配置启动脚本,不需要挂载NFS,直接启动。
下面配置一下启动脚本,我把它写成一个脚本,然后在在etc/init.d/rcS中运行这个脚本
新建一个名为 qtopia的文件,加入可执行权限,并把它放到/usr/bin目录下,内容为:
#!/bin/sh
mount -t nfs -o nolock 192.168.220.100:/usr/local/qtopia
/usr/local/qtopia
echo "mount nfs OK!"
//以上三行,只在需要挂载NFS时加上
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&
配置完后就可以运行了,如果是用NFS启动,那么NFS一定要成功挂载,才能正常运行。
首先运行校正程序,依次点屏幕上出现的五个点,然后进入qtopia的主页面,启动会很慢,如果出现的图标非常小,连字都看不清,那就需要调整一下显示的大小,在配置文件中加上一句:
export QWS_DISPLAY="LinuxFb:mmWidth35:mmHeight45:0",
再重新运行程序,就可以正常显示了