王朝网络
分享
 
 
 

深度剖析E680G开发五.移植OPIE操作系统(下)-编译和运行OPIE

王朝other·作者佚名  2006-12-10
宽屏版  字体: |||超大  

深度剖析E680G开发五.移植OPIE操作系统(下)-编译和运行OPIE

草木瓜

20060930

一、前言

这是最后的内容,然而却有很大的遗憾,如果运行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安装文件。我目前手机上

就是用的一位外国人编译的,运行时可以屏蔽按键,触摸屏,可以自由与手机系统进行

切换。

如果找到了解决方法,一定详细公布与众。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有