一、前言
這是最后的內(nèi)容,然而卻有很大的遺憾,如果運(yùn)行OPIE,但E680原有系統(tǒng)依然
會(huì)接受的鍵盤和觸摸屏的事件,這種情況下幾乎不能正常使用OPIE,必須telnet進(jìn)
手機(jī)kill掉windowserver,這實(shí)在是無(wú)聊的很。
這個(gè)問(wèn)題早在去年已經(jīng)被一位外國(guó)友人解決。不過(guò)相關(guān)源碼貼子的鏈結(jié)皆已失效,
不能盡快的找出解決方法,但在網(wǎng)上可以搜索到完美編譯后的OPIE下載。
如有那位前輩知道解決方法,一定請(qǐng)賜教,不甚感激。
我之所以還要把帶有遺憾的方法寫出來(lái),那是因?yàn)檫@些內(nèi)容覆蓋面相當(dāng)多了,
層次也很高了。
以后找出解決方法,有了這些知識(shí)基礎(chǔ),就隨心所欲了。
二、重要提示
為了方便更好的理解本文,提供下面鏈結(jié)。
E680應(yīng)用開發(fā)全系列的文章地址:http://blog.csdn.net/liwei_cmg
文章相關(guān)的重要資源的下載地址:http://play.younet.com/view.php?tid=18578
三、編譯OPIE
1.http://marcus.bluetroll.se/e680/opie-cvs.tar.gz 下載 opie-cvs.tar.gz
注意:其實(shí)編譯過(guò)程可以看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.同樣為了便于管理,統(tǒng)一在 /home/gcc/toolchain 下解壓縮OPIE和QT。
4.設(shè)置環(huán)境變量
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.執(zhí)行如下腳本,這是編譯QTE所做的準(zhǔn)備工作,這里需要下載uic-qt2這個(gè)文
件,上篇文章已經(jīng)說(shuō)明
mkdir -p $QTDIR/bin
cp uic-qt2 $QTDIR/bin/uic
chmod u+x $QTDIR/bin/uic #root用戶這個(gè)就沒(méi)有必要了
ln -s $OPIEDIR/qt/qconfig*.h $QTDIR/src/tools/ #README里已說(shuō)明,使用OPIE選項(xiàng)進(jìn)行編譯
cd $QTDIR
patch -p1 < $OPIEDIR/qt/qt-2.3.10.patch/qte-2.3.10-all.patch #qt的OPIE補(bǔ)丁
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
注意:這個(gè)opie-config是Leprechaun提供的config文件,用戶也可以直接在
menuconfig自行設(shè)置,其實(shí)包含需要編譯的OPIE功能。本資源貼提供了下載。
8.至此OPIE已經(jīng)編譯成功。如果要在手機(jī)上運(yùn)行,我們這里需要對(duì)他進(jìn)行一些
精簡(jiǎn),去除一些無(wú)關(guān)緊要的東西。
#!/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
我們把精簡(jiǎn)的路徑設(shè)為/home/gcc/moto,復(fù)制完全后,這個(gè)就是我們需要放
在手機(jī)上的文件夾。
四、手機(jī)上運(yùn)行OPIE
這里有三種方法。我們將做一一介紹。
★方法一★:將/home/gcc/moto這個(gè)文件,直接復(fù)制到E680上。
這里需要注意的嚴(yán)重問(wèn)題。文件夾的lib文件有很多是采用Linux的ln,即軟連接,
如:libso -> libso.1.1 libso.1 -> libso.1.1,libso與libso.1皆是軟連接。只有
libso.1.1是真實(shí)的庫(kù)文件。這在Linux下是十分普遍的。在我們SD卡上是不能夠建立
的。因?yàn)槲覀僑D卡默認(rèn)是采用FAT格式分區(qū)。
我們進(jìn)行冗余法,即有一個(gè)軟連接,我就復(fù)制一個(gè)真實(shí)的lib文件。
這里自已寫了個(gè)腳本完成這個(gè)操作。
#!/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路徑,可按自已需要更改。此外這個(gè)腳本
還有個(gè)bug,就是如果/home/moto/gcc下不存在軟連接,則會(huì)出錯(cuò)。有興趣的
可以去完善一下。
復(fù)制完所有軟連接,將這個(gè)文件夾復(fù)制到手機(jī)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_F export PATH=$PATH:/mmc/mmca1/moto/bin
export HOME=/mmc/mmca1/moto
/mmc/mmca1/moto/bin/qpe -qws
即可運(yùn)行OPIE系統(tǒng),這里OPIE和系統(tǒng)會(huì)在觸摸屏上會(huì)有沖突,國(guó)外早已有人
解決了這個(gè)問(wèn)題,遺憾的相關(guān)鏈結(jié)全部失效,到現(xiàn)在也沒(méi)有解決這個(gè)問(wèn)題。這里
暫時(shí)只能ps -ef ,把windowserv的進(jìn)程殺掉才可以完美的運(yùn)行OPIE。
★方法二★:將OPIE制作成cramfs文件格式包,并把SD卡分出一個(gè)分區(qū),用
于裝載cramfs文件包,并在E680上mount上去。這就成功避開了軟連接的問(wèn)題。
這個(gè)方法單就運(yùn)行OPIE,意思不大,且十分復(fù)雜,但涉及內(nèi)容很多,不沖方
法沖知識(shí),所以這里詳細(xì)說(shuō)明一下。
1.首先需要對(duì)SD卡進(jìn)行分區(qū)。當(dāng)然SD卡內(nèi)容會(huì)全部丟失,及時(shí)做好備份。
將SD卡彈出,用USB讀卡器連到Linux機(jī)器上。我這里使用的是虛擬機(jī)VMware5.0,
需要在菜單vm->Removeable Devices->USB Devices->Micro USB Device。這
時(shí)虛擬機(jī)會(huì)自動(dòng)加載USB設(shè)備到Linux下。
此時(shí)在Linux fdisk -l 可以查看的兩段信息,一是硬盤分區(qū)信息,另一個(gè)就
是USB設(shè)備了。
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
[注意:]
如果此時(shí)看不到類似以上內(nèi)容,可執(zhí)行以下語(yǔ)句:
# /sbin/lsmod
查看內(nèi)容是否包括 usbcore、usb-ohci(或usb-uhci)、scsi_mod等。如找
不著,可按下面shell語(yǔ)句,循環(huán)安裝驅(qū)動(dòng)。當(dāng)然,你也可以用/sbin/insmod
一一安裝。
cd /lib/modules/2.4.20-8/kernel/drivers/usb
for v in *.o storage/*.o ; do /sbin/insmod $v ; done
驅(qū)動(dòng)安裝完畢后,# /sbin/lsmod 查看內(nèi)容是否安裝成功,重新插拔USB設(shè)備
直到fdisk -l 發(fā)現(xiàn)設(shè)備。
上面查看到USB設(shè)備,已經(jīng)是分好區(qū)的。分了兩個(gè)主分區(qū) /dev/sdb1,/dev/sdb2
這樣,/dev/sdb1會(huì)自動(dòng)被Windows和E680識(shí)別,/dev/sdb2在E680上可以手工掛載上
去。
具體如何使用fdisk分區(qū),可以查看相關(guān)幫助,或網(wǎng)上搜索一下。
fdisk /dev/sdb 對(duì)SD卡進(jìn)行分區(qū),最后強(qiáng)調(diào)一下,必須都是主分區(qū),第一個(gè)分
區(qū)是FAT格式,第二個(gè)是Linux格式。分完w保存信息,mkfs.msdos /dev/sdb1進(jìn)行格
式化。/dev/sdb2用作cramfs文件,比OPIE總體大小大一點(diǎn)就可以了,一般40M左右。
2.分好區(qū)后,就需要制作cramfs文件了。
我們輸入 mkcramfs /home/gcc/moto /home/gcc/moto.cramfs
會(huì)發(fā)生錯(cuò)誤,如下:
Exceeded MAXENTRIES. Raise this value in mkcramfs.c and recompile. Exiting.
麻煩又來(lái)了,系統(tǒng)自帶的mkcramfs命令支持的文件數(shù)量是有限的。我們必須去
找mkcramfs的源代碼,更改下參數(shù),然后重新編譯一下。本資源貼提供了此源代碼的下載。
編譯后使用可執(zhí)行文件:/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卡的第二個(gè)分區(qū)。
dd if=moto.cramfs of=/dev/sdb2
這個(gè)過(guò)程比較慢,且不需要mount /dev/sdb2,只要fdisk -l能查看的/dev/sdb2的
信息即可。成功會(huì)顯示如下:
43144+0 records in
43144+0 records out
4.再點(diǎn)下菜單vm->Removeable Devices->USB Devices->Micro USB Device 把勾去掉
USB設(shè)備又回到了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系統(tǒng)自動(dòng)mount了我們第一個(gè)主分區(qū),第二個(gè)主分區(qū)需要我們手工
mount。
輸入以下命令:
# ls -l /dev/mmca1
brw-rw---- 1 root root 243, 1 Oct 2 07:09 /dev/mmca1
我們需要在E680上再建立個(gè)塊文件。只有/ezxlocal下才允許我們建立。
在/ezxlocal下創(chuàng)建block文件。因?yàn)閙mca1是243 1,所以我們使用如下參數(shù):
mknod /ezxlocal/mmca2 b 243 2
在/ezxlocal下創(chuàng)建目錄。如opie。 mkdir /ezxlocal/opie。這個(gè)目錄用于我們
掛載建立的block文件。輸入命令:
mount -t cramfs /ezxlocal/mmca2 /ezxlocal/opie
就會(huì)發(fā)現(xiàn)opie里的就是我們?cè)贚inux下那個(gè)/home/gcc/moto的文件內(nèi)容了。至此
我們就成功的把cramfs文件做為一個(gè)分區(qū)掛載到E680上。
5.運(yùn)行OPIE
export QTDIR=/ezxlocal/opie
export OPIEDIR=$QTDIR
export LD_LIBRARY_PATH=/lib:/usr/lib:$QTDIR/lib
./clock -qws
即可看到個(gè)全屏?xí)r鐘,./qpe -qws即可運(yùn)行OPIE操作系統(tǒng),不過(guò)這個(gè)依然會(huì)存在
與WindowsServer的觸摸屏沖突,解決方法同上。
★方法三★:通過(guò)loop,掛載moto.cramfs。下載本資源貼loop.o文件,將
moto.cramfs和loop.o復(fù)制到SD卡上,如/mmc/mmca1下。
# mkdir liwei
# insmod loop.o
# mount moto.cramfs liwei -t cramfs -o loop
/mmc/mmca1/liwei下就可以看到moto.cramfs里的內(nèi)容了,十分簡(jiǎn)單。再運(yùn)行OPIE
就跟方法二一樣了。
五、寫在最后
這三種方法都有個(gè)通病:不能解決OPIE與E680的觸摸屏,按鍵的沖突問(wèn)題。大家
可以去網(wǎng)上搜索相關(guān)完美解決方法。也有提供完美的OPIE安裝文件。我目前手機(jī)上
就是用的一位外國(guó)人編譯的,運(yùn)行時(shí)可以屏蔽按鍵,觸摸屏,可以自由與手機(jī)系統(tǒng)進(jìn)行
切換。
如果找到了解決方法,一定詳細(xì)公布與眾。
新聞熱點(diǎn)
疑難解答
圖片精選