開發環境:
OS:linux ubuntu 8.10
ARM檔案系統設置於:/home/flykof/_install
Qtopia安裝路徑:/opt/Qtopia
ARM板子:長高科技6410
使用軟體:
1.Cross-compiler:3.4.1 (/usr/local/arm/3.4.1/)
2.Qtopia: qtopia-opensource-4.3.3
3.Tslib:tslib1.3
4.Zlib:zlib-1.2.3
5.Zoneinfo
6.busybox1.14.3
7.
編譯流程1(先將Qtopia準備好):
1.編譯zlib
檔案壓縮是很常用的功能,Qtopia也會用到壓縮的函示庫,所以先將ARM toolchain加上zlib函示庫
#tar xvzf zlib-1.2.3.tar.gz
#cd zlib-1.2.3
#./configure --shared --prefix=/usr/local/arm/3.4.1/arm-linux
產生Makefile後,編輯Makefile,修改以下所列的變數設定,改成
CC=arm-linux-gcc
LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1
CPP=arm-linux-gcc -E
AR=arm-linux-ar rc
RANLIB=arm-linux-ranlib
存檔後離開
#make
#make install
完成ARM toolchain加上zlib的功能
2.編譯tslib
因為Qtopia會使用到tslib,所以先將tslib加入ARM Toolchain中,這樣才能編譯使用到tslib的程式碼
#tar jxf tslib-1.3.tar.bz2
#cd tslib-1.3
#./autogen.sh
#./configure --host=arm-linux --prefix=/usr/local/arm/3.4.1/arm-linux
產生Makefile後,修改檔案plugins/Makefile作以下設定值修改,找到以下這一行
LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)
改成
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`
#make
#make install
安裝完成後會將tslib安裝於ARM toolchain,這樣ARM toolchain就可以編譯使用到tslib的程式。之後Qtopia會設定使用tslib作為指標的驅動函示庫, ARM toolchain才能順利編譯與連結tslib的函示庫。
3.安裝Qtopia修改ARM Toolchain
首先ARM toolchain 3.4.1必須先作以下修改
#cp /usr/local/arm/3.4.1/
#vi arm-linux/include/linux/videodev2.h
在裡面加上一行
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
儲存後退出
#vi arm-linux/sys-include/linux/videodev2.h
在裡面加上一行
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
儲存後退出
4.編譯Qtopia
編譯與安裝Qtopia的步驟如下,首先必須先下載Qtopia的程式碼套件 qtopia-opensource-src-4.3.3.tar.gz
#tar xvzf qtopia-opensource-src-4.3.3.tar.gz
#mkdir build-qtopia (Qtopia要求編譯不可在Qtopia Source tree內,必須另建一個目錄作編譯)
開始建立Qtopia
#cd build-qtopia
#../qtopia-opensource-4.3.3/configure -release -prefix=/opt/Qtopia -image=/home/flykof/_install/opt/Qtopia/ -xplatform linux-arm-g++ -arch arm -no-qvfb -displaysize 480x270 -no-modem -extra-qtopiacore-config '-release -xplatform qws/linux-arm-g++ -embedded arm -qconfig qpe -qt-sql-sqlite -depths 8,16,32 -qt-kbd-tty -qt-kbd-usb -no-mouse-linuxtp -qt-mouse-tslib -qt-gfx-transformed'
#make
#make install
5. 複製函示庫檔
Qtopia執行時還需要用到許多Toolchain所提供的函示庫,所以我們也需將相關函示庫複製到ARM filesystem中,當Qtopia執行時才能動態連結這些函示庫。
請在/home/flykof/_install中創立lib的資料夾在複製檔案
#cd /usr/local/arm/3.4.1/arm-linux/lib (切換到toolchain的ARM函示庫目錄)
#cp -ax libdl* /home/flykof/_install/lib
#cp -ax libfreetype.so* /home/flykof/_install/lib
#cp -ax libpthread* /home/flykof/_install/lib
#cp -ax librt* /home/flykof/_install/lib
#cp -ax libstdc++.so* /home/flykof/_install/lib
#cp -ax libgcc_s.so* /home/flykof/_install/lib
#cp -ax libcrypt* /home/flykof/_install/lib
#cp -ax libz.so* /home/flykof/_install/lib
#rm -f /home/flykof/_install/lib/*a (刪除連結檔 ".a" 與 ".la",這些檔只有在連結時才會用到,執行時不用)
將下載的a href="zoneinfo.tar.gz">zoneinfo.tar.gz 解開成目錄zoneinfo (如果原目錄已經有zoneinfo請跳過這一步)
#mv zoneinfo /home/flykof/_install/usr/share (將全球時區資訊置於根目錄的 /usr/share 路徑下)
如果硬體允許,可以直接把cross-compiler的lib都copy至lib裡面。
6.安裝tslib
之前已將tslib加到ARM toolchain,現在我們必須將tslib複製到ARM filesystem中,Qtopia執行時需要用到tslib相關的函示庫
#cd /usr/local/arm/3.4.1/arm-linux/lib (切換到toolchain的ARM函示庫目錄)
#cp -ax libts* /home/flykof/_install/lib
#cp -ax libm.so* /home/flykof/_install/lib (複製數學函示庫,libts會用到)
#cp -ax libm-* /home/flykof/_install/lib
#rm -f /home/flykof/_install/lib/*a (刪除連結檔 ".a" 與 ".la",這些檔只有在連結時才會用到,執行時不用)
#cd /usr/local/arm/3.4.1/arm-linux/bin (切換到toolchain的ARM bin目錄)
#cp -ax ts_calibrate /home/flykof/_install/bin (複製ts校正程式到ARM filesystem)
#cd /usr/local/arm/3.4.1/arm-linux/share (切換到toolchain的ARM share目錄)
#cp -ax ts /home/flykof/_install/etc (將ts的 plugins檔案複製到ARM filesystem 的/etc目錄中)
#cd tslib-1.3 (切換到tslib的source tree)
#cp etc/ts.conf /home/flykof/_install/etc
#vi /home/flykof/_install/etc/ts.conf (編輯ts.conf)
將
#module mousebuts
的#去掉
module mousebuts
儲存後退出
如果早已經有rootfs的話,接下來請確認 Linux核心是否有驅動觸控螢幕,我的觸控裝置檔案在 /dev/ts,將ARM Linux啟動後在shell執行,"cat /dev/ts",然後觸碰觸控螢幕,看看是否有產生資料(會是一堆亂碼),有的話代表Linux核心有驅動觸控螢幕,這樣tslib才可以正確運作,否則請修改Linux核心設定,讓Linux核心正確驅動觸控螢幕。到此步驟,Qtopia執行的基本檔案就已經具備,可以執行Qtopia了,如果還沒有rootfs請往下。
編譯流程2(製作rootfs):
1. 交叉編譯busybox
#make ARCH=arm-linux CROSS_COMPLIE=arm-linux- menuconfig
指定下面選項:
1.選擇編譯成動態庫載入模式(Build shared libbusybox)
2.CROSS_COMPLIER prefix(arm-linux)
3.指定安裝目錄(./install)
#make
#make install
因為使用低版本的cross-compiler,所以在make的時候會產生出許許多多的問題,問題與解決方法如下:
Error 1:
miscutils/ionice.c:25: error: `SYS_ioprio_set' undeclared (first use in this function)
#define __NR_ioprio_set (__NR_SYSCALL_BASE+314) // 0x90013a
#define __NR_ioprio_get (__NR_SYSCALL_BASE+315) // 0x90013b
#define SYS_ioprio_get __NR_ioprio_get
#define SYS_ioprio_set __NR_ioprio_set
Error 2:
networking/interface.c:818: error: `ARPHRD_INFINIBAND' undeclared here (not in a function)
#define ARPHRD_INFINIBand 32
Error 3:
util-linux/acpid.c:145: error: `EV_SW' undeclared (first use in this function)
#define EV_SW 0x05
Error 4:
util-linux/acpid.c:146: error: `SW_LID' undeclared (first use in this function)
#define SW_LID 0x00
Error 5:
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:342: error: variable or field `__user' declared void
#define __user
2. 創建rootfs目錄
目錄位置:/home/flykof/_install
busybox 位置:/tools/busybox/busybox-1.14.3
2.2因為已經將qtopia make install了,所以在此目錄底下會有opt/Qtopia & lib等資料夾的存在了,請勿刪除。
#cd /home/flykof/_install
#mkdir bin dev etc lib proc sbin sys usr mnt tmp var
#cp –rfd /tools/busybox/busybox-1.14.3/_install/* ./ (注意參數為rfd,含意為保持原有的鍊結關係)
#cp –rfd /tools/busybox/busybox-1.14.3/examples/bootfloppy/etc/* ./etc/
#cd etc
#vim profile
2.3將profile的內容修改如下:
echo
echo -n "Processing /etc/profile... "
# no-op
echo "Set search library path"
LD_LIBRARY_PATH=/lib:/usr/lib
export LD_LIBRARY_PATH
echo "Set user path"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
echo "Set PS1"
export PS1="[$USER@dmatek]\\$ "
echo "Done"
echo
此地方將設定三個環境變數LD_LIBRARY_PATH、PATH、PS1(在終端機看到的前置符號)
2.4將inittab輸入以下內容:
#vim inittab
::sysinit:/etc/init.d/rc
::askfirst:-/bin/sh
::restart:/sbin/init
tty0::askfirst:-/bin/sh
::once:/usr/etc/rc.local
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
sysinit意味著開機之後先執行的檔案,可以將所有必要的設定與此檔做相關的處理
askfirst Start an “askfirst” shell on the console
tty0::askfirst 要有此行Ctrl+C才能使用
2.5將fstab輸入以下內容:
#vim fstab
none /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
none /opt/Qtopia/Applications/ ramfs defaults 0 0
最後一行是因為在執行Qtopia的時候出現Error:/opt/Qtopia/Applications/ can’t write,所以將此目錄設定為ramfs格式才能寫入,/tmp與/dev也都有設定為ramfs的必要,/dev在此rootfs是使用mdev的方式自我產生出來,因此寫需要能寫入,/tmp則是很多應用程式在執行的時候需要使用到!!
2.6將rcS輸入以下內容:
#vim init.d/rcS
#! /bin/sh
echo "Processing rc.S"
echo "Mount all"
/bin/mount -a
/bin/mknod /dev/console c 5 1
/bin/mknod /dev/null c 1 3
/bin/mknod /dev/ttySAC0 c 204 64
/bin/mknod /dev/ttySAC1 c 204 65
/bin/mknod /dev/ttySAC2 c 204 66
echo "Starting mdevd...."
/bin/echo /sbin/mdev > proc/sys/kernel/hotplug
mdev -s
ln -s /dev/ts0 /dev/ts
/etc/init.d/qtopia.sh
echo "*************************************"
echo " Create By KHK"
echo " [email protected]"
echo "*************************************"
這是開機後執行的第一個檔案,一開使先將所有的東西mount好,在建立一些有可能用到的nod(可不做),再來使用mdev創立裝置,最後將ts0指向裝置ts,因為真正的裝置是ts,最後在執行qtopia.sh來執行GUI介面。
2.7再來將完成另一個qtopia.sh,用來設定qtopia的環境變數與執行:
#vim init.d/qtopia.sh
將qtopia.sh輸入以下內容:
#!/bin/sh
export QTOPIA=/opt/Qtopia
export HOME=$QTOPIA
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTOPIA/lib
export TSLIB_TSEVENTTYPE=H3600
export TSLIB_TSDEVICE=/dev/ts
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_PLUGINDIR=/etc/ts/plugins
export QWS_SIZE=480*270
export QWS_MOUSE_PROTO="Tslib:$TSLIB_TSDEVICE"
export QWS_KEYBOARD="TTY USB"
export POINTERCAL_FILE=/etc/pointercal
export PATH=$PATH:$QTOPIA/bin
if [ -f "$TSLIB_CALIBFILE" ]; then
qpe &
else
ts_calibrate
qpe &
fi
2.8此時檔案系統已經完成了,但是如果dev目錄底下沒有console&null裝置的話,會導致亦開始就無法mount,所以需要手動建立裝置,建立裝置記得要在root權限才可以
#cd ../dev
#mknod –m 600 console c 5 1
#mknod –m 666 null c 1 3
此時應該可以正常開機進rootfs,但如果沒有把lib全部複製的話,可能會有少lib的困擾,在自行複製即可。
2.9另外可以將本機端的passwd & shadow & group複製到rootfs的etc目錄下(要root權限)
#cd ../etc
cp /etc passwd shadow group ./
2.10最後將mkcramfs的程式複製到與_install同一層之中,然後執行:
mkcramfs _install/ root_tmp.cramfs
把檔案燒寫入板子端即可看到畫面,但還存在一些問題尚待解決。
參考資料:
http://flykof.pixnet.net/blog/post/23068651
http://www.zychip.com/html/support/qtopia_install/index.php
http://www.jollen.org/blog/2007/01/arm9_bootstrap_root_filesystem.html
http://blog.chinaunix.net/u/16231/showart_2024339.html
長高贈書:ARM9 S3C2440 與嵌入式Linux 2.6.24設計實務