製作含qtopia的rootfs

開發環境:

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 " u9211048@ccms.nkfust.edu.tw"

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設計實務

原文地址:https://www.cnblogs.com/shenhaocn/p/1980284.html