qtopia-opensource-4.3.2在YC2440/utu2440开发版的移植
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/database/tran_qtopia_in_yc2440_utu2440.html
当年做移动通讯自组织网络的时候移植系统的文档。
Qtopia的版本的确是相当的混乱,去官网的FTP上看看你就知道有多乱了,无数的版本,若不提前了解一下各个版本的信息,单从文件名是根本无法分辨出哪个才是需要移植的源码包。
经过研究后简单总结如下:qtopia-opensorce是整个qtopia的一个解决方案,包括手机和PDA两个界面,并且还有诸多上层的应用程序,编译安装后应该可以直接使用。而qtopia-core是qtopia-opensource的一个子集,如其名字只包含核心库文件,相当于一个qtopia环境而已。
所以在这里,我们选择的包是:qtopia-opensource-src-4.3.2.tar.gz
在上一个正式版4.2.4中,ubuntu下编译时会出现libxext包不兼容的问题,经过对配置命令所输出信息的研究,猜想是4.2.4版本不支持64位系统导致的软件包不兼容,所以是i386架构的朋友可以试试看,装有其他Linux x86_64发行版的朋友也可以试试,这仅仅是笔者猜想,或许还有其他问题,或者根本就是与ubuntu不兼容……
一、编译环境的准备
qtopia的编译是一个相当复杂也相当漫长的过程,从网上各大论坛所搜集的qtopia经典编译错误就可见一斑,所以对编译环境的精心准备是确保整个过程顺利的重要部分。
先介绍一下我的软硬件环境:
CPU: Intel Core Duo T7250(2.00GHz)
Chipset: Intel P965M
Memory: 3G DDR2
Graphic: Geforce 8400MG
Linux: ubuntu 8.04
Architecture: x86_64
Kernel: 2.6.24-21-generic
Host GCC: gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
Target GCC: arm-linux-gcc (GCC) 3.4.1
个人觉得这是大多数普通桌面Linux用户的选择,当然,对于编译和安装qtopia而言,也许并不是最好的。其中很多的莫名其妙问题和一些诡异的编译错误也许都可以在suse下轻松解决,毕竟一直以来suse对qt(qtopia)的支持都是很好的。
此外对于交叉编译器的选择也是一个问题,在这里笔者选择的是使用最为广泛的经典3.4.1版本,理由很简单:大部分嵌入式Linux内核使用的编译器都是3.4.1版本的,用同样版本的编译器编译qtopia可以达到更好的兼容性,并且该版本极容易在网上找到。当然你可以选择更新的4.2.1版本,虽然难找,但是碰到编译错误实在无奈的时候也可以拿它试试。虽然笔者手中也有4.2.1的编译器,但并没有实验,毕竟编译一个qtopia是一个巨大的时间开销(在笔者的机器上大概需要75分钟左右的编译时间),有兴趣的朋友可以试验一下4.2.1的编译器,呵呵。
下面开始介绍一下具体的操作过程:
一、编译环境的配置
说明:
1、由于编译出来的qtopia大小很可能超过开发板的Flash大小,所以我们采用nfs方式进行开发和调试,之后再考虑精简。
2、为避免麻烦,以下操作一律在root下执行。
1、设置环境变量,方便下文的描述和自己的使用:
#export QTOPIA_DEPOT_PATH=/project/work/qtopia/qtopia-opensource-4.3.2
#export QTOPIA_IMAGE=/project/work/nfs/qtopia
#export QTOPIA_RUN_ON_TARGET=/opt/qtopia
QTOPIA_DEPOT_PATH:主机上qtopia的源码包目录,即安装源。
QTOPIA_IMAGE:编译后生成的image存放的位置。
QTOPIA_RUN_ON_TARGET:qtopia在target板文件系统中的所在路径。以后使用NFS挂载的时候,该目录即为qtopia的根目录。
2、加入宏定义,使得qtopia支持触摸屏:
vim $QTOPIA_DEPOT_PATH/qtopiacore/qconfig-qpe.h
然后在文件末尾添加宏定义:
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW
在笔者的utu2440开发板上,不定义这两个宏似乎也能够使用触摸屏,但无论怎么改内核,死活就是校不准触摸屏……
3、修改时区信息的读取路径
#vim $QTOPIA_DEPOT_PATH/qtopiacore/qconfig-qpe.h
在文件末尾添加宏定义:
#define QTOPIA_ZONEINFO_PATH “/opt/qtopia/etc/zoneinfo/”
QTOPIA_ZONEINFO_PATH即时区文件所在的路径,因为默认qtopia会在/usr/share/zoneinfo寻找时区信息。
这里的路径一定要设置为$ATOPIA_RUN_ON_TARGET/etc/zoneinfo。
当然也可以不改使用其默认路径,但是还是建议改一下。
4、安装libxtst-dev:
#apt-get install libxtst-dev
这个软件包在编译过程中会用到,若不安装会出错。
5、修改编译器的.h文件:
由于3.4.1的编译器不支持qtopia4.3.2的一些特性,所以需要修改以下两文件,否则会出现编译错误:
#vim /usr/local/arm/3.4.1/arm-linux/include/linux/videodev2.h
#vim /usr/local/arm/3.4.1/arm-linux/sys-include/linux/videodev2.h
在俩文件的208行后添加:(俩文件是一样的)
/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc(‘B’,’A’,’8′,’1′) /* 8 BGBG.. GRGR.. */
笔者曾经就该问题搜索过互联网的一些信息,有人说使用3.3.2版本的编译器可以正常编译通过,笔者猜想4.2.1的编译器也有可能能编译通过,但都未作尝试,下次有时间试验一下。
6、生成Makefile
首先一定要确认上文所提到的环境变量设置正确,然后开始生成Makefile:
在$QTOPIA_DEPOT_PATH的上层目录新建build文件夹:
#mkdir $QTOPIA_DEPOT_PATH../build
然后进入build,执行如下命令:
#cd $QTOPIA_DEPOT_PATH../build
#../qtopia-opensource-4.3.2/configure -image $QTOPIA_IMAGE -prefix $QTOPIA_RUN_ON_TARGET -xplatform linux-arm-g++ -arch arm -displaysize 240×320 -no-qvfb -no-bluetooth -no-infrared -no-modem -no-drm -voip -extra-qtopiacore-config “-depths 4,8,16,32 -qt-mouse-linuxtp -no-mouse-pc -no-mouse-bus -no-mouse-yopy -no-mouse-vr41xx -no-mouse-tslib -no-mouse-qvfb” -extra-qt-config “-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg” 2>&1 | tee logfile
说明:
对于这其中的配置参数,有些虽然是qtopia编译的默认参数,但为了保险起见还是加上了。
笔者也曾经参考过其他网友高手的参数,经过认真的研究和比较后还是用了如上的参数,值得注意的是对于笔者手上的这块板子就是不能定义很多高手介绍经验时提供的-defaultbuttons phone参数,否则启动的时候会出现很多”Can not map the key to QMenu”之类的错误,而且进入图形界面后就死机了……
各个参数的配置可以参考官方文档,该参数也只适合笔者手上的2440扳子,朋友可以按实际情况修改使用。
这里建议一些自己学习的朋友,可以将配置命令甚至以后编译过程中的信息输出到文件中加以详细研究,如上参数所示,将所有屏幕输出保存在了logfile里。若以后出现编译错误,这个文件是很有价值的,笔者就曾经这样获得过一些诡异问题的解决思路。
二、编译&安装
#make
#make install
说明:make install默认将将编译完成后的IMAGE安装在$QTOPIA_IMAGE指定的地方,当然你也可以通过make install IMAGE=$OTHER_PLACE重新指定安装的位置。
由于qtopia安装的时候没有为我们拷贝zoneinfo,所以我们还需要手动拷贝一下:
#cp -avf $QTOPIA_DEPOT_PATH/etc/zoneinfo $QTOPIA_INSTALL/etc
qtopia运行的时候需要一些运行库,手动拷贝一下:
#cd /usr/local/arm/3.4.1/arm-linux/lib
#cp -v libstdc++*so* $QTOPIA_IMAGE/lib/
备注:
有网友说如下一些库文件也要拷,但是笔者实验后发现不拷也行,本着“精简”的原则就没拷,但是还是列出来供参考:
#cp -v libdl*so* $QTOPIA_IMAGE/lib/
#cp -v libpthread*so* $QTOPIA_IMAGE/lib/
#cp -v libgcc_s*so* $QTOPIA_IMAGE/lib/
三、挂载,运行
通过nfs方式挂载后,先定义一下qtopia运行需要的环境变量:
#export PATH=$PATH:/opt/qtopia/bin
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/qtopia/lib
#export QWS_MOUSE_PROTO=LinuxTP:/dev/ts0
#export QWS_DISPLAY=”LinuxFb:mmWidth35:mmHeight45:0″
注意:
其中关于QWS_MOUSE_PROTO的定义,在笔者的板子上触摸屏是/dev/ts0,但是有些(好像更多的)是/dev/touchscreen/0,若出现找不到触摸屏的情况可以考虑更改此处的定义,必要的时候可能还需要在/dev下新建个链接来兼容qtopia。
若嫌这样还不爽,你可以直接改源码,该文件在$QT_DEPOT_PATH/qtopiacore/qt/src/gui/embedded/qmouselinuxtp_qws.cpp。
以上方法都不行,那么可能需要tslib来帮忙了,具体方法就google吧……
说明:
其中“mmWidthXX:mmHeightXX”为屏幕的可视面积大小,与具体的设备尺寸有关系,不过笔者试了几组,好像没什么影响……
加载qtopia:
#qpe&
待屏幕出现画面后校准触摸屏:
#qcop service send Launcher “execute(QString)” “calibrate”
到此你应该在屏幕上看到启动好以后的qtopia手机版界面了,接着就是自己完善其中的一些功能,个展宏图咯!
附一些笔者所碰到问题和网上搜集的一些问题的解决方法:
1、编译错误:
解决方法:安装libxtst-dev包。
#apt-get install libxtst-dev
2、编译错误:
V4L2_PIX_FMT_SBGGR8
解决方法:
1、检查是否按照第一部分的步骤五正确修改了编译器的.h文件。
2、尝试换用其他版本的交叉编译器。
3、编译错误:
PAGE_SIZE and PAGE_MASK
解决方法:
#vim /usr/local/arm/3.4.1/arm-linux/include/asm/page.h
#vim /usr/local/arm/3.4.1/arm-linux/sys-include/asm/page.h
把语句
#ifdef __KERNEL__
移动到定义
15 /* PAGE_SHIFT determines the page size */
16 #define PAGE_SHIFT 12
17 #define PAGE_SIZE (1UL << PAGE_SHIFT)
18 #define PAGE_MASK (~(PAGE_SIZE-1))
后面
4、NFS挂载失败:
尝试增加参数”-o nolock”,即:
mount -t nfs xx xx -o nolock
5、nfs挂载超时:
尝试增加参数”rsize=1024,wsize=1024,timeo=15″,即:
mount -t nfs xx xx -o nolock,rsize=1024,wsize=1024,timeo=15