zoukankan      html  css  js  c++  java
  • 製作含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設計實務

  • 相关阅读:
    【转载】这才是真正的表扩展方案
    【转载】啥,又要为表增加一列属性?
    【转载】这才是真正的分布式锁
    mysql备份表sql
    selenium定位当前处于那个iframe(frame)中
    MQ手动推送消息
    报表导出时间格式数据多‘0‘
    python里的原始字符串
    qq邮箱设置授权码方法(jenkins)
    Apache与Tomcat有什么关系和区别(转)
  • 原文地址:https://www.cnblogs.com/shenhaocn/p/1980284.html
Copyright © 2011-2022 走看看