免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 24095 | 回复: 34

摩托罗拉E380/海尔N60/夏新E600/philips968等手机系统分析 [复制链接]

论坛徽章:
0
发表于 2006-12-06 13:43 |显示全部楼层
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的相关软件

论坛徽章:
0
发表于 2006-12-06 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
发表于 2006-12-06 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
发表于 2006-12-06 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
发表于 2006-12-06 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 <stdio.h>
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
发表于 2006-12-06 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
发表于 2006-12-06 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。

[[i] 本帖最后由 wheel 于 2006-12-6 14:13 编辑 [/i]]

论坛徽章:
0
发表于 2006-12-06 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 <qapplication.h>
#include <qpushbutton.h>

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
发表于 2006-12-06 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
发表于 2006-12-06 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的库文件,能否运行则是另外一回事,下文将着重说明运行时
的兼容性问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP