今天说如何创建 EZX 程序的 SDK 。
首先要到 http://lsb.blogdns.net/ezx-devkit 下载那个 dev-ezx-0.2.0.tgz (声明一下,这并非官方的 EZX SDK)。解开,第一件事就是看包里的文档(必须养成的习惯,不管懂不懂,E 文差点就装个糍粑~)。
1.准备支持 Xscale/iWMMXt 的交叉编译器 cross-compiler based on GCC 3.3,如果没有,看下面 (2006.2.28) 日的文档。
2.把手机 /usr/lib 目录下的所有文件复制到。sdk 的 lib 目录下。特别是下面几个文件:
dev-ezx-0.2.0/lib/ezx/lib/libqte-mt-xscale-r.so.2.3.6
dev-ezx-0.2.0/lib/ezx/lib/libezxappbase-xscale-r.so.1.0.0
dev-ezx-0.2.0/lib/ezx/lib/libezxjpeg-xscale-r.so.1.0.0
PS:复制的时候最好用 tar 去做,telnet 到手机 tar cvf /mmc/mmca1/lib.tar /usr/lib 。然后把存储卡上的 lib.tar 复制出来再解开。这样做可以避免把那些不必要的东西复制N遍。如果你还不会 telnet ,我看你看这帖子也是浪费时间了,如果你是新机器,还不敢装乱七八糟的东西上去,可以参考一下我以前的那个关于 Loader 的贴子 。
PS:我手头只有一个16M MMC 卡(Canon 相机的随机测试卡,准备攒银子买个1G的),tar不出来的。所以想到前段时间,有人用 mount -t nfs 把PC的网络共享挂到手机上去,让手机访问PC文件系统。我没试验成功,有成功的朋友可以交流一下。
PS:好多废话了,继续...
3.到 moc 目录下,直接用 make 编译 moc 程序,这个是编译 Qt 资源的,Cygwin 下生成一个 moc.exe 复制到 bin 下,或加到 PATH 环境变量里也行。
4.编译 helloworld 目录下的 程序。得到 helloworld ,复制到手机上。然后 telnet 上去
$ export QTDIR=/usr/lib/ezx
$ export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
$ export EZX_RES_FONT_PATH=$QTDIR/lib/fonts
$ export EZX_RES_ICON_PATH=/usr/language/icon
$ ./helloworld
看你手机,你的第一个 EZX 程序运行起来啦~~
PS: 前面这些环境变量不要忘了写,都是必须的,不然跑不起来的。
PS: 这个环境还是需要编译好,传手机上运行的,不知道有没办法,自己通过 qt-2.3.6 编译一套在 Cygwin 下直接用的环境,调试程序用?
兴奋ing~
(2006.2.28)
昨天写过一个帖子,但是今天一早就发现,编译东西如果代码里有浮点运算是要出错的。在回头仔细读一下 的说明,“it uses a different word order ("VFP") for the floating point emulation”。也难怪,昨天说到的那个关于 gcc-3.3.2 的补丁问题,是给 gcc-3.3.3 用的。这么说来,需要用 gcc-3.3.3 或更高的编译器了。那天的贴在主要还是依照,http://marcus.bluetroll.se/e680/ 上的思路做的。今天有幸打开了 http://lsb.blogdns.net/ezx-crosstool 的页面(网络问题,这几天总打不开),下载这个 ezx-crosstool-0.5.tar.bz2 。打开看看,哈哈,这是从 Dan Kegel 的 crosstool-0.38 版本基础上修改的版本,用的 gcc-3.3.6 、glibc-2.3.2、 linux-2.4.26 。并且有 VFP-softfloat 支持和 iWMMXt coprocessor 支持及补丁。这个版本去掉了跟 arm 无关的东西,用起来更简单了。
上次 15 个小时的编译工作就当是考机了,今天再重新来。先换了台机器(P4 1.5 ,-_-#,没办法,偶是穷人 ... ).... 然后 $ sh build.sh ... 睡觉去吧,估计也要7~8个小时。。。。
编译完成后,其 tmp 目录下有两个 编译好的测试程序,考到手机上,telnet 上去执行,成功!测试了下浮点计算,也没问题。
总算可以放心的继续研究 Qt 开发部分咯 ...
(2006.2.27)
前几天在自由之城的Blog空间看到站长有篇名为“构建E680的开发环境”的帖子(见 http://kerberos.blogchina.com/1565877.html ),说到了 linux 下交叉编辑(Crosscompile)出 e680 上运行的 EZX 程序的方法。本想跟着实验一下的,可惜,站点上没有任何下载链接,最关键的交叉编译器(xscale-gcc-vfp-3.3.tar.gz)也只说有做好的,在移动天使2号服务器上有下载,可连续N天没连上去,彻底失望~~ =。=
世上没免费的午餐,还是自己动手去编译把。来参考下这个站点 ,对 Crosscompile 与 moto linux 手机有点认识后去 下载 crosstool-0.40.tar.gz (前几天看了些介绍是说 0.38 版的,现在是 0.40 了)。解开后看 doc 下的 crosstool-howto.html 文档。也许在 linux 下问题会少些,但我在家用的 C800 实在是跑不动 VMware ,只临时装了个 cygwin-1.5.19-4 。尽管文档里也说到了一些关于 cygwin 下用 crosstool 的一些问题,我还是想尝试一下,哪怕能编译出一个只有一行 printf("Hello OopsWare\n"); 的 c 程序并能到 e680 上运行,对于我现在来说也已经知足咯 (总比没期限的等MOTO出SDK希望大点)。
装之前先确认一下:
1.cygwin 版本,按 crosstool 的手册所说的,最好是 1.5.10 以上吧。然后一些必要的工具是否都装了,不全的先装全 (gcc make perl wget patch bison),这些东西最小安装时都没有的。不然下一步的执行脚本漫长过程中少东西出错,就要重头再来了。
2.从 下载的 crosstool-0.40.tar.gz ,用来生成交叉编译器的工具包(最关键的东西)。
3.参考 http://marcus.bluetroll.se/e680/ 这个网站,这有一写安装的说明,也有作者提供的几个下载。e680-SCRIPTs 包 是作者写的几个脚本,可以参考看看,但并不一定适合你。e680-cross 包 是利用针对 e680 xScale 做的 Crosstool 配置,也供参考,看其脚本写的,似乎还是用的 Crosstool-0.28 可能跟现在的0.40已经有些差距了。VFP-softfloat 包里是个补丁文件,是给 gcc 打软浮点运算补丁的(E680 上的 xScale 不带 FPU),看了一下这个.patch,是给 gcc-3.3.3 用的,但实际用的是 gcc-3.3.2 ,不知道放这是什么目的(贴补丁里的说法" gcc-3.3.2 doesn't seem to have soft float support, so linking against. libgcc.a doesn't work when compiled with -msoft-float
")。网站里的其他东西就没必要下了,剩下的都是跟 开发相关的了,现在的目的只是 Crosstool 。
4.目标linux的源程序包( binutils-2.15.tar.bz2、glibc-2.3.2.tar.bz2、glibc-linuxthreads-2.3.2.tar.bz2、gcc-3.3.2.tar.bz2、linux-2.4.20.tar.bz2)如果你手头上有这些东西,就没必要在让脚本去网上下载了。没有的话,就检查一下你的linux能不能上网。
然后解开 crosstool 包:
$ tar xvfz crosstool-0.40.tar.gz
$ cd crosstool-0.40
仿照 arm-softfloat.dat、arm-xscale.dat 编辑一个arm-e680.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"
修改一下 gcc-3.3.2-glibc-2.3.2.dat 文件 “LINUX_DIR=linux-2.4.26” 改成 “LINUX_DIR=linux-2.4.20”。
仿照 demo-arm-softfloat.sh 编辑一个文件 e680.sh
#!/bin/sh
set -ex
TARBALLS_DIR=/Download/other # 下载源程序包后的存放位置,不想下载就把包放这里。(默认为tarballs目录)
RESULT_TOP=/usr/crosstool # 最后生成编译器的位置 (默认为 result 目录)
GCC_LANGUAGES="c,c++" # 编译器支持的语言,至于java和f77还是免了吧
export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES
eval `cat arm-e680.dat gcc-3.3.2-glibc-2.3.2.dat` sh all.sh --notest
编辑完后,运行 /bin/sh e680.sh ,开始编译 ... 祈祷吧 ... 15个小时后 ... 终于完成 ...
随便写一个 helloworld.c :
main()
{
printf("Hello Moto!\n");
}
用你刚生成的 arm-linux-gcc 编译这个程序
$/usr/crosstool/arm-linux/gcc......./bin/arm-linux-gcc helloworld.c
生成 a.out 文件,复制到手机的上,telnet 上去,运行,成功!!!
Crosscompile的意义在于在当前的系统下,编译出一套,可以在当前系统下运行的 gcc 和 libc ,而用这些东西,在当前系统下编译出适合目的 系统 用的可执行程序。
目的环境的版本:
telnet 到手机时会显示 “Linux/armv5tel 2.4.20_mvlcee30-mainstone”
从手机中 /lib/libc-2.3.2.so 可看出手机内部是 libc-2.3.2 。
今天先写到这,刚试验成功,今天不睡觉了,呵呵。回头在写 EZX 环境的搭建