标题
摩托罗拉E380/海尔N60/夏新E600/philips968等手机系统分析 [zt]
我是马甲
浏览(0) +
2007-06-04 16:01:31 发表
编辑
关键字:
来自 http://linux.chinaunix.net/bbs/viewthread.php?tid=866379&page=2 一、前言 这是最后的内容,然而却有很大的遗憾,如果运行OPIE,但E680原有系统依然 会接受的键盘和触摸屏的事件,这种情况下几乎不能正常使用OPIE,必须telnet进 手机kill掉windowserver,这实在是无聊的很。 这个问题早在去年已经被一位外国友人解决。不过相关源码贴子的链结皆已失效, 不能尽快的找出解决方法,但在网上可以搜索到完美编译后的OPIE下载。 如有那位前辈知道解决方法,一定请赐教,不甚感激。 我之所以还要把带有遗憾的方法写出来,那是因为这些内容覆盖面相当多了, 层次也很高了。 以后找出解决方法,有了这些知识基础,就随心所欲了。 二、重要提示 为了方便更好的理解本文,提供下面链结。 E680应用开发全系列的文章地址:http://blog.csdn.net/liwei_cmg 文章相关的重要资源的下载地址:http://play.younet.com/view.php?tid=18578 三、编译OPIE 1.http://marcus.bluetroll.se/e680/opie-cvs.tar.gz 下载 opie-cvs.tar.gz 注意:其实编译过程可以看opie-cvs.tar.gz里的README。我们这里同样使用了Leprechaun 的方法。 2.在ftp://ftp.trolltech.com/qt/source/qt-embedded-2.3.10-free.tar.gz 此OPIE版本指定需要使用qt 2.3.10版本。 3.同样为了便于管理,统一在 /home/gcc/toolchain 下解压缩OPIE和QT。 4.设置环境变量 export TOOLCHAIN_DIR=/home/gcc/toolchain export PATH=$PATH:$TOOLCHAIN_DIR/arm-linux/gcc-3.3.2-glibc-2.3.2/bin export QTDIR=$TOOLCHAIN_DIR/qt-2.3.10 export OPIEDIR=$TOOLCHAIN_DIR/opie export LFLAGS_EXTRA=" -Wl,-rpath-link,$TOOLCHAIN_DIR/arm-linux/gcc-3.3.2-glibc-2.3.2/arm-linux/lib " 5.执行如下脚本,这是编译QTE所做的准备工作,这里需要下载uic-qt2这个文 件,上篇文章已经说明 mkdir -p $QTDIR/bin cp uic-qt2 $QTDIR/bin/uic chmod u+x $QTDIR/bin/uic #root用户这个就没有必要了 ln -s $OPIEDIR/qt/qconfig*.h $QTDIR/src/tools/ #README里已说明,使用OPIE选项进行编译 cd $QTDIR patch -p1 < $OPIEDIR/qt/qt-2.3.10.patch/qte-2.3.10-all.patch #qt的OPIE补丁 6.编译QTE cd $QTDIR ./configure -qconfig qpe -depths 16,32 -xplatform linux-arm-g++ -thread -no-qvfb -system-jpeg -gif -system-zlib -no-xft make 7.编译OPIE cd $OPIEDIR make menuconfig cp opie-config $OPIEDIR/.config make 注意:这个opie-config是Leprechaun提供的config文件,用户也可以直接在 menuconfig自行设置,其实包含需要编译的OPIE功能。本资源贴提供了下载。 8.至此OPIE已经编译成功。如果要在手机上运行,我们这里需要对他进行一些 精简,去除一些无关紧要的东西。 #!/bin/bash export REALOPIE=/home/gcc/moto mkdir -p $REALOPIE/i18n cp -a $OPIEDIR/bin $OPIEDIR/apps $OPIEDIR/lib $OPIEDIR/pics $OPIEDIR/sounds $OPIEDIR/plugins $OPIEDIR/pics-hires $REALOPIE cp -a $OPIEDIR/i18n/en $REALOPIE/i18n/ cp -a $QTDIR/lib/* $REALOPIE/lib/ find $REALOPIE -type d -name CVS | xargs rm -rf 我们把精简的路径设为/home/gcc/moto,复制完全后,这个就是我们需要放 在手机上的文件夹。 四、手机上运行OPIE 这里有三种方法。我们将做一一介绍。 ★方法一★:将/home/gcc/moto这个文件,直接复制到E680上。 这里需要注意的严重问题。文件夹的lib文件有很多是采用Linux的ln,即软连接, 如:libso -> libso.1.1 libso.1 -> libso.1.1,libso与libso.1皆是软连接。只有 libso.1.1是真实的库文件。这在Linux下是十分普遍的。在我们SD卡上是不能够建立 的。因为我们SD卡默认是采用FAT格式分区。 我们进行冗余法,即有一个软连接,我就复制一个真实的lib文件。 这里自已写了个脚本完成这个操作。 #!/bin/bash vFileInput=liwei rm -f $vFileInput echo "Begin Find Links..." sleep 0.5s find /home/gcc/moto -type l | xargs ls -l | tee $vFileInput echo "End Find Links." echo "Begin Copy Libs..." sleep 0.5s rm -f copyso.log i=0 vFileLen=`wc -l < $vFileInput` vFileLen=`expr $vFileLen + 1` while test $i -lt $vFileLen do vFileLine=`tail +$i $vFileInput | head -1` vDir=${vFileLine%>*} vDir=${vDir%-*} vDir=${vDir%/*} vDir=${vDir##* } vBase=${vFileLine##* } vLink=${vFileLine%>*} vLink=${vLink%-*} vLink=${vLink% *} vLink=${vLink##* } echo rm -f $vLink rm -f $vLink echo cp $vDir/$vBase $vLink eval 'cp $vDir/$vBase $vLink' echo $i " Files Dealed." i=`expr $i + 1` done echo "End Copy Libs." echo "Done." 注意:find /home/gcc/moto -type l | xargs ls -l | tee $vFileInput 显然是指定这里的/home/gcc/moto路径,可按自已需要更改。此外这个脚本 还有个bug,就是如果/home/moto/gcc下不存在软连接,则会出错。有兴趣的 可以去完善一下。 复制完所有软连接,将这个文件夹复制到手机SD上。如:/mmc/mmca1/moto #!/bin/bash export QTDIR=/mmc/mmca1/moto export LD_LIBRARY_PATH=/lib:/usr/lib:/mmc/mmca1/moto/lib export EZX_RES_FONT_PATH=/mmc/mmca1/moto/lib/fonts export PATH=$PATH:/mmc/mmca1/moto/bin export HOME=/mmc/mmca1/moto /mmc/mmca1/moto/bin/qpe -qws 即可运行OPIE系统,这里OPIE和系统会在触摸屏上会有冲突,国外早已有人 解决了这个问题,遗憾的相关链结全部失效,到现在也没有解决这个问题。这里 暂时只能ps -ef ,把windowserv的进程杀掉才可以完美的运行OPIE。 ★方法二★:将OPIE制作成cramfs文件格式包,并把SD卡分出一个分区,用 于装载cramfs文件包,并在E680上mount上去。这就成功避开了软连接的问题。 这个方法单就运行OPIE,意思不大,且十分复杂,但涉及内容很多,不冲方 法冲知识,所以这里详细说明一下。 1.首先需要对SD卡进行分区。当然SD卡内容会全部丢失,及时做好备份。 将SD卡弹出,用USB读卡器连到Linux机器上。我这里使用的是虚拟机VMware5.0, 需要在菜单vm->Removeable Devices->USB Devices->Micro USB Device。这 时虚拟机会自动加载USB设备到Linux下。 此时在Linux fdisk -l 可以查看的两段信息,一是硬盘分区信息,另一个就 是USB设备了。 Disk /dev/sda: 8053 MB, 8053063680 bytes 255 heads, 63 sectors/track, 979 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 892 7164958+ 83 Linux /dev/sda2 893 974 658665 82 Linux swap Disk /dev/sdb: 1015 MB, 1015808000 bytes 32 heads, 61 sectors/track, 1016 cylinders Units = cylinders of 1952 * 512 = 999424 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 950 927169+ 6 FAT16 /dev/sdb2 951 1016 64416 83 Linux [注意:] 如果此时看不到类似以上内容,可执行以下语句: # /sbin/lsmod 查看内容是否包括 usbcore、usb-ohci(或usb-uhci)、scsi_mod等。如找 不着,可按下面shell语句,循环安装驱动。当然,你也可以用/sbin/insmod 一一安装。 cd /lib/modules/2.4.20-8/kernel/drivers/usb for v in *.o storage/*.o ; do /sbin/insmod $v ; done 驱动安装完毕后,# /sbin/lsmod 查看内容是否安装成功,重新插拔USB设备 直到fdisk -l 发现设备。 上面查看到USB设备,已经是分好区的。分了两个主分区 /dev/sdb1,/dev/sdb2 这样,/dev/sdb1会自动被Windows和E680识别,/dev/sdb2在E680上可以手工挂载上 去。 具体如何使用fdisk分区,可以查看相关帮助,或网上搜索一下。 fdisk /dev/sdb 对SD卡进行分区,最后强调一下,必须都是主分区,第一个分 区是FAT格式,第二个是Linux格式。分完w保存信息,mkfs.msdos /dev/sdb1进行格 式化。/dev/sdb2用作cramfs文件,比OPIE总体大小大一点就可以了,一般40M左右。 2.分好区后,就需要制作cramfs文件了。 我们输入 mkcramfs /home/gcc/moto /home/gcc/moto.cramfs 会发生错误,如下: Exceeded MAXENTRIES. Raise this value in mkcramfs.c and recompile. Exiting. 麻烦又来了,系统自带的mkcramfs命令支持的文件数量是有限的。我们必须去 找mkcramfs的源代码,更改下参数,然后重新编译一下。本资源贴提供了此源代码的下载。 编译后使用可执行文件:/home/gcc/moto/mkcramfs /home/gcc/moto /home/gcc/moto.cramfs 生成cramfs包。成功显示如下: Directory data: 89156 bytes Everything: 21572 kilobytes Super block: 76 bytes CRC: eb6895a4 3.将cramfs包装载到SD卡的第二个分区。 dd if=moto.cramfs of=/dev/sdb2 这个过程比较慢,且不需要mount /dev/sdb2,只要fdisk -l能查看的/dev/sdb2的 信息即可。成功会显示如下: 43144+0 records in 43144+0 records out 4.再点下菜单vm->Removeable Devices->USB Devices->Micro USB Device 把勾去掉 USB设备又回到了Windows下。移除USB读卡器,把SD卡,插入E680。 在telnet下,输入mount命令: rootfs on / type rootfs (rw) /dev/root on / type cramfs (rw) none on /ram type ramfs (rw) proc on /ram/proc type proc (rw) /dev/tffsa on /usr/language type cramfs (rw) /dev/roflash2 on /usr/setup type cramfs (rw) none on /dev/pts type devpts (rw) /dev/mtdblock2 on /ezxlocal type vfm (rw,noatime) /dev/tffsb1 on /diska type vfat (rw,noatime) /dev/mmca1 on /mmc/mmca1 type vfat (rw,noatime) 可以看出E680系统自动mount了我们第一个主分区,第二个主分区需要我们手工 mount。 输入以下命令: # ls -l /dev/mmca1 brw-rw---- 1 root root 243, 1 Oct 2 07:09 /dev/mmca1 我们需要在E680上再建立个块文件。只有/ezxlocal下才允许我们建立。 在/ezxlocal下创建block文件。因为mmca1是243 1,所以我们使用如下参数: mknod /ezxlocal/mmca2 b 243 2 在/ezxlocal下创建目录。如opie。 mkdir /ezxlocal/opie。这个目录用于我们 挂载建立的block文件。输入命令: mount -t cramfs /ezxlocal/mmca2 /ezxlocal/opie 就会发现opie里的就是我们在Linux下那个/home/gcc/moto的文件内容了。至此 我们就成功的把cramfs文件做为一个分区挂载到E680上。 5.运行OPIE export QTDIR=/ezxlocal/opie export OPIEDIR=$QTDIR export LD_LIBRARY_PATH=/lib:/usr/lib:$QTDIR/lib ./clock -qws 即可看到个全屏时钟,./qpe -qws即可运行OPIE操作系统,不过这个依然会存在 与WindowsServer的触摸屏冲突,解决方法同上。 ★方法三★:通过loop,挂载moto.cramfs。下载本资源贴loop.o文件,将 moto.cramfs和loop.o复制到SD卡上,如/mmc/mmca1下。 # mkdir liwei # insmod loop.o # mount moto.cramfs liwei -t cramfs -o loop /mmc/mmca1/liwei下就可以看到moto.cramfs里的内容了,十分简单。再运行OPIE 就跟方法二一样了。 五、写在最后 这三种方法都有个通病:不能解决OPIE与E680的触摸屏,按键的冲突问题。大家 可以去网上搜索相关完美解决方法。也有提供完美的OPIE安装文件。我目前手机上 就是用的一位外国人编译的,运行时可以屏蔽按键,触摸屏,可以自由与手机系统进行 切换。
我是马甲
摩托罗拉E380/海尔N60/夏新E600/philips968等手机系统分析 philips 968或夏新 E600 摩托罗拉E380 E680i C650 A780 海尔N60 等linux智能手机资料 深度剖析E680G应用一.所谓的Loader 草木瓜 20060818 相关资源下载 http://play.younet.com/view.php?tid=18578 一、写在前面的话 E680G,已不能简单理解为手机,而是一台实实在在运行Linux操作系统的个人掌 上电脑! 本文试图通过探讨E680G操作系统的架构,打造个人PDA,扩展其强劲的功能。 由于本人也刚接触E680G不久,再加上Linux知识空白,文章深度也许还远远不能达 到分析Linux内核源码的层次,所以我加上了应用二字,足以说明是面向广大普通用户的。 对大多数人来讲扩展应用软件才是主要的内容。 此外本文所涉及内容皆不需要进行刷机,这对新手来说更容易接受罢。 二、进入正题 进入正题前还想说几句废话:首先,那就是砸锅卖铁也得要买块扩展卡来,最好是 1G的,否则就那点手机内存空间也没有玩的必要了!其次,说明书必须认真阅读,基本 操作都不知道,又如何谈得上玩转? 三、探究Loader A.安装程序 只要你上了E680论坛,你可以看几乎无所不在的L/M!说实话,Loader只不过是别人 写的一个简单脚本,几行代码而已。可对刚入手E680g的人来说是很神秘的,纯粹去研究 Loader也没有意义,然在我们一步一步探个究竟的过程中,你会发现自已的DIY能力却提 高了很多。 Loader的安装程序有两种,一种安装在手机,另一种安装在卡上。一般是个mtf文件 如:Loader_E680i_phone.mtf(手机) Loader_E680i_SD.mtf(SD卡)。 扩展名为mtf的文件可以直接被E680g执行。(再废话点,复制到手机或者卡上点下该 mtf文件就可以执行了。) mtf文件的本质是linux下tar包的压缩文件!不明白不要紧,可以将上面文件下改名 为Loader_E680i_SD.tar.gz ,用winrar解压缩,就可以看到一些文件。(有兴趣可以 看下Linux下tar,gunzip等相关shell命令的用法,那样就会更清楚了。) 不管你是从哪里下载的Load安装程序,这个目录结构肯定都是一样的! 如果mtf在E680G下运行,就是直接解压缩到手机Linux操作系统环境下的对应路径。 用卡版的Loader_E680i_SD.tar.gz为例,它其实就是解压成如下文件: /mmc/mmca1/.system/java/PlugCardDB /diska/.system/QTDownLoad/loader/loader.desktop /diska/.system/QTDownLoad/loader/loader.lin /diska/.system/QTDownLoad/loader/loader.gif /diska/.system/QTDownLoad/loader/loader_sm.gif 手机版Loader_E680i_phone.tar.gz路径肯定是有所不同的,以下是手机版解压的对 应文件: /ezxlocal/download/appwrite/am/InstalledDB /diska/.system/QTDownLoad/loader/loader.desktop /diska/.system/QTDownLoad/loader/loader.lin /diska/.system/QTDownLoad/loader/loader.gif /diska/.system/QTDownLoad/loader/loader_sm.gif 可以看出卡版和手机版的唯一区别是有个DB不同! 在E680G上也存在这两个文件,PlugCardDB和InstalledDB,存放外部程序(系统自 带游戏,自户安装的软件)的配置信息。PlugCardDB存放安装在卡里的程序信息,而 InstalledDB存放安装在手机里的程序信息。 在E680G开机或者更改菜单顺序时会读取这两个DB文件来刷新菜单显示。这两个文 件都是文本格式,可以用UltraEdit打开。 B.配置文件 我们先打开Loader安装程序的这两个文件,会发现InstalledDB除了一项关于Loader 的配置内容还有其他一些内容,而PlugCardDB只有一项关于Loader的配置内容。这是因 为做安装包的人已经把手机自带的游戏配置信息也写到InstallDB里了。 以下是卡安装版的Loader配置信息(PlugCardDB),手机版的Loader配置信息也差不 多的。 [AppLinkInfo] AppLinkCount = 100000001 [AppLinkRecord100000001] AllPosition = BigIcon = loader.gif Directory = ../../../../diska/.system/QTDownLoad/loader Exec = loader.lin Group = 5 Icon = loader_sm.gif InstalledDate = JavaId = -1 Mime = MpkgFile = Name = Loader OsVersion = Position = 17 Rotation = Shared = 0 Size = 10K Type = 2 uid = 100000001 [MimeInfo] MimeCount = 100000000 你可以去你手机卡上看到这个PlugCardDB文件,亲自对比一下。不过如果你还 是新手还不会telnet的话,那样也没关系。大容量模式连接电脑,可以在卡那个盘 符,路径为.system/java/下找到PlugCardDB文件。 下面我们列表详细说明下这个配置文件的主要内容。 AppLinkCount = 100000001 安装的程序最大序号 AppLinkRecord100000001,uid = 100000001 应用程序的安装序号,不重复即可。 Directory 应用程序所在路径。 BigIcon = loader.gif,Icon = loader_sm.gif 应用程序显示在菜单上的大图标和小图标。 Exec 所执行的应用程序或脚本 JavaId 如果是Java程序 则为正值,否则为-1 Group =5 前4个是手机系统的Group,5,6是自定一,自定二 Position,AllPosition 显示在菜单上的顺序 Name 应用程序名称 Type 内容很重要,下面详细说明。 系统指定Java程序Type=5,其他应用程序Type=2。(你也可以设为0,3,4,6至于效 果可以自行尝试。)这里需要着重说明的是,Type=2时Directory的路径需要回退到顶 级目录,前面须要加../../../../,因为两个DB文件都是在四级目录以下,否则系统 不能识别。这里还有个著名的问题,就是当Type=2时,系统不管配置信息如何,菜单 全部显示“应用名称”!让人比较郁闷。这问题虽然可以通过刷机解决,然而却是没有 太大意义,因为就装MPKG的本身而言,其实也没什么必要。(后面会详细说明) C.Loader小结 读到这里,我们可以得出清晰的结论:所谓Loader的安装过程,只是把loader这 个文件夹复制到手机的某个目录,同时覆盖掉InstallDB(手机版)或者PlugCardDB(卡版) 文件,即把这个目录程序的配置信息加到DB文件中。 所以在安装后,自己安装的JAVA软件肯定不在了,在InstallDB或者PlugCardDB已经 没有了那些软件的配置信息了。 Loader根本没有必要装在手机上!可以完全抛弃mtf安装的方法,直接复制Loader文 件夹至卡的任一路径。(记住要是标准路径,不是你大容量的路径。配好telnet,或者装个 Qonsole一下就清楚了。)在PlugCardDB文件中手工加入配置信息即可。 D.Loader是什么 那么我们为什么要装Loader,他有什么用。UltraEdit打开loader.lin文件看下。 熟悉Linux的一看就知道,太简单了!只是普通的一个Shell脚本,而起作用的就是 exec这句话。比如用test.sh用Loader关联打开,系统Shell启动Loader,执行到exec时, 就相当于exec test.sh。(如果不明白可以查看下Linux下相关Shell的脚本介绍。) 按理来说,在Linux在执行这种脚本是天经地义的事,只不过在E680g图形化界面下 是不能直接运行的。 那怎么办?下面通过自定义Loader例子说明。 你随便写个脚本test.sh如下: #!/bin/bash cd /usr/SYSqtapp/mystuff ./mystuff 这个是启动系统收藏夹的命令。再写个test.load脚本: #!/bin/bash exec "$2" & 在卡上建个文件夹如/mmc/mcal1/test,把test.sh,test.load两个脚本复制过去, 先在手机上点击test.sh,肯定会显示找不到可执行的程序,这时在PlugCardDB配置 信息加上如下内容: [AppLinkRecord100000001] AllPosition = BigIcon = Directory = ../../../../mmc/mmca1/test Exec = test.load Group = Icon = InstalledDate = JavaId = -1 Mime = MpkgFile = Name = OsVersion = Position = Rotation = Shared = 0 Size = Type = 2 uid = 100000001 (注:依情况更改AppLinkCount和AppLinkRecord,上面配置略去了很多次要内容, 只保留必要的。) 保存后,更改下菜单的顺序,会发现有个感叹号的应用程序,不用管他,那是因为 我们没有指定菜单的图标!这时选择test.sh,然后用那个感叹号的应用程序打开,就会 发现成功打开了收藏夹!我们自已的Loader也成功了! 看到这里,Loader的本质想必应该十分清楚了吧。 五、结束 理解的本文的Loader,再讲MPKG,就简单多了。下一篇主要分析MPKG的相关软件 您对本贴的看法:(1) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 2楼 发表于 2006-12-6 13:46 深度剖析E680G应用二.MPKG 草木瓜 20060818 相关资源下载 http://play.younet.com/view.php?tid=18578 一、补充说明 上文已完全分析了Loader的实质,试想自已写个Loader脚本,不管是卸载还是 扩展都是很轻松的事。这里还需要补充说明一下,上文提到Shell脚本在E680g图形 化界面下是不能直接运行的。这里有两种办法,一种通过关联Loader脚本运行,另 一种可以直接配置到系统菜单里解释运行,这时便于Loader没有任何关系。 Loader的作用只是方便于在图形化界面下关联运行Shell脚本。 修改PlugCarDB或者InstalledDB需要重新更改菜单顺序,系统是把配置数据载 入内存再进行处理的。 二、通过USB实现Telnet 要继续深入下去,不谈Telnet是完全不可能的事,Telnet可以看到手机操作系统 的完全目录!可以执行Linux很多有用的Shell脚本,DIY也才算真正开始。 如何实现,网上这类文章也是比较泛滥!下面只简单说明一下。可以去友人网, www.e680.net等这类网站去查看详细说明。 1.写个脚本文件,名称随意,比如usb.lin,复制到手机上卡上任意地方。 #!/bin/bash echo MotNet > /proc/motusbd 2.准备Moto E680 的 USBNET 驱动 3.Modem方式USB连接电脑,安装好驱动 4.选择usb.lin打开方式,用Loader应用程序打开 5.telnet 169.254.142.2 输入root,回车,这时直接在电脑路径里输入 \\169.254.142.2\system,即可访问所有文件。 三、MPKG是什么 坛子上说:运行扩展名为MPKG程序,需要安装MPKG。 至于大家所下载mpkg安装程序,只是shell高手自个写的安装脚本罢了。安装程 序过程是怎么样的?说白了就是复制文件嘛,管你是Windows还是Linux! 而那些扩展名为mpkg文件是和mtf文件是一样的,还是Linux下tar文件包的gunzip 压缩包,格式就是.tar.gz。MPKG安装也是差不多的意思,一样的解压缩,所不同的是, 还需要修改InstalledDB或者PlugCardDB这两个文件,为的是让我们能在菜单上直接看 到嘛。 以友人网GMS提供的mp3播放器的mpkg文件为例! 下载地址:http://play.younet.com/view.php?tid=15040 找到19425526.mpkg文件,改名19425526.tar.gz,解压缩出mp3player文件夹,把 这个文件夹复制到手机上,找到mp3player文件夹里的mp3player,这个是linux下的应用 执行程序。(关于Linux下文件类型的,还是需要找些资料熟悉一下,连应用程序是哪个 都不知道的话,也就无语了。)长按这个文件,打开方式选择Loader应用程序。你会发现 播放器运行没有任何问题! 思考下,原来什么mpkg安装,搞得只是让我在菜单上看到罢了,我复制过去就可以 直接运行,又何必再费事。不过也有问题,没有快捷方式啊,总不能每次找文件夹吧。 建立快捷方式可以写个这样的Shell脚本,可以命名为mp3.lin。打开方式用Loader 脚本关联,这个文件不管在哪个位置,只要一点击就会执行。内容如下: #!/bin/bash #系统的环境变量 export QTDIR=/usr/lib/ezx export LD_LIBRARY_PATH=$QTDIR/lib export EZX_RES_FONT_PATH=$QTDIR/lib/fonts cd /mmc/mmca1/mp3player #这个路径当然是你自已手机上的 ./mp3player #在当前路径下运行mp3player 这里重点说下这系统的环境变量。 如果不在PlugCardDB中配置文件,直接用Loader关联程序打开的话是不需要配置这 些的。 反而如果在PlugCardDB中配置好,想在菜单直接运行的话,是必须设置环境变量的。 这时不会关联Loader去运行。 当然不管什么时候设置的话都不会出错。这些变量在脚本运行结束就被释放了。 四、我对MPKG安装软件的管理方法,给大家一些参考。 /mmc/mmca1/Soft 存放各类复制过来的mpkg软件 如: /mmc/mmca1/Soft/liwei 脚本Loader(其实就是上篇文章那句exec Shell) /mmc/mmca1/Soft/shortcuts 自定义的收藏夹,后面会讲到 /mmc/mmca1/Soft/fm 软件 收音机 /mmc/mmca1/Soft/mp3player 软件 mp3播放器 /mmc/mmca1/Soft/doom1 游戏 doom1 /mmc/mmca1/Soft/quake 游戏 quake ... /mmc/mmca1/Soft/public 存放用于脚本提示的录音文件,如进程已经关闭,打开之 类信息。 如: /mmc/mmca1/Soft/exsit.wav ... /mmc/mmca1/Exe 存放复制过来的mpkg软件运行脚本,之所以用英文名主要是 考虑可以在telent下测试脚本,中文全是????,即便解决了,输入中文也是麻 烦。作用就相当于快捷方式。 如: /mmc/mmca1/Exe/fm.lin /mmc/mmca1/Exe/fm_close.lin close的lin主要是为了便于隐藏后随时关闭 /mmc/mmca1/Exe/mp3.lin /mmc/mmca1/Exe/mp3_close.lin /mmc/mmca1/Exe/doom1.lin /mmc/mmca1/Exe/quk.lin ... Loader的配置信息肯定是要加到PlugCardDB里面,也建立了lin与Loader的文件 关联。另外shortcuts也需要加到里面。下面主要说明下shortcuts的内容。 shortcuts目录里面包括了自定义的脚本shortcuts.sh,图标自已可以自行添 加,大图标32*32,小图标24*24,别忘了在PlugCardDB把图标名也加上。 shortcuts.sh 内容如下: #!/bin/bash export QTDIR=/usr/lib/ezx export LD_LIBRARY_PATH=$QTDIR/lib export EZX_RES_FONT_PATH=$QTDIR/lib/fonts #系统收藏夹默认访问路径 export MYSTUFF_DATA_PATH=/mmc/mmca1/Exe #设置/mmc/mmca1/Exe的访问权限,不让mystuff在Exe下瞎建文件夹 chmod 444 /mmc/mmca1/Exe cd /usr/SYSqtapp/mystuff ./mystuff chmod 777 /mmc/mmca1/Exe MYSTUFF_DATA_PATH这类变量可以查看/home/native/.profile这个文件。如何得到 收藏夹是哪个进程,可以打开它,在telnet中ps ax或者ps -ef查看。 这样在PlugCardDB里配置好内容,在菜单点击一下就可以直接进入Exe目录中了, 想启动哪个软件就随意了。这时候已经完全抛开MPKG的束缚了! 五、结束 希望大家能真正透彻了解Loader与MKPG,完全自已DIY,这两篇文章着重方法一些, 在看方法时最重要是提炼思想。 遗憾的是,能力有限到目前为止还不能不通过刷机解决显示“应用程序”的问题。这 个目前估计可以通过Java程序调用来实现。 最后再给出一些文件的内容。.lin里面的wav文件是自已的录音文件,主要用于提 示,熟悉的人一看就明白了,不熟悉的话研究下Linux Shell吧,上手不难的。 mp3.lin #!/bin/bash Moto_AlertProcess='/usr/SYSqtapp/phone/alertprocess' Moto_AlertExistFile='/mmc/mmca1/Soft/public/exist.wav' Moto_AlertInfoFile='/mmc/mmca1/Soft/public/info.mid' $Moto_AlertProcess -playvol 5 -playfile $Moto_AlertInfoFile if ps -ef | grep "mp3player" | grep -v grep then $Moto_AlertProcess -playvol 5 -playfile $Moto_AlertExistFile else cd /mmc/mmca1/Soft/mp3player ./mp3player fi mp3_close.lin #!/bin/bash Moto_AlertProcess='/usr/SYSqtapp/phone/alertprocess' Moto_AlertKillFile='/mmc/mmca1/Soft/public/kill.wav' Moto_AlertNoFile='/mmc/mmca1/Soft/public/no.wav' Moto_AlertInfoFile='/mmc/mmca1/Soft/public/info.mid' $Moto_AlertProcess -playvol 5 -playfile $Moto_AlertInfoFile if ps -ef | grep "mp3player" | grep -v grep then start-stop-daemon --start --exec /bin/kill ` pidof mp3player ` $Moto_AlertProcess -playvol 5 -playfile $Moto_AlertKillFile else $Moto_AlertProcess -playvol 5 -playfile $Moto_AlertNoFile fi PlugCardDB中关于loader和shortcuts的配置信息 [AppLinkRecord100000001] AllPosition = BigIcon = liwei.gif Directory = ../../../../mmc/mmca1/Soft/liwei Exec = liwei Group = 5 Icon = liwei_sm.gif InstalledDate = JavaId = -1 Mime = MpkgFile = Name = liwei OsVersion = Position = 17 Rotation = Shared = 0 Size = Type = 2 uid = 100000001 [AppLinkRecord100000002] AllPosition = BigIcon = big.png Directory = ../../../../mmc/mmca1/Soft/shortcuts Exec = shortcuts.sh Group = 5 Icon = sm.png InstalledDate = JavaId = -1 Mime = MpkgFile = Name = OsVersion = Position = Rotation = Shared = 0 Size = Type = 2 uid = 100000002 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1127359 您对本贴的看法:(0) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 3楼 发表于 2006-12-6 13:49 深度剖析E680G应用四.彻底解决LM带来的麻烦 草木瓜 20060826 相关资源下载 http://play.younet.com/view.php?tid=18578 一、前言 如果你看过以前的三篇文章,再来理解这篇应该是很轻松了。这篇文章的目 的就是为了能彻底抛弃L/M给我们带来的这么多麻烦!什么安装,卸载,改名等等 一并解决,而且只是更改了手机上一个文件而已。 在这里,需要感谢的人很多,起码要点名两个人,yan0和Cyph。一位搜集整 理了ezx_flexbit.cfg设置方式,另外一位居然提供了flashkit如此奇妙的工具。 这里也不得不赞叹www.e680.net是个好去处,flashkit我就是从那里下载到的。 实现本文方法,需要telnet到手机,其他的Linux操作系统和flashkit工具。 二、原理 其实很简单,在MOTO以前一些机子上就可以直接安装管理MPKG程序,只是在E680系列版 本中居然被屏蔽了,不过幸好大家发现功能的开关就在ezx_flexbit.cfg这个文件中。 不过ezx_flexbit.cfg这个文件有两个,如下: /usr/setup/ezx_flexbit.cfg /ezxlocal/download/appwrite/setup/ezx_flexbit.cfg 先详细说一下ezx_flexbit.cfg这个文件的原理。 我们先打开/ezxlocal/download/appwrite/setup/ezx_flexbit.cfg这个文件, (这是我E680G,未进行任何刷机修改的内容)内容如下: [SYS_FLEX_TABLE] 0 = 1208211392 1 = 374437888 2 = 2178351491 3 = 1678589 4 = 4289465088 5 = 195198976 这里的每行对应了32位二进制的数值,只是显示成10进制了,我们转换一下, 不足32位的在左端加0,并且4位一组加上序号,内容如下: A B C D E F G H 0 0100 1000 0000 0011 1101 0111 1100 0000 0 = 1208211392 1 0001 0110 0101 0001 0111 1000 0000 0000 1 = 374437888 2 1000 0001 1101 0111 0000 0001 1000 0011 2 = 2178351491 3 0000 0000 0001 1001 1001 1100 1111 1101 3 = 1678589 4 1111 1111 1010 1100 0000 1011 0000 0000 4 = 4289465088 5 0000 1011 1010 0010 1000 0000 0000 0000 5 = 195198976 可以自已转换一下,看看结果是不是一致,加深下理解。这里每个0或1都表示 一个功能的关闭与开启。这里只选出意义比较重大的功能开关。 ◆3行C组第1位 开启USB网的菜单,手机设置-USB模式里会出现USB网,这种模式连接电脑即可 直接Telnet。 这里显然没有开启! ◆3行F组第1位 手机上网有“可能要收取额外的通话费用,继续吗”的提示,此为手机Opera上网 的提示,不是JAVA上网出现的提示。 这里已经开启! ◆4行D组第4位 照相机设置里,快门声音里出现静音的选项。 这里没有开启! ◆4行E组第1位 拍照后,手机会出现是否保存的提示。 这里没有开启! ◆5行A组第3位 开启手机支持MPKG软件的安装功能。 极度重要,这个小小的1,0给我们E680g用户造成了极大的麻烦!这里没有开启! 很遗憾,我们能随意修改的/ezxlocal下的那个文件是没有用的,系统只去找 /usr/setup/ezx_flexbit.cfg这个文件。然想改这个/usr/setup/ezx_flexbit.cfg 似乎比登天还难!我telent进手机,使出浑身懈数也搞不定,后来发现mount可以起 作用。然重启肯定就恢复以前模样了! 我们先做个小小的试验!先修改/ezxlocal的ezx_flexbit.cfg内容,就只加上 MPKG和USB网的两项功能,(3行C组第1位,5行A组第3位)更改后,把对应二进制数值 转换为十进制。显示的文件内容如下: A B C D E F G H 0 0100 1000 0000 0011 1101 0111 1100 0000 0 = 1208211392 1 0001 0110 0101 0001 0111 1000 0000 0000 1 = 374437888 2 1000 0001 1101 0111 0000 0001 1000 0011 2 = 2178351491 3 0000 0000 1001 1001 1001 1100 1111 1101 3 = 10067197 *修改 4 1111 1111 1010 1100 0000 1011 0000 0000 4 = 4289465088 5 0010 1011 1010 0010 1000 0000 0000 0000 5 = 732069888 *修改 我们修改后的ezx_flexbit.cfg文件内容如下: [SYS_FLEX_TABLE] 0 = 1208211392 1 = 374437888 2 = 2178351491 3 = 10067197 4 = 4289465088 5 = 732069888 覆盖手机上/ezxlocal/download/appwrite/setup/ezx_flexbit.cfg文件, 你去设置里看USB模式,会发现毫无变化!这时在telnet下输入以下命令: mount --bind /ezxlocal/download/appwrite/setup/ezx_flexbit.cfg /usr/setup/ezx_flexbit.cfg 再去看USB模式,就会发现多了一项--USB网,随便复制个mpkg安装文件, 没有问题!可以象java一样安装卸载,应用名称也可以去见鬼了!我们已经 看到了这个文件的效果,不过重启之后,一切又恢复原样! 我曾经想过,能不能把这个命令在手机下运行,这样大不了我每次开机点一 下,然却发现运行手机系统的是ezx用户,是绝对不支持mount命令的。这里附带 一句,如果那位能简单实现修改这个文件的方法,一定要告知! 三、方法 方法就是绝对要修改这个文件,这里使用了flashkit工具,向只读的flash写 入新文件。下载地址兼中文说明,大家可以去看一下。 http://club.ccmove.com/nclub/topicdisplay.aspx?pageno=1&boardid=1189&topicid=257967 我的做法(也有一部分复述上面贴子的内容): 1.telnet进手机,执行命令: tar zcvf /mmc/mmca1/setup.tar.gz /usr/setup 说明: 这里是把整个/usr/setup下文件打包到卡上,为了是在别的Linux下用 mkfs.cramfs制作cramfs文件,然后用flashkit重写。也可以不压缩直接 tar cvf都是一样的。不明白可以查看linux,tar的用法。 2.复制setup.tar.gz到Linux系统下,执行解压缩命令: mkdir moto cd moto tar zxvf setup.tar.gz 这时会出现很多警告,不要紧,执行完毕后会自动建立文件夹。 说明: 我使用的是虚拟机安装的RedHat Linux,通过mount -t smbfs -o username=administrator,password=yiming,ip=192.168.98.166 -l //LW/MotoShare /home/root/windows 访问Windows的完全共享文件夹MotoShare, 在Linux,Windows下都可以进行操作。 (本机名LW,IP为192.168.98.166,MotoShare是我的共享文件夹,用户名密码就 不用说了。) 3.修改usr/setup里的ezx_flexbit.cfg文件,可以根据个人喜好修改。 4.在建立的moto文件夹下,使用mkfs.cramfs进行打包,执行命令: mkfs.cramfs usr/setup liwei.cramfs 说明: 有前辈云:使用mkfs.cramfs进行打包,不是mkcramfs,否则不能telnet。 有兴趣的可以去验证下!这里的mkfs.cramfs只能打包文件夹。所以只好覆盖 setup下所有文件了。 注意:以下内容在flashkit自带的ReadMe有详细的英文说明,英文好的切莫错过! 5.把flashkit.zip解压的文件夹flashkit复制到/mmc/mmca1下,注意里面内容 最好不要改,把liwei.cramfs也复制到/mmc/mmca1下。 6.因为这里采用的是USB方法Telnet的,把USB线拔掉。 7.用loader关联运行/mmc/mmca1/flashkit/rwflash.lin,注意目录,你可以查 看下rwflash.lin的内容,就明白了。 8.将电话闲置30秒以上,长点也没事,我这里让他闲置了1分钟。 (Leave the phone alone and wait. When the screen blanks out wait 30secs longer, there's a good chance the phone entered low power mode.) 9.重新插USB然后telnet进手机,执行命令 cat /proc/rwflash_status 如果显示为"unlocked"代表成功,显示locked需要重新回到6,拔掉闲置~直到显示 unlocked,如果长时间依然是locked,关机开机,从步骤6再开始! 10.确认显示unlocked,执行cd /mmc/mmca1/flashkit 进入目录执行 ./start.sh 这时候telnet会断掉而且电话几乎所有功能会被Kill,任你怎么搞手机,也是无济 于事!但是有几个进程还在,比如mmcsdapp,这样你依然可以看到你卡上的所有内 容! 11.在Windows命令行下telnet 169.254.142.2 10000,用10000这个端口telnet。 输入root,这时就进行了flashkit虚拟的shell中,可以正常操作。 12. cat /proc/mtd 会包含类似以下内容,忘了复制我的屏幕了,这里用intoxicated 的,都差不多。不过我的e680g是六行记录。 mtd4: 000e0000 00020000 "R/W Kernel mtd5: 018e0000 00020000 "R/W RootFS (CG33) mtd6: 00020000 00020000 "R/W Setup" (CG36) mtd7: 00020000 00020000 "R/W Logo" (CG37) R/W代表可以写入,我们需要做得就是覆盖 mtd6: 00020000 00020000 "R/W Setup" (当然,通过这个方法也可以覆盖mtd5,mtd7对应内容。) 13.输入命令 flashcp -v /mmc/mmca1/liwei.cramfs /dev/mtd6 14.执行完毕,拆掉电池,断电重新开机,L/M问题便彻底解决了! 对于不能mkfs.cramfs的朋友,这里提供了我用过的打包文件,可以去友人网下载。 四、小结 如果你细心看过,现在肯定比较爽了~ 我随手安装了个mp3播放器,安装MPKG软件的路径是/mmc/mmca1/.system/ QTDownLoad。这是装在卡上的路径,显然没有必要把MPKG软件装在手机上。同样系 统也会修改/mmc/mmca1/.system/java/PlugCardDB,配置信息如下 [AppLinkRecord100000033] AllPosition = 39 BigIcon = icon.png Directory = mp3player Exec = mp3player Group = 4 Icon = icon_sm.png InstalledDate = 2006/9/1 JavaId = -1 Mime = MpkgFile = /mmc/mmca1/19425526.mpkg Name = EQ??-??? OsVersion = 1.1 Position = 5 Rotation = Shared = 2 Size = 1455K Type = 4 uid = 100000033 注意到这里的Type=4,我们Type=2时,绝对是显示“应用名称”的,Type=5是 Java软件,如果手机不支持MPKG,Type=4的应用程序虽然能显示名称,但却无法 执行的。 这时,你就可以下载一个mpkgKit.exe改名程序。(其实就是修改配置文件的 Name对应值,不过你用普通工具查看时,中文是乱码)去随意更改安装软件的名称 了,图标就更不用说了。这样需要提一下mpkgKit.exe这个工具,最好不要让它 去直接改手机的内容,速度比较慢,而且改了之后,本次telnet速度也慢了。解 决方法就是复制到电脑上,用mpkgKit.exe改完再复制回去。 还有关于XXX.desktop这个文件,只是在MPKG安装时由系统读取罢了,安装就 没有任何作用了,更改图标名称只需修改PlugCardDB这个配置文件。 五、彻底解决LM后,我对于MPKG的管理方法,供大家参考。 PlugCardDB文件的有关配置信息。 [AppLinkRecord100000001] AllPosition = BigIcon = liwei.png Directory = ../../../../mmc/mmca1/soft/liwei Exec = liwei Group = 4 Icon = liwei.png InstalledDate = JavaId = -1 Mime = MpkgFile = Name = è????????è?? #脚本加载 OsVersion = Position = 17 Rotation = Shared = 0 Size = Type = 4 uid = 100000001 [AppLinkRecord100000002] AllPosition = BigIcon = app.png Directory = ../../../../mmc/mmca1/soft/shortcuts Exec = app.sh Group = 4 Icon = app.png InstalledDate = JavaId = -1 Mime = MpkgFile = Name = ?o???¨?????? #应用综合 OsVersion = Position = Rotation = Shared = 0 Size = Type = 4 uid = 100000002 [AppLinkRecord100000003] AllPosition = BigIcon = game.png Directory = ../../../../mmc/mmca1/soft/shortcuts Exec = game.sh Group = 4 Icon = game.png InstalledDate = JavaId = -1 Mime = MpkgFile = Name = ???????????? #游戏综合 OsVersion = Position = Rotation = Shared = 0 Size = Type = 4 uid = 100000003 [AppLinkRecord100000004] AllPosition = BigIcon = player.png Directory = ../../../../mmc/mmca1/soft/shortcuts Exec = player.sh Group = 4 Icon = player.png InstalledDate = JavaId = -1 Mime = MpkgFile = Name = ?a?????????? #媒体综合 OsVersion = Position = Rotation = Shared = 0 Size = Type = 4 uid = 100000004 /mmc/mmca1/soft/liwei/liwei的内容 #!/bin/bash exec $2 & /mmc/mmca1/soft/shortcuts/app.sh的内容 #!/bin/bash export QTDIR=/usr/lib/ezx export LD_LIBRARY_PATH=$QTDIR/lib export EZX_RES_FONT_PATH=$QTDIR/lib/fonts export MYSTUFF_DATA_PATH=/mmc/mmca1/exe/app chmod 444 $MYSTUFF_DATA_PATH cd /usr/SYSqtapp/mystuff ./mystuff chmod 777 $MYSTUFF_DATA_PATH 其他几个sh都差不多,只是路径不同罢。而这些路径就是存放一些MPKG 的运行脚本。这样做的目的,就是考虑菜单资源有限。当然你如果有能力完 全可以自已在菜单做个更漂亮的控制面板,比起来这里的方法要简单多了。 您对本贴的看法:(0) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 4楼 发表于 2006-12-6 13:52 深度剖析E680G应用五.Telnet与主题 草木瓜 20060903 相关资源下载 http://play.younet.com/view.php?tid=18578 一、前言 这两方面的内容比较少,而且网上资料也很多,毕竟E680上市都两三年了, 再怎么写恐怕少不了拾人牙慧。所以这才做一些总结,本来这应该在介绍Loader 之后就详细介绍。相关下载文件,可以访问友人网。 http://play.younet.com/view.php?tid=18578 二、Telnet E680G本身提供了大容量模式和Modem模式两种方式连接电脑,此外还可以 通过读卡器读取E680G的扩展卡(MMC/TF/SD)之类。但是不管什么方式,都不能 完全浏览手机操作系统的文件。这时我们就需要telnet来解决问题。 Telnet是远程登录的一种程序,它可以让您的电脑通过网络登录到网络另 一端的电脑上,甚至还可以存取那台电脑上的文件。 具体详细的方法如下: 1.安装配置Loader 参见《深度剖析E680G应用一.所谓的Loader》 2.下载USBLIN.rar文件,解压缩出usbnet.lin文件,并复制到扩展卡上。 其实就是如下内容: #!/bin/bash echo MotNet > /proc/motusbd 3.默认安装btblan-demo-12b9-f001-07-05-2004.exe 这个文件(文件已上传资源帖),路径为C:\Program Files\Belcarra\USBLAN,再用usblan.rar 的内容覆盖USBLAN文件夹下内容。 4.手机设置成Modem方式连接电脑后,如果是第一次连接,可能会提示安装Moto Modem 的驱动程序,安装好,至于驱动,只要你安装了光盘自带的手机管理软件,系统会自动找 到并安装,这个驱动不安装也可。再用Loader关联打开手机上的USB.lin。这时电脑会提示安装新驱 动Usb Lan,把路径指向C:\Program Files\Belcarra\USBLAN即可。 5.在命令行输入telnet 169.254.142.2,提示了一些信息之后,会要求输入用户名密码。 这时输入root用户名,密码为空。回车确认!会出现#的提示符,这里就是Linux环境了。 并支持常用Shell命令。 6.打开一个浏览器窗口,在地址栏直接输入\\169.254.142.2\system,就可以看到手机 里面所有内容了。 三、蓝牙无线Telnet 1.准备电脑的USB蓝牙适配器 2.安装蓝牙适配器驱动程序,光盘一般会自带。这里使用的是IVT BlueSoleil 1.6.3驱动, 需要破解软件,否则有5MB的限制,可以上网搜索一下相应版本的破解。 3.驱动安装重启后,运行会提示插入蓝牙设备,按提示操作。如果插了USB蓝牙适配器,没 有反应,或者设备无效,多半是你的适配器是便宜货,多试几次,这个口不行换个另外的。 有其他USB设置运行正常的(如鼠标),可以先拔下,然后迅速在拔下的USB口插上蓝牙适配器。 4.成功后就可以搜索蓝牙设备了,不过这时候手机须要开启蓝牙,并设置为可被查找。 5.找到蓝牙设置后,主界面上会显示E680I,点击右键,先创建绑定,成功之后会有两个服务 内容,一是串口连接,另外是名片交换之类。无线Telnet需要用串口连接。 6.点击创建串口连接,手机会提示,是否接收来自XXX的连接,点击是,完成连接,系统会 提示通过COMn建立连接。这时蓝牙部分的工作就完成了。 7.在网络连接中创建一个新连接->设置高级连接->直接连接的其他计算机->来宾->随便输入 计算机名->选择刚才串口连接的COM端口->完成。 8.在建立的连接右键属性->配置,在最高速度里选择最大921600。在网络->TCP/IP->属性-> 高级里面 把"在远程网络使用默认网关“勾去掉,否则就不能上因特网了。保存,完成。 9.最后在手机里建立PPP服务器,将脚本PPP.lin复制到手机上。内容如下: #注释掉的,是我自已加的信号灯提示。可以看出这里建立的PPP服务,主机是192.168.1.100 客户端地址是192.168.1.166,等你一会连接上,在Windows命令行输入ipconfig就可以看到。 这里不仅要启动pppd服务,还要启动inetd,smbd服务,否则连接上随能ping上,但telnet无 效。 #! /bin/bash devname=`cat /tmp/bt_spp_devname` if [ -c $devname ] then #/mmc/mmca1/soft/public/led 2 if [ ! -d /etc/ppp/peers ] then mkdir /etc/ppp/peers fi echo "$devname 921600 192.168.1.100:192.168.1.166 noauth crtscts local connect 'sleep 1; echo -n CLIENTSERVER' logfile /tmp/ppp.log" > /etc/ppp/peers/myhost start-stop-daemon --start -m -p /var/run/btppp.pid -x /usr/bin/pppd -- call myhost start-stop-daemon --start -c root -x /usr/sbin/inetd start-stop-daemon --start -c root -x /usr/sbin/smbd sleep 1s else #/mmc/mmca1/soft/public/led 1 sleep 1s fi #/mmc/mmca1/soft/public/led 0 10.点击运行后,telnet 192.168.1.100即可,一次不行,可以多运行这个脚本几次,每次断 开连接中,这个服务lin脚本都必须重新运行。蓝牙无线Telnet时,最好能断开USB Telnet 否则可能会有一些问题。 四、主题 下载口碑很好的主题就不用担心死机之类的问题!一般来说切换的新安装主题, 画面没有异常现象就不会导致死机并且开不了机。 安装主题就是复制一些主题文件到手机上。 主题文件可人为划分为主题配置文件和主题资源文件。配置文件都很小,几百字节。 资源文件相对就大多了。 主题配置文件(通常扩展名是dhm,phm)须放在/ezxlocal/download/appwrite/setup下, 这样在配色方式就可以看到新主题。这是文件的配置内容及说明。 [THEME_CONFIG_TABLE] ThemeIconDir = /diska/preload/themes/maiter/ ThemeName = Maitersoft Vista theme for Moto E680i ThemeWallpaperFile = /diska/preload/themes/maiter/maiter.jpg ThemePowerDownImage = /diska/preload/themes/maiter/maiter_off.gif ThemePowerUpImage = /diska/preload/themes/maiter/maiter_on.gif ThemeTextSize = 0 ThemeSkinFile= /diska/preload/themes/maiter/maiter.skn ThemeLogoIcon = /diska/preload/themes/maiter/maiterlogo.jpg [THEME_COLOR_PALETTE_TABLE] ThemeBase = 0 0 0 ThemeBrightText = 0 0 0 ThemeButton = 0 0 0 ThemeButtonText = 255 255 255 ThemeForeground = 0 0 0 ThemeHighlight = 179 179 179 ThemeHighlightedText = 20 20 20 ThemeText = 0 0 0 THEME_COLOR_PALETTE_TABLE不要修改,具体可以参见 自已制作主题详细教程。 ThemeIconDir ICON资源文件的位置 ThemeName 主题名 ThemeWallpaperFile 墙纸 ThemePowerDownImage 关机画面 ThemePowerUpImage 开机画面 ThemeSkinFile 主题的皮肤 ThemeLogoIcon 主题Logo,即在你选择配色方案时,预览到的图片 这些的位置就随意了,不过需要于实际文件对应。包括.ezx,.skn和开关机画 面,主题Logo,主题墙纸。 根据主题资源文件的位置不同,就延伸出不同的叫法。 内存版:主题资源文件放在/ezxlocal下 显然有3M的限制,其他没有任何问题 手机版:主题资源文件放在/diska下,不怕多了会死机之类,但是显然不能大容 量连接电脑了。 卡版:主题资源文件放在/mmc/mmca1下,也不能大容量连接,更不能弹出SD卡。 这里推荐放在/diska下,如果有了读卡器,大容量连接电脑其实作用了也就不大了。 自已制作主题详细教程。 http://bbs.imobile.com.cn/viewth ... ge=1&highlight= 您对本贴的看法:(0) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 5楼 发表于 2006-12-6 13:53 深度剖析E680G开发一.所谓的交叉编译环境 草木瓜 相关资源下载 http://play.younet.com/view.php?tid=18578 20060906 一、前言 前面文章涵盖的内容对普通人来说应该都比较容易理解和运用,然而这 仅仅只能说明你会刚会用罢了,从本文开始,我们需要更深入一步,去探讨 E680G的操作系统的开发环境,自然内容也变专业了。 很遗憾目前网上有关的资料都不尽如人意,也许是水平太高了吧,反而 写出来的文章让人看了一头雾水。为了能让更多人能跨过这个门槛,我会用 较多的篇幅来介绍相关专业知识。另外最好有真实的Linux环境,文中操作 皆使用虚拟机RedHatLinux9。 希望看完这篇文章得出的结论是:搭建E680交叉编译开发环境并不难! 二、交叉编译理论准备 我们经常会说平台,平台出现的根源要从处理器(CPU)说起,不同的CPU 采用不同的指令集。所谓指令集,则是CPU中用来计算和控制计算机系统的一 套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路 相配合的指令系统。 E680手机系列采用的是Inter XScale处理器,基于ARM v5TE体系结构, 扩展了ARM指令集的核心,本质还是ARM处理器。这和我们平时经常接触PC机 的CPU是不同的,PC机大多采用Inter X86的指令集。 ARM处理器最大的特点就是:功耗低,应用方案灵活,可以方便为多媒体 信号添加指令集等。目前来说几乎所有的手持操作系统包括智能手机都采用了 ARM架构进行设计。 我们如果要在E680系列所采用的操作系统----MontaVista Linux下开发, 就需要一个编译器能把C程序代码转换为兼容ARM指令集的机器语言。这种编译 就称为交叉编译。 要深刻理解这个概念,我们再对比一下C,Java这两种语言。 Java号称Compile once,run everywhere。即编译一次到处运行。事实 也确实如此,Java编译生成的是字节代码,然后由各个平台的Java虚拟机解 释执行。实际上在E680G上,J2ME的JAR包是由/usr/SYSjava/kvm解释执行的。 Java是通过提供各类平台的虚拟机程序来实现平台无关性。这样也很大的牺 牲了执行效率。 C语言则不一样,主要特点就是接近低层,可根据不同处理器生成高效的 机器代码。适合做复杂的运算和实时的控制。所以针对C语言,会有很多不同 平台的编译器负责将代码直接编译成高效的机器指令。 说到这里,我们显然明白了:普通Linux PC机上的GCC编译器编译的可执 行程序复制到E680上是不能够被执行的。要在E680平台上进行开发,需要构造 一个能兼容ARM的GCC了,这就是所谓的交叉编译环境。 三、构造E680交叉编译环境 这里我们使用很简单的一个构造方法。在http://lsb.blogdns.net/ezx-crosstool 下载ezx-crosstool-0.5.tar.bz2文件,这个工具是由个人整理的,去掉了与ARM 无关的很多脚本,并且限定了需要编译的文件版本,使用起来比较简单。 本机新建了一个用户gcc,准备用于编译,root用户会提示禁止操作的。 这里使用的是在/home/gcc目录下用gcc用户解压: bunzip2 ezx-crosstool-0.5.tar.bz2 tar xvf ezx-crosstool-0.5.tar 系统会自动生成/home/gcc/ezx-crosstool-0.5这个目录。 在ftp://ftp.gnu.org/pub/gnu下载如下四个文件,且必须是如下版本: binutils-2.15.tar.bz2 一组开发工具,包括连接器、汇编器 和其他用于目标文件和档案的工具 gcc-3.3.6.tar.bz2 GCC编译器的源代码 glibc-2.3.2.tar.bz2 提供系统调用和基本函数库 glibc-linuxthreads-2.3.2.tar.bz2 用于支持POSIX线程的函数库 在http://www.kernel.org/pub/linux/kernel/v2.4/下载如下一个文件: linux-2.4.26.tar.bz2 Linux核心源代码 全部下载后,放在/home/gcc/ezx-crosstool-0.5/downloads下,打开 /home/gcc/ezx-crosstool-0.5/build.sh文件,内容如下: #!/bin/sh set -ex CROSSTOOL_DIR=`pwd` TARBALLS_DIR=$CROSSTOOL_DIR/downloads RESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c++" export GCC_LANGUAGES ... 详细内容以后会解释,这里只注意RESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt 这句,这是说明编译后的路径,可以自定义修改。 如: RESULT_TOP=/home/gcc/arm 到这里,准备工作就结束了。 cd /home/gcc/ezx-crosstool-0.5 ./build.sh 我使用的笔记本(512M+PM1.7G)+虚拟机,大概不到两个小时。完成后在系统环境 PATH添加新路径内容。 export PATH=$PATH:/home/gcc/arm/gcc-3.3.6-glibc-2.3.2/arm-linux/bin 四、测试环境 hello.c #include int main() { float myvalueA=1.9; float myvalueB=2.8; printf("Hello!My E680!\n"); printf("Testvalue:%f\n",myvalueA+myvalueB); return 0; } 输入:arm-linux-gcc -o moto hello.c,生成可执行文件,这里在Linux下显 然是不能执行的,复制到你的手机上,在telnet下进入可执行文件所在目录,输入 命令:./moto,显示: Hello!My E680! Testvalue:4.700000 可以看到正常显示,而且也没有所谓的浮点型Bug。这里我们没有使用图形化的 内容,所以不需要设置环境变量,以后会有更具体的例子说明,现在交叉编译环境 已成功搭建,终于迈开第一步了。我们也将在下文做进一步的讨论。 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1214750 您对本贴的看法:(0) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 6楼 发表于 2006-12-6 13:54 深度剖析E680G开发二.交叉编译BusyBox,图形化程序 草木瓜 20060917 一、前言 很多人看到这个剖析系列,觉得难了,其中不乏热衷于刷机的人。刚刚接触 E680g的普通人理解起来固然有些困难,然对于一个经常刷来刷去的”高手“,就 说不过去了。是人就知道,“世上无难事,只怕有心人”,这句讲烂了的千古真理! 现成的东西学起来有什么难的,学不会那是没耐心或者不想学,至于说真正 难得东西,那是在你以后的变通和创新。 应用系列的文章一般人都可以做得到,开发方面的知识深度就远远超出普通 人能接受的范围,这里面讲得内容并不难,只是想要灵活得扩展起来,没有编程 设计经验是不可能的。 我们在前面使用了很简单的方法构造了一个交叉编译环境,上手比较容易。 在些基础上,我们来实际编译一些实实在在的东西。 二、重要提示 文章难免有疏漏,有问题可查看: 全系列文章地址:http://blog.csdn.net/liwei_cmg 文章相关的重要资源的下载地址:http://play.younet.com/view.php?tid=18578 三、BusyBox的编译 Busybox是一个集成了多个最常用linux命令和工具的软件。首先下载Busybox 源代码,这里使用的是busybox-0.60.5.tar.gz版本。 1.在Linux解压缩,或者在Windows下解压缩复制到Linux里面 tar xcvf busybox-0.60.5.tar.gz 2.cd busybox 进入目录,查看Makefile文件,实在比较复杂,不过确是了解源代码 结构的最好方法!对这个文件作如下两处修改。 a.将84行下面这6行内容 # If you are running a cross compiler, you may want to set this # to something more interesting, like "powerpc-linux-". CROSS = CC = $(CROSS)gcc AR = $(CROSS)ar STRIP = $(CROSS)strip 修改为 # If you are running a cross compiler, you may want to set this # to something more interesting, like "powerpc-linux-". CROSS = /home/gcc/arm/gcc-3.3.6-glibc-2.3.2/arm-linux CC = $(CROSS)/bin/arm-linux-gcc AR = $(CROSS)/bin/arm-linux-ar STRIP = $(CROSS)/bin/arm-linux-strip 注意:CROSS内容后面不可有空格,结合CC,AR,STRIP的内容,一定要保证是你 自己机器上arm-linux-gcc,arm-linux-ar,arm-linux-strip的位置,这里使用的是上 篇文章里编译的路径。 可以看出这里是为了指定使用的编译器。 b.将108行如下内容 #LDFLAGS+=-nostdlib #LIBRARIES = $(LIBCDIR)/lib/libc.a -lgcc #CROSS_CFLAGS+=-nostdinc -I$(LIBCDIR)/include -I$(GCCINCDIR) #GCCINCDIR = $(shell gcc -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp") 修改为 #LDFLAGS+=-nostdlib #LIBRARIES = $(LIBCDIR)/lib/libc.a -lgcc CROSS_CFLAGS+= -I$(CROSS)/arm-linux/include -I$(CROSS)/arm-linux/sys-include#-I$(GCCINCDIR) #GCCINCDIR = $(shell gcc -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp") 这里指定的是使用头文件。 3.修改后保存,编译 在busybox路径下,执行命令make all,如有错误,多半是上面所述Makefile文件的问题, 修改后先执行make clean再执行make all。 成功之后,最后会显示: BusyBox Documentation mkdir -p docs pod2text docs/busybox.pod > docs/BusyBox.txt mkdir -p docs pod2man --center=BusyBox --release="version 0.60.5" \ docs/busybox.pod > docs/BusyBox.1 pod2html --noindex docs/busybox.pod > docs/BusyBox.html 4.将busybox路径下编译成功的busybox文件,复制到手机,telnet,并进入 busybox所在目录,输入类似以下命令: ./busybox --help ./busybox lsmod ./busybox date ... 没有任何问题。 我们telnet下输入这个命令,在Busybox所在目录建立testbox.lin文件 ./busybox echo `pwd`/busybox date \> `pwd`/date.txt > testbox.lin 在E680g上用Loader关联打开后,Busybox所在目录下会生成包含当前日期的 date.txt文件。 四、利用dev-ezx工具开发图形化程序 1.下载dev-ezx-0.2.0工具,解压缩复制到Linux下。可以看到一个英文说明 文件BUILD-INSTRUCTIONS,其实里面讲得很清楚,这里用中文重复一下。 2.telnet进入e680g,将/usr/lib打包,复制到Linux解开,把解开的文件复制 dev-ezx-0.2.0的lib目录下。 tar cvf lib.tar /usr/lib 3.进入dev-ezx-0.2.0/moc目录上,执行命令make all编译moc。 4.进入dev-ezx-0.2.0/helloworld下,执行命令make,此时需要设置好PATH环境 变量,否则会系统会找不着arm-linux-g++。 5.编译成功后,将helloworld复制到手机上。图形化的程序需要设置QT等环境 变量,如下: export QTDIR=/usr/lib/ezx export LD_LIBRARY_PATH=$QTDIR/lib export EZX_RES_FONT_PATH=$QTDIR/lib/fonts cd /mmc/mmca1 ./helloworld 即可看到运行效果,关于QT图形化编程方面,就需要查阅相当多的资料了。 五、最后 通过这两个例子,我们清楚有了交叉编译环境,才能谈得上扩展E680的功能。 您对本贴的看法:(0) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 7楼 发表于 2006-12-6 13:55 而在一般采用Qt嵌入式操作系统的架构如下: Linux Embedded Kernel + Framebuffer + Qte + Qtopia 我们再来看E680g操作系统的架构: MontaVista Linux Kernel + Framebuffer + Qte + ezx图形库 一、前言 虽然是E680系列的开发环境,其实就是嵌入式方面的知识。在上文详细了解了 E680g系统结构,图形化发展历程,到这篇文章就要实实在在去做了。 最早移植成功的是一位外国人,我也是通过阅读他的文章了解到OPIE(是个linux下的图形接口)的移植过 程,不过他写的文章比较简练,接受起来比较困难。下面是英文原文: http://marcus.bluetroll.se/e680/ 二、重要提示 为了方便更好的理解本文,提供下面链结。 E680应用开发全系列的文章地址:http://blog.csdn.net/liwei_cmg 文章相关的重要资源的下载地址:http://play.younet.com/view.php?tid=18578 三、移植OPIE操作系统的思路 我们前面提到OPIE基于标准的Qte/Qtopia,Motorola的E680系列也是基于Qte的, 但这两者会有所不同,具体什么不同我们也很难得知。Motorola目前仅开放了E680 系列的Linux内核代码,而Qte和上层的ezx图形框架却没有公开发布。这一点着实让 人非常之不爽。所以我们在移植OPIE时,需要编译一下标准Qte的Lib库,然后使用 这个Lib库,再交叉编译OPIE。 移植OPIE操作系统本身可能意义并不大,但借此可以深入操作系统内部去完成 Linux Kernel + Qte + OPIE 的整体认识,要知道这些是全部开放源码的。 在《深度剖析E680G开发一.所谓的交叉编译环境》中所介绍的开发图形化程序 的方法,是使用的A760系列的SDK,其实就是把A760的头文件复制过来,再加上E680 本身的Lib文件拼凑而成。(本文的资源文件中提供了这个SDK的英文文档)。这固然 也是目前为止比较好的另一种开发方法。 四、构造交叉编译环境 在前面已提供了很简便的交叉编译环境构造方法,为了更好的进一步理解交叉 编译环境的构造方法,我们结合标准的crosstool再次构建编译环境。 1.下载crosstool(搭建交叉编译环境的工具)。如下网址是两个不同版本,其实 用哪个都是差不多的,细节内容可以访问http://kegel.com/crosstool/。这篇使用 的是crosstool-0.28-rc37.tar.gz。root http://kegel.com/crosstool/crosstool-0.42.tar.gz http://kegel.com/crosstool/crosstool-0.28-rc37.tar.gz 2.在Linux下或者虚拟机Linux下解压缩,为了方便目录管理,我们使用/home /gcc/toolchain目录,解压缩crosstool-0.28-rc37.tar.gz。 tar zxvf crosstool-0.28-rc37.tar.gz。 3.在crosstool-0.28-rc37文件夹下主要有以下几类文件: arm.dat arm-iwmmxt.dat i686.dat ... arm.config i686.config ... 打开一看,显然是指定运行环境的指令集和一些配置参数。对E680系列只需要 使用ARM相关的,其他的无视。 gcc-3.4.0-glibc-2.1.3.dat gcc-3.4.0-glibc-2.2.5.dat ... 这一类自然是编译GCC的版本参数,查看内容可知,其限定了binutils,gcc, glibc和linux kernel的版本。这些内容含义在《E680G开发一》已做了说明。 注意:我在使用ezx-cross工具进行交叉编译时,出现了一些错误,是关于glic 的,不过并未影响使用。我在RedHat中gcc的版本是3.3.2,ezx交叉编译限定 的是gcc-3.3.6,我怀疑与这个版本有关,具体原因还不能证实。后来用 crosstool-0.28-rc37编译,使用了gcc-3.3.2,编译通过且没有发现任何问题。 demo-arm.sh demo-arm-iwmmxt.sh demo-i686.sh ... 这些则是编译交叉编译环境的脚本了。 4.下载本文章相关的资源文件toolchain.rar,解压缩将对应内容复制到 crosstool-0.28-rc37文件夹下。里面只有三个文件: gcc-3.3.2-glibc-2.3.2.dat arm.dat arm.sh gcc-3.3.2-glibc-2.3.2.dat文件把限定的Linux内核版本从原来的linux-2.6.8 修改为linux-2.4.20,推测之所以进行这个修改是因为原来的版本组合存在兼 容性问题,crosstool-0.42中这个文件gcc-3.3.2-glibc-2.3.2.dat,已经修正。 arm.dat整合了编译ARM的相关参数。 arm.sh是执行编译的脚本。 5.下载本文章相关的资源文件gcc-3.3.2-arm-softfloat.patch.rar,这是一个 浮点运算的补丁。将解压缩的gcc-3.3.2-arm-softfloat.patch复制到 crosstool-0.28-rc37/patches/gcc-3.3.2下。再把crosstool-0.28-rc37/patches/gcc-3.3.2/ 下gcc-3.3.2-arm-bigendian.patch 移动到crosstool-0.28-rc37/patches/gcc-3.3.2/feature/下。 6.根据gcc-3.3.2-glibc-2.3.2.dat相关内容下载,下载地址同《E680G开发一》 所述。并在crosstool-0.28-rc37下创建目录downloads,将这些文件移过去。 binutils-2.15.tar.bz2 gcc-3.3.2.tar.bz2 glibc-2.3.2.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2 linux-2.4.20.tar.bz2 7.设置环境变量export TOOLCHAIN_DIR=/home/gcc/toolchain 修改arm.sh中TARBALLS_DIR=$TOOLCHAIN_DIR/crosstool-0.28-rc37/downloads 修改arm.sh中RESULT_TOP=$TOOLCHAIN_DIR 这两个一是指定编译使用相关包的位置,另外则是指定编译后的路径。完成这些后, 运行arm.sh即可以构造交叉编译环境了。 8.完成加入PATH环境变量,即可测试编译环境了。 export PATH=$PATH:$TOOLCHAIN_DIR/arm-linux/gcc-3.3.2-glibc-2.3.2/bin 五、编译QTE 1.在本文资源贴中下载e680-qt.rar,把解开的.h头文件和lib文件复制到 $TOOLCHAIN_DIR/arm-linux/gcc-3.3.2-glibc-2.3.2下的对应目录。这头文件 其实就是Linux PC机自带的头文件,而lib文件就是E680上的库文件。 2.在ftp://ftp.trolltech.com/qt/source/qt-embedded-2.3.10-free.tar.gz 下载QTE。关于这些路径,不行可以在Google搜索一下,不过国内的网站提供下载的 不多。其实对于qt编译的相关配置,自带的英文文档还是比较详细的。 3.在/home/gcc/toolchain下解压缩并设置环境变量 export QTDIR=$TOOLCHAIN_DIR/qt-2.3.10 4.在qt-2.3.10\configs目录下修改linux-arm-g++-shared文件,我们会在下面 的配置中指定使用arm平台。在文件中查找如下内容: SYSCONF_LINK = arm-linux-gcc SYSCONF_LINK_SHLIB = arm-linux-gcc 均改为 SYSCONF_LINK = arm-linux-g++ SYSCONF_LINK_SHLIB = arm-linux-g++ 否则在编译中会出现链接错误,QT程序都是基于C++的,arm-linux-gcc不可能 编译成功! 5.在$QTDIR下运行以下命令,配置编译参数,可以看出平台是arm。 ./configure -qconfig all -depths 8,16 -xplatform linux-arm-g++ -thread -sm -qvfb -qt-libpng -system-jpeg -gif -qt-zlib -no-xft -keypad-mode 对相关参数不明白的地方,可以通过./configure -help查看,实在不行,分析 configure本身这个文件,相信你一定受益菲浅。 运行完这个命令后,相关Makefile文件都会建立好了。 注意:在QTE编译过程中,先会编译moc可执行文件,并会放在$QTDIR/bin下。 (moc(Meta Object Compiler)是QT工具的工具,该工具是一个C++预处理程序, 它为高层次的事件处理自动生成所需要的附加代码。)此外还需要uic可执行程序 用于将Designer设计的界面文件(*.ui)转换成为相应的C++文件(*.cpp和*.h), 然后让gcc进行编译。这个工具不能却不能顺利编译,原因是QTE编译过程中,也把 这个文件也用arm-linux-gcc编译了,不能在Linux PC机上运行了。解决方法有两个 直接复制Linux的uic文件到$QTDIR/bin下,或者手工去$QTDIR/tools/designer/uic 编译下uic,再复制过去。或者去http://www.vanille.de/tools/uic-qt2下载uic-qt2 改名并复制到$QTDIR/bin下。 6.在$QTDIR下输入make,执行编译。 7.编译成功后,随便复制个example下的例子,注意别忘了连编译好的库文件一起 复制 $QTDIR/lib,设置好环境变量,即可在E680G上运行。 如: #!/bin/bash export QTDIR=/usr/lib/ezx export LD_LIBRARY_PATH=$QTDIR/lib:`pwd` export EZX_RES_FONT_PATH=$QTDIR/lib/fonts ./aclock -qws 即可以看到效果。 六.写在最后 本文关于QTE编译的方法说得比较简单,要能轻松解决编译产生的问题,必须对Linux 下编译方法有一定的了解,加之一点点耐心去阅读自带文档,并不难。QT本身的教程也是 熟悉学习QT的最好捷径。 从gcc到cross-tool再到Qte,其实整个过程都是完全开放的,可以任你去深入研究, 主观的能动性是最重要的,文章的作用只是稍微点一下有这么一回事~ 在下文,我们会做最后一步工作,编译OPIE。 [ 本帖最后由 wheel 于 2006-12-6 14:13 编辑 ] 您对本贴的看法:(0) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 8楼 发表于 2006-12-6 13:57 一、序 一个偶然的想法,把在夏新E600出现Segmentation Fault的QT程序放在 MotoE680上运行,居然也出现了Segmentation Fault。我突然意识到问题可 能不是原先设想的那么复杂,我简单的看下QT的Makefile,又经一系列测试, 发现造成Segmentaion Fault的直接原因居然是编译参数。 二、重要提示 为了方便更好的理解本文,提供下面链结。 全系列的文章地址,手机应用开发专栏:http://blog.csdn.net/liwei_cmg 相关的重要成果的下载地址:http://play.younet.com/view.php?tid=24045 三、QTE程序的运行条件 大多数Linux手机都是基于QTE。运行QTE须要两个条件,一是lib文件,由 LD_LIBRARY_PATH指定,另一个就是fontdir了,而fontdir要QTDIR指定。也就是说 QTDIR/lib/fonts这个目录必须存在。可以看下面环境变量的实例: Moto E680 #!/bin/bash export QTDIR=/usr/lib/ezx export LD_LIBRARY_PATH=$QTDIR/lib:`pwd` export EZX_RES_FONT_PATH=$QTDIR/lib/fonts exec ./$* 飞利浦 968 , 夏新 E600 #!/bin/sh export CECHOME=/mnt/cellon export QTDIR=$CECHOME/qt export CECDIR=$CECHOME/cec export LD_LIBRARY_PATH=/mnt/sd/e600/lib:$CECHOME/lib:$CECDIR/lib:$QTDIR/lib:LD_LIBRARY_PATH exec ./$* 可见纯粹谈运行条件是很简单,QTE运行方式就不那么容易了。 四、QTE程序的运行方式 先举一些实际例子来分析: A.在夏新E600运行飞利浦968的Qnes模拟器 #!/bin/sh export CECHOME=/mnt/cellon export QTDIR=$CECHOME/qt export QWS_KEYBOARD=TTY export CECDIR=$CECHOME/cec export LD_LIBRARY_PATH=/mnt/sd/e600/lib:$CECHOME/lib:$CECDIR/lib:$QTDIR/lib:/mnt/doc/ibm/jvm/bin:$LD_LIBRARY_PATH export QWS_DISPLAY=:1:/dev/fb0 /mnt/doc/cec_local/bin/qnesexe -qws 2>/mnt/sd/e600/log/qnesrunerror.txt 描述:模拟器与手机原有系统有按键和屏幕冲突。即发生键盘和屏幕事件时 两者都接受事件。游戏会花屏。 #!/bin/sh export CECHOME=/mnt/cellon export QTDIR=$CECHOME/qt export CECDIR=$CECHOME/cec export LD_LIBRARY_PATH=/mnt/sd/e600/lib:$CECHOME/lib:$CECDIR/lib:$QTDIR/lib:/mnt/doc/ibm/jvm/bin:$LD_LIBRARY_PATH /mnt/doc/cec_local/bin/qnesexe 2>/mnt/sd/e600/log/qnesrunerror.txt 描述:模拟器运行一切正常。模拟器优先接受键盘和屏幕事件。 B.摩托罗拉E680运行普通的QTE程序 使用E680自带库编译: arm-linux-g++ helloqt.cpp -o helloqtezx -fno-exceptions -fno-rtti -DQWS -Wall -g \ -I/home/gcc/src/dev-ezx-0.2.0/include/qt -I/home/gcc/src/dev-ezx-0.2.0/include/ezx \ -L/home/gcc/src/dev-ezx-0.2.0/lib -L/home/gcc/src/dev-ezx-0.2.0/lib/ezx/lib \ -lezxappbase-xscale-r -lqte-mt-xscale-r \ -lezxjpeg-xscale-r -lezxnotification-xscale-r #!/bin/bash export QTDIR=`pwd` export LD_LIBRARY_PATH=$QTDIR:/usr/lib/ezx/lib export EZX_RES_FONT_PATH=$QTDIR/fonts exec ./helloqtezx 描述:QTE程序运行完全正常,可以拖动最大化最小化。 使用自编译的QTE(qt2.3.10)库进行编译(VFP): arm-linux-g++ -c -I$QTDIR/include -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG -o helloqt.o helloqt.cpp arm-linux-g++ -L$QTDIR/lib -Wl,-rpath,$QTDIR/lib -o helloqtvfp helloqt.o -lqte -lm #!/bin/bash export QTDIR=`pwd` export LD_LIBRARY_PATH=$QTDIR:/usr/lib/ezx/lib export EZX_RES_FONT_PATH=$QTDIR/fonts exec ./helloqtezx -qws 描述:稍微操作下菜单,QTE程序就不见了,更不用谈最大化最小化和拖动了。 [原因分析] 我们可以初步理解,基于Qte的手机系统有一个Qte Server,手机系统的每个程 序都是基于这个Qte Server,手机自带的lib文件则封装了基于Server的应用函数。 我们看A例子,如果声明了Qws相关的环境变量,系统要求必须通过独立的Qte Server 来运行Qnes,如果不加-qws参数,则提示: QSocket::writeBlock: Socket is not open QSocket::writeBlock: Socket is not open QSocket::writeBlock: Socket is not open QSocket::writeBlock: Socket is not open No Qt/Embedded server appears to be running. If you want to run helloqtvfp as a server, add the "-qws" command-line option. 加上-qws后,以Server态运行,这样肯定于原因手机已有的Qte Server相冲突, 一旦发生按键屏幕事件,两个Server皆接受并处理,所以A例中的花屏也不难理解了。 再看B例,使用手机自带的lib文件,自然会让QTE程序运行于原先的Qte Server 上,自己编译的Qte库文件显然需要重新以Qte Server态启动,一点就没,是很正常 的。 所以写E680软件也好,写E600,968的Qte软件也好,最好能用本身的lib文件, 否则会与原有系统冲突,不能正常运行。 五、搭建编译环境 前面文章已经说过搭建交叉编译环境的要点,下面列出我实际使用的参数文件。 我使用的是cross-tools 0.42,做交叉编译环境没有比这个工具更省事的了。 主脚本 liwei.sh #!/bin/sh set -ex TARBALLS_DIR=$TOOLCHAIN_DIR/crosstool-0.42/downloads RESULT_TOP=$TOOLCHAIN_DIR export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c++" export GCC_LANGUAGES mkdir -p $RESULT_TOP eval `cat liwei.dat liweicmp.dat` sh all.sh --notest echo Done. 编译参数配置 liwei.dat KERNELCONFIG=`pwd`/arm.config TARGET=arm-linux TARGET_CFLAGS="-O" GCC_EXTRA_CONFIG=" --with-float=soft --with-cpu=xscale --enable-cxx-flags=-mcpu=xscale" GLIBC_EXTRA_CONFIG="--without-fp" 编译源文件配置 liweicmp.dat BINUTILS_DIR=binutils-2.15 GCC_DIR=gcc-3.4.0 GLIBC_DIR=glibc-2.2.5 LINUX_DIR=linux-2.4.19 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.2.5 gcc-3.4.0 Patch去除了一些冲突项,glibc,kernel等其余patch为cross-tool 默认自带 gcc-3.3.3h-ppc-asm-spec.patch gcc-3.4.0-arm-softfloat.patch gcc-3.4.0-pr14808-refix.patch gcc-3.4.0-ultrasparc3-default64.patch pr15647-fix.patch pr13250-fix.patch 增加的gcc-3.4.0-arm-softfloat.patch可以去网上搜索,不过有不同的版本。 这里列出我的全部内容(比较夸张,复制建立个patch文件即可,注意要是Unix格 式): diff -urNd gcc-3.4.0-orig/gcc/config/arm/coff.h gcc-3.4.0/gcc/config/arm/coff.h --- gcc-3.4.0-orig/gcc/config/arm/coff.h 2004-02-24 15:25:22.000000000 +0100 +++ gcc-3.4.0/gcc/config/arm/coff.h 2004-05-01 19:07:06.059409600 +0200 @@ -31,11 +31,16 @@ #define TARGET_VERSION fputs (" (ARM/coff)", stderr) #undef TARGET_DEFAULT -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) +#define TARGET_DEFAULT \ + ( ARM_FLAG_SOFT_FLOAT \ + | ARM_FLAG_VFP \ + | ARM_FLAG_APCS_32 \ + | ARM_FLAG_APCS_FRAME \ + | ARM_FLAG_MMU_TRAPS ) #ifndef MULTILIB_DEFAULTS #define MULTILIB_DEFAULTS \ - { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } + { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } #endif /* This is COFF, but prefer stabs. */ diff -urNd gcc-3.4.0-orig/gcc/config/arm/elf.h gcc-3.4.0/gcc/config/arm/elf.h --- gcc-3.4.0-orig/gcc/config/arm/elf.h 2004-02-24 15:25:22.000000000 +0100 +++ gcc-3.4.0/gcc/config/arm/elf.h 2004-05-01 19:12:16.976486400 +0200 @@ -46,7 +46,9 @@ #ifndef SUBTARGET_ASM_FLOAT_SPEC #define SUBTARGET_ASM_FLOAT_SPEC "\ -%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" +%{mapcs-float:-mfloat} \ +%{mhard-float:-mfpu=fpa} \ +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" #endif #ifndef ASM_SPEC @@ -106,12 +108,17 @@ #endif #ifndef TARGET_DEFAULT -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) +#define TARGET_DEFAULT \ + ( ARM_FLAG_SOFT_FLOAT \ + | ARM_FLAG_VFP \ + | ARM_FLAG_APCS_32 \ + | ARM_FLAG_APCS_FRAME \ + | ARM_FLAG_MMU_TRAPS ) #endif #ifndef MULTILIB_DEFAULTS #define MULTILIB_DEFAULTS \ - { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } #endif #define TARGET_ASM_FILE_START_APP_OFF true diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h --- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 +++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 @@ -30,9 +30,27 @@ /* Do not assume anything about header files. */ #define NO_IMPLICIT_EXTERN_C -/* Default is to use APCS-32 mode. */ +/* + * Default is to use APCS-32 mode with soft-vfp. + * The old Linux default for floats can be achieved with -mhard-float + * or with the configure --with-float=hard option. + * If -msoft-float or --with-float=soft is used then software float + * support will be used just like the default but with the legacy + * big endian word ordering for double float representation instead. + */ + #undef TARGET_DEFAULT -#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) +#define TARGET_DEFAULT \ + ( ARM_FLAG_APCS_32 \ + | ARM_FLAG_SOFT_FLOAT \ + | ARM_FLAG_VFP \ + | ARM_FLAG_MMU_TRAPS ) + +#undef SUBTARGET_EXTRA_ASM_SPEC +#define SUBTARGET_EXTRA_ASM_SPEC "\ +%{!mcpu=*:-mcpu=xscale} \ +%{mhard-float:-mfpu=fpa} \ +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 @@ -40,7 +58,7 @@ #undef MULTILIB_DEFAULTS #define MULTILIB_DEFAULTS \ - { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } + { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" @@ -55,7 +73,7 @@ %{shared:-lc} \ %{!shared:%{pro文件:-lc_p}%{!pro文件:-lc}}" -#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" +#define LIBGCC_SPEC "-lgcc" /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add the GNU/Linux magical crtbegin.o file (see crtstuff.c) which diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux --- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 +++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 @@ -4,7 +4,10 @@ LIBGCC2_DEBUG_CFLAGS = -g0 LIB1ASMSRC = arm/lib1funcs.asm -LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx +LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ + _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ + _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ + _fixsfsi _fixunssfsi # MULTILIB_OPTIONS = mhard-float/msoft-float # MULTILIB_DIRNAMES = hard-float soft-float diff -urNd gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h gcc-3.4.0/gcc/config/arm/unknown-elf.h --- gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h 2004-02-24 15:25:22.000000000 +0100 +++ gcc-3.4.0/gcc/config/arm/unknown-elf.h 2004-05-01 19:09:09.016212800 +0200 @@ -30,7 +30,12 @@ /* Default to using APCS-32 and software floating point. */ #ifndef TARGET_DEFAULT -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) +#define TARGET_DEFAULT \ + ( ARM_FLAG_SOFT_FLOAT \ + | ARM_FLAG_VFP \ + | ARM_FLAG_APCS_32 \ + | ARM_FLAG_APCS_FRAME \ + | ARM_FLAG_MMU_TRAPS ) #endif /* Now we define the strings used to build the spec file. */ diff -urNd gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h gcc-3.4.0/gcc/config/arm/xscale-elf.h --- gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h 2003-07-02 01:26:43.000000000 +0200 +++ gcc-3.4.0/gcc/config/arm/xscale-elf.h 2004-05-01 20:15:36.620105600 +0200 @@ -49,11 +49,12 @@ endian, regardless of the endian-ness of the memory system. */ -#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ - %{mhard-float:-mfpu=fpa} \ - %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +#define SUBTARGET_EXTRA_ASM_SPEC "\ +%{!mcpu=*:-mcpu=xscale} \ +%{mhard-float:-mfpu=fpa} \ +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" #ifndef MULTILIB_DEFAULTS #define MULTILIB_DEFAULTS \ - { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } + { "mlittle-endian", "mno-thumb-interwork", "marm" } #endif 六、如何测试简单的QT程序 下面是一个十分简单的QT程序,也是来自Qte的教程。 helloqt.cpp #include #include int main( int argc, char **argv ) { QApplication a( argc, argv ); QPushButton hello( "Hello world!", 0 ); hello.resize( 100, 30 ); a.setMainWidget( &hello ); hello.show(); return a.exec(); } 下载qte-2.3.10(其他版本没有试),我们需要他的头文件,解压缩。我的 路径是/home/gcc/toolchain/qt-2.3.10,将E600或968自带libqte-mt.so.2.3.8 复制到/home/gcc/toolchain/qt-2.3.10/lib下,并做一些软连接或者干脆直接 复制(如libqte.so,libqte-mt.so ...),将自带的libjpeg.so.62.0.0复制到交 叉编译lib下,这时也需要做下类似的操作,我这里路径是/home/gcc/toolchain/gcc-3.4.0-glibc-2.2.5/arm-linux/arm-linux/lib 设置环境变量: export TOOLCHAIN_DIR=/home/gcc/toolchain export PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:$TOOLCHAIN_DIR/gcc-3.4.0-glibc-2.2.5/arm-linux/bin export QTDIR=$TOOLCHAIN_DIR/qt-2.3.10 使用以下命令编译: arm-linux-g++ -c -I$QTDIR/include -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG -o helloqt.o helloqt.cpp arm-linux-g++ -L$QTDIR/lib -Wl,-rpath,$QTDIR/lib -o helloqtfpa helloqt.o -lqte -lm 这个helloqtfpa就可以在E600,968上运行了,我当时用的E600的libqte-mt.so.2.3.8 编译后放在968上也能正常运行,我个人认为E600,968这两个文件差异是在于 对键盘的处理。 另外前一阵子令人郁闷的Segmentation Fault问题是由于,我使用了以下 语句进行编译: arm-linux-g++ -L$QTDIR/lib -I$QTDIR/include -Wl,-rpath,$QTDIR/lib -o helloqterr helloqt.cpp -lqte -lm 最重要参数是-DQWS,没有它编译后-qws运行肯定出现Segmentation Fault。 至于为何如此,我没有做过Qte开发,还是不了解。 七、总结 至此,从解决安装包,到打开Shell入口,到解除软件安装限制,再到图形化 软件移植,夏新E600和飞利浦968终于取得实质性的成果。 本文即将结束时,又听到了subtle关于telnet的重大突破,令人兴奋不已! 感兴趣的朋友可以参考E680编译Qte的方法,用E600环境编译下整个Qte,思路 是完全一样的,此外qtopia,opie等等系列软件都需要众人去挖掘。 高兴之余,也有遗憾,一个是浮点问题没有得到彻底解决,二是E600,968上层 图形化源码没有,三是E600,968自带Qte库文件内容太少。这几个问题的确是进行 实际应用软件移植的烂路虎。 您对本贴的看法:(0) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 9楼 发表于 2006-12-6 13:58 夏新E600和飞利浦968手机系统是十分相近的,内核版本信息也是一致的, 不过即便这样,在模拟器移植过程中,E600使用968的QT库,都会有按键问题。 显然这是硬件有所不同的原因。 Qnes模拟器能不能在E680上用呢,事实是不太可能的,因两者硬件差异太 大。以下描述我在E680上运行Qnes的提示信息。 我将一些夏新E600本身特有lib文件加上后,仍然使用E680本地的QT库,设 置好环境变量,运行会出现: # ./r qnes ./qnes: relocation error: /mmc/mmca1/qnes/libcec.so.0: undefined symbol: _ZThn184_N10QPopupMenu10updateItemEi 说明自带的QT库缺少函数。我把E600的libqte-mt.so.2,和fonts复制过去, 运行倒是可以,只不过是不正常的运行,提示如下: ======== 240 x 320 x 16 Default2: Cannot open /dev/ts (No such file or directory) ========================================================== theme config file [../Settings/theme/010Gray.conf] doesn't exist! JPEG parameter struct mismatch: library thinks size is 376, caller expects 372 QImage::measure fail to guess image format csmCheckLimited : csm size 0/655360 csmConstruct : csm info start 0x40551000 size 655360 could not open for writing `/Settings/cec.conf.new' QCopChannel: no client registered for channel CEC/Desktop, not sending stopStartupAnimation() ... QCopChannel: no client registered for channel CEC/IdleManager, not sending hideInputMethod() ... 在E680手机上倒是显示了个新界面,并有英文的Load和Back。通过提示可以 清楚看出因两者硬件的差异生成兼容性的问题。不过也证实了上篇文章的推论, 浮点格式不同,最多是浮点运算有误,但是程序还是可以链结运行的。造成什么 Segmentation Fault的错误,还是直接来源于硬件。 如我把E600的sysinfo放在E680运行会有如下提示: ======== 240 x 320 x 16 Default2: Cannot open /dev/ts (No such file or directory) ========================================================== theme config file [../Settings/theme/010Gray.conf] doesn't exist! QImage::measure fail to guess image format csmCheckLimited : csm size 0/655360 create csm : exist csmConstruct : csm info start 0x40871000 size 655360 could not open for writing `/Settings/cec.conf.new' Can't make QGfx for null pixmap QPainter::begin: Unable to get graphics context Segmentation fault 这个Segmentation fault可能来自于显示设备的,具体原因不详,如做 反汇编处理,会了解更多的信息。 四、测试简单的浮点运算 编译环境: VFP gcc-3.3.2 glibc-2.3.2 binutils-2.15 kernel 2.4.20 FPA gcc-3.4.0 glibc-2.2.5 binutils-2.15 kernel 2.4.19 先简单写个命令行程序如下: int main() { float fvalueA=1.9; float fvalueB=2.8; int ivalueC=8; int ivalueD=9999; printf("Hello!My E680G!\n"); printf("Testvalue(4.7):%f\n",fvalueA+fvalueB); printf("Testvalue(9.9):%f\n",fvalueA+ivalueC); printf("Testvalue(10007):%d\n",ivalueC+ivalueD); return 0; } 1.vfp soft fp gcc-3.3.2 glibc-2.3.2 编译 arm-linux-gcc -o hellocmdvfp hello.c 2.fpa soft fp gcc-3.4.0 glibc-2.2.5 编译 (加参数 -msoft-float 也是完全一样的) arm-linux-gcc -o hellocmdfpa hello.c ------------------------------------------------ E680运行结果: # ./hellocmdvfp Hello!My E680G! Testvalue(4.7):4.700000 Testvalue(9.9):9.900000 Testvalue(10007):10007 # ./hellocmdfpa Hello!My E680G! Testvalue(4.7):-2.000000 Testvalue(9.9):-2.000000 Testvalue(10007):10007 FPA虽然有软浮点,但浮点运算依然出错。 ------------------------------------------------ E600和968的运行结果: #./hellocmdvfp Hello!My E680G! Testvalue(4.7):-2.000000 Testvalue(9.9):-2.000000 Testvalue(10007):10007 #./hellocmdfpa Hello!My E680G! Testvalue(4.7):-2.000000 Testvalue(9.9):-2.000000 Testvalue(10007):10007 ------------------------------------------------- 出乎我的意料,在E600上,浮点运算居然全出错,后来偶然间用VFP格式 的arm-linux-g++编译: arm-linux-g++ -o hellocmdvfp+ hello.c #./hellocmdvfp+ Hello!My E680G! Testvalue(4.7):4.700000 Testvalue(9.9):9.900000 Testvalue(10007):10007 在E600上居然又运行正确,这令人十分奇怪。于是我再用FPA格式这样编 译: arm-linux-g++ -o hellocmdfpa+ hello.c 因为是gcc.3.4.0版本,会提示libstdc++6.so.0和libgcc_s.so.1缺少。 加上库文件后运行结果如下(E680,E600,968结果完全一样): #.hellocmdfpa+ Hello!My E680G! Testvalue(4.7):-2.000000 Testvalue(9.9):-2.000000 Testvalue(10007):10007 显然都是错误的。 五、总结 VFP格式在E600,968上运行,可以说是没有浮点BUG的。不过FPA却总 有问题。VFP编译环境在编译过程中不能兼容E600,968本身的库文件,所 以才要用FPA的编译环境。 浮点这个问题比较让人费解,还须要做进一步研究。 您对本贴的看法:(0) (0) __________________________________ 郵政編碼:100054 地址:中國 北京市宣武區廣安門南街48號中彩大廈 5层509室 010-80900674 [广告] Unix体验中心开通Fedora服务器 | 金牌ULP专家课程,5万年薪就业! | IBM端到端安全解决方案与专业服务 | Wiki、Wiki,快点! wheel 天使 会员UID:40417 注册日期:2003-1-20 最后登录:2007-6-4 帖子总数:1267 精华贴子:7 可用积分:542 信誉积分:110 专家积分:10 总积分:662 来自:福建省莆田 在线状态:...在线... [资料] [站内短信] [Blog] 10楼 发表于 2006-12-6 13:59 三、浮点问题的由来 MOTO E680 系列,夏新E600和飞利浦968 等等手机,皆使用Inter Xscale的 处理器,所采用的指令集也是armv5tel。 E680G 版本信息 Linux (none) 2.4.20_mvlcee30-mainstone #1 Jan 1,2003 armv5tel unknown E600 版本信息 Linux c8k 2.4.19-rmk7-pxa2 #1 Thu Mar 23 17:56:36 CST 2006 armv5tel unknown 968 版本信息 Linux c8k 2.4.19-rmk7-pxa2 #1 Fri Dec 9 16:42:58 CST 2005 armv5tel unknown Inter Xscale这款新型高性能、低功耗的微构架兼容ARMv5TE ISA指令集, 不过不支持浮点指令集。这是为了节省处理器芯片体积和降低运行功耗,XScale 体系结构没有实现昂贵的浮点运算部件和除法部件。这些是嵌入式应用中不常用 的运算。当需要这类运算时,要通过软件方法实现。 浮点运算要大大复杂于整数运算,没有浮点运算单元会有什么问题? 我们来看一个例子: E680/E680i/E680g CPU都是ARM系列的Intel xScale PAX270。MP3解码有两种 方式,一种是基于浮点运算(如MPG123),另一种则是基于整数的,即libmad (MPEG audio decoder library)。浮点的解码,单精度浮点小数可以精确到小数点后45位, 不过要求CPU有FPU单元。由于E680系列本身的限制,只能使用软浮点,libmad是用 的fixed-integer,通过整数模拟小数计算的,精度只能保留到小数点后第9位(大于 0的最小值0.00000000372529)。解码精度和速度自然会有差异。因此这类手机音质 自然是不能与硬件解码相比。也很少有EQ均衡器,即便通过软件实现了,效果也不 是太好。 此外流行的图像处理、3D运算、视频处理、音频处理等诸多多媒体应用都会类 似的涉及浮点运算。没有FPU单元就需要软件支持,显然牺牲了效率和质量。 浮点运算能力是关系CPU多媒体、3D图形处理的一个重要指标。 我们构建编译开发环境,就需要加入软浮点支持,否则涉及浮点运算就会出错。 四、库文件格式 先看E680系列的库文件格式。如libjpeg.so文件,用objdump -p显示相关内容: private flags = 602: [APCS-32] [VFP float format] [software FP] [has entry point] 显然是software FP,不过使用的是VFP(Vector Float Point)矢量浮点格式。 再看E600和968的库文件格式: private flags = 202: [APCS-32] [FPA float format] [software FP] [has entry point] 与E680相比,不同点在于使用的是FPA(Floating Point Arithmetic)浮点格式, 又一说为(Fixed Point Arithmetic)定点浮点运算。由于这方面知识空白,具体并 没有仔细考证。 当然除此两种之外,还有一种格式 private flags = 2 : [APCS-32] [FPA float format] [has entry point] 这个自然是硬浮点格式了,不过如果在编译过程中加上arm-nolibfloat patch 再在gcc参数加上-msoft-float,估计也是能生成软浮点代码,不过没有亲试。 理论上讲,不管是哪种格式,在应用程序运行链接时都是可以的,不存在兼容 性的问题,但是要做编译,库文件是必须完全一致的。 以我手中的交叉编译工具为例,当初是构建于E680G的VFP格式,我使用夏新 E600自带的QTE库(FPA soft FP),编译一个简单的QTE程序,出现如下错误: /home/gcc/toolchain/soft-arm-linux/gcc-3.3.2-glibc-2.3.2/bin/../lib/ gcc-lib/arm-linux/3.3.2/../../../../arm-linux/bin/ld: ERROR: /home/gcc/ toolchain/qt/lib/libqte-mt.so uses FPA instructions, whereas helloqt does not /home/gcc/toolchain/soft-arm-linux/gcc-3.3.2-glibc-2.3.2/bin/../lib/ gcc-lib/arm-linux/3.3.2/../../../../arm-linux/bin/ld: failed to merge target specific data of file /home/gcc/toolchain/qt/lib/libqte-mt.so collect2: ld returned 1 exit status 这个编译环境是用cross-tool-0.28编译而成的,而且打了gcc-3.3.2的soft- float patch,不过按patch说明,是应该可以生成FPA soft FP格式的编译环境,而 结果却是VFP soft FP,这个适用于E680系列,然不适用夏新E600和飞利浦968。 后来我在交叉编译环境中把GCC_EXTRA_CONFIG的--with-float=soft选项去除 且把soft-float patch也同时去掉,获得的是FPA hard FP的编译环境。用这个环境 再编译夏新E600自带的QTE库(FPA soft FP),会出现类似如下提示: ld uses hardware FP, whereas libqte-mt.so uses software ... 我试图在gcc参数中加上-msoft-float,错误如下: arm-linux/bin/ld: cannot find -lfloat collect2: ld returned 1 exit status 这个需要编译编译环境时加下nolibfloat的patch。 如何生成FPA soft FP的格式困扰了好几天,我查看了soft-float patch本身也 搜索了大量资料,觉得可能还是patch本身的问题。我重新下载了gcc.3.4.0,使用 3.4.0 soft patch ,另外把bigendian,nolibfloat这一些有冲突的patch去掉, 果然生成了FPA soft FP格式的库文件。 再用E600自带的QTE库,编译只是有一个告警选项: /home/gcc/toolchain/gcc-3.4.0-glibc-2.2.5/arm-linux/lib/gcc/arm-linux/3.4 .0/../../../../arm-linux/bin/ld: warning: libstdc++.so.5, needed by /home/gcc /toolchain/qt-2.3.8/lib/libqte-mt.so, not found (try using -rpath or -rpath-link) 夏新E600和飞利浦968使用的GCC版本都是3.2.1,3.4.0编译后是libstdc++.so.6, 可以查看下面的lib内容,使用的版本是不同的。 libstdc++.so.6 Version definitions: 1 0x01 0x025f4d66 libstdc++.so.6 2 0x00 0x08922974 GLIBCXX_3.4 3 0x00 0x056bafd3 CXXABI_1.3 Version References: required from libgcc_s.so.1: 0x0b792653 0x00 10 GCC_3.3 0x0d696910 0x00 08 GLIBC_2.0 0x0b792650 0x00 07 GCC_3.0 required from libm.so.6: 0x0d696910 0x00 05 GLIBC_2.0 required from libc.so.6: 0x09691f73 0x00 11 GLIBC_2.1.3 0x0d696911 0x00 09 GLIBC_2.1 0x0d696912 0x00 06 GLIBC_2.2 0x0d696910 0x00 04 GLIBC_2.0 libstdc++.so.5 Version definitions: 1 0x01 0x025f4d65 libstdc++.so.5 2 0x00 0x081a2972 GLIBCPP_3.2 3 0x00 0x0a297d01 GLIBCPP_3.2.1 GLIBCPP_3.2 4 0x00 0x056bafd2 CXXABI_1.2 Version References: required from libm.so.6: 0x0d696910 0x00 07 GLIBC_2.0 required from libgcc_s.so.1: 0x0b792650 0x00 06 GCC_3.0 required from libc.so.6: 0x0d696912 0x00 10 GLIBC_2.2 0x09691f73 0x00 09 GLIBC_2.1.3 0x0d696911 0x00 08 GLIBC_2.1 0x0d696910 0x00 05 GLIBC_2.0 五、总结 E600和968编译环境问题看似是解决了,其实不然,这仅仅说明了可以生 成兼容E600,968的库文件,能否运行则是另外一回事,下文将着重说明运行时 的兼容性问题。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.