Chinaunix首页 | 论坛 | 博客
  • 博客访问: 521800
  • 博文数量: 197
  • 博客积分: 2071
  • 博客等级: 上尉
  • 技术积分: 1307
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-02 09:49
个人简介

prothes 专注嵌入式的ARM linux

文章分类

全部博文(197)

文章存档

2014年(3)

2013年(16)

2012年(108)

2011年(70)

分类:

2012-03-22 15:01:57

目录
------------------------------------
0.交叉编译环境的搭建
1.环境变量设置
2.busybox 移植及根文件系统的构建
3.Xserver移植
4.matchbox移植
5.gtk移植
6.测试

0.交 叉编译环境的搭建
-------------------------------------
所需要的交叉编译工具 链:S3C6410X Tool Chain 4.2.2 - EABI V0.0 - cross-4.2.2-eabi.tar
0.1.解压 上述工具链获得文件夹:4.2.2-eabi/
0.2.在/usr/local/下面创建目录arm/ (注意,最好是放到这个目录,不然在以后的编译过程中可能出现一些错误)
0.3.将目录4.2.2-eabi/移动到/usr/local /arm/下面
0.4.设置环境变量:
    编辑/etc/profile文件,在文件末尾添加:
        PATH="$PATH:/usr/local/arm/4.2.2-eabi/usr/bin"
        export PATH
    使环境变量生效:
        在终端输入命令: source /etc/profile

    测试环境变量是否设置成功:
        在终端输入:echo $PATH,如果输出的路径中包含了/usr/local/arm/4.2.2-eabi/usr/bin则说明环境变量设置成功
0.5.测试交 叉编译工具链
    在终端输入:arm-linux-gcc -v

    显示如下:
    Using built-in specs.
    Target: arm-unknown-linux-gnueabi
    Configured with: /home/scsuh/workplace/coffee/buildroot-20071011/toolchain_build_arm/gcc-4.2.2/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-unknown-linux-gnueabi --enable-languages=c,c++ --with-sysroot=/usr/local/arm/4.2.2-eabi/ --with-build-time-tools=/usr/local/arm/4.2.2-eabi//usr/arm-unknown-linux-gnueabi/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --enable-shared --with-gmp=/usr/local/arm/4.2.2-eabi//gmp --with-mpfr=/usr/local/arm/4.2.2-eabi//mpfr --disable-nls --enable-threads --disable-multilib --disable-largefile --with-arch=armv4t --with-float=soft --enable-cxx-flags=-msoft-float
    Thread model: posix
    gcc version 4.2.2

    说明交叉编译工具链已经安装成功。
0.6需要修正的库的位置(将libc从2.6替换成2.7版的)
从 下载    libc6-dbg_2.7-10ubuntu3-mojo1_arm.deb并解压拷贝对应的文件覆盖到工具链的对应位置
sudo cp -rfv /home/hanjinlai/Download/mojoarmchain/libc6-dbg_2.7-10ubuntu3-mojo1_arm/usr/lib/debug/usr/lib/gconv/*   /usr/local/arm/4.2.2-eabi/usr/lib/gconv
/
sudo cp -rfv /home/hanjinlai/Download/mojoarmchain/libc6-dbg_2.7-10ubuntu3-mojo1_arm/usr/lib/debug/  /usr/local/arm/4.2.2-eabi/lib/


1.环境变量设置
-------------------------------------
export PREFIX=/home/hanjinlai/Work/X/target/usr
export CC=arm-linux-gcc
export PKG_CONFIG_PATH=/home/hanjinlai/Work/X/target/usr/lib/pkgconfig
export LD_LIBRARY_PATH=/home/hanjinlai/Work/X/target/usr/lib

2.busybox移 植
-------------------------------------
2.1.创建根文件系统目录rootfs及其子目录 bin,sbin,boot,root,sys,srv,proc,usr等

2.2.编译busybox1.7.0:(所需要的源码 包:busybox-1.7.0.tar.bz2)
    2.2.1解压源码包,进入源码目录;
    2.2.2配置busybox:在源码目录执行make menuconfig, 如果使用默认配置则直接退出、保存,如果需要配置自己的则更改相应的选项再保存退出。
              选上以下选项可以支持Tab补全功能
         Busybox Settings--->
                       Busybox Library Tuning--->
                                    [ ] Tab competion
    已经支持了mount nfs功能

    2.2.3修改源码目录的Makefile:
    将175行:  ARCH                     ?= $(SUBARCH)     修改为:  ARCH             ?= arm
    将176行: CROSS_COMPILE   ?=                             修改为: CROSS_COMPILE   ?=  arm-linux-
        2.2.4正式编译busybox:在源码目录执行make编译
    2.2.5安装busybox: 执行命令 make CONFIG_PREFIX=/***/rootfs(根文件系统目录) install

2.3.拷贝glibc库相关文件到根文件系统
    glibc相关库文件在交叉编译工具链中已经有了,可以直接拷贝过来用
    $ sudo cp /usr/local/arm/4.2.2-eabi/lib/*.so*  /***/rootfs/lib/   -d
    $ sudo cp /usr/local/arm/4.2.2-eabi/usr/arm-unknown-linux-gnueabi/lib/*.so*  /***/rootfs/lib/  -d

2.4.创建配置文件:
    2.4.1创建/etc/inittab, 内容如下:
                            # /etc/inittab
                            ::sysinit:/etc/init.d/rcS
                            ::askfirst:-/bin/sh
                            ::ctrlaltdel:/sbin/reboot
                            ::shutdown:/bin/umount -a -r
    2.4.2创建/etc/init.d/rcS,内容如下:(创建完成后改变其属性使它可以执行sudo chmod  +x  /etc/init.d/rcS)

        #!/bin/sh(这段脚本主要用来自动生成设备文件)

        #ifconfig eth0 192.168.1.17
        mount -a
        mkdir /dev/pts
        mount -t devpts devpts /dev/pts
        echo /sbin/mdev > /proc/sys/kernel/hotplug
        mdev -s

    2.4.3创建/etc/fstab文件,内容如下:

        # device     mount-point    type   options         dump  fsck order
        proc           /proc                  proc   defaults        0         0
        tmpfs          /tmp                  tmpfs  defaults       0         0
        sysfs          /sys                    sysfs  defaults        0         0
        tmpfs          /dev                   tmpfs  defaults       0         0

2.5.创建设备文件
                   在根文件系统的/dev目录下执行
                    $sudo mknod  console  c  5  1
                    $sudo mknod  null          c  1  3
                  这样我们的最基本的根文件系统就做好了。

2.6.测试已经制作好的根文件系统

    在 PC上安装mkcramfs包,以便可以制作cramfs格式的文件
    制作出根文件系统: $mkcramfs    /***/rootfs/       rootfs.cramfs
               烧录uboot,kernel,rootfs到开发板并重启开发板(如何烧录这些内容请参考第三节:内核及文件系统镜像的烧写)
              系统正常启动,并进入shell,测试成功。

2.7.测试基本的C程序在根文件系统的运行

                 在PC上写一个最简单的hello.c程序:

                            #include
                            int main()
                            {
                                    printf("hello!\n");
                                    return 0;
                               }
                   编译程序:$arm-linux-gcc -o hello hello.c
                  将编译出来的hello复制到根文件系统的/bin或/sbin或/usr/bin或/usr/sbin等任一目录
                  重新制作根文件系统镜像rootfs.cramfs
                  重新烧写根文件系统镜像到开发板
                  重启动开发板,进入shell,执行hello程序,显示hello!
                  测试成功。


3.Xserver 移植
---------------------------------------

3.1移植ncurses-5.6
    $tar xzf ncurses.tar.gz
     $cd ncurses-5.6
    $./configure --host=arm-linux --with-shared --prefix=$PREFIX
    $make
    $make install

3.2移植libtool    
    $tar xzf libtool_1.5.6.orig.tar.gz
     $cd libtool_1.5.6
    $./configure --host=arm-linux --prefix=$PREFIX
    $make
    $make install

3.3 移植zlib
    $tar xzf zlib-1.2.3.tar.gz
     $cd zlib-1.2.3
    $./configure --shared --prefix=$PREFIX
    $make
    $make install

3.4移植libpng
    $tar xjf libpng-1.2.23.tar.bz2
     $cd libpng-1.2.23
    $ ./configure --host=arm-linux --prefix=$PREFIX
    $make
    $make install
    
3.5移植expat
    $tar xzf expat-2.0.1.tar.gz
     $cd expat-2.0.1
    $./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX
    $make
    $make install

3.6移植freetype
    $tar xzf freetype-2.3.9.tar.gz
     $cd freetype-2.3.9
    $ ./configure --host=arm-linux --build=i386-linux --target=arm-linux --prefix=$PREFIX
    $make
    $make install

3.7移植libxml2.0
    $tar xzf libxml2-2.6.30.tar.gz
     $cd libxml2-2.6.30
    $ ./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX
    $make
    $make install
   
3.8移植fontconfig-2.6.0
    $tar xzf fontconfig-2.6.0.tar.gz
     $cd fontconfig-2.6.0
    $ ./configure --host=arm-linux --build=i386-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --with-freetype-config=$PREFIX/bin/freetype-config --disable-static --with-confdir=$PREFIX/etc/fonts --enable-libxml2 --with-arch=arm
    $make
    $make install

3.9移植libdrm
    $tar xjf libdrm-2.3.0.tar.bz2
     $cd libdrm-2.3.0
    $ ./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX
    $make
    $make install

3.10移植openssl
    $tar xjf openssl-0.9.8g.tar.gz
     $cd openssl-0.9.8g
    $./config --prefix=$PREFIX shared zlib-dynamic enable-camellia
    $make depend
    $make install

3.11移植Xserver(《参考于嵌入式linux应用开发完全手册》一书)
    X源码包:Xorg_git_20071119.tar.bz2,解压后进入源码目录
    使用util/modules/build.sh来对源码进行编译
    编译前的修改:
        修改X server的配置参数,生成Xfbdev:
        在    if test "$1" = "xserver" && test -n "$MESAPATH"; then
            MOD_SPECIFIC="--with-mesa-source=${MESAPATH}"
                fi
        后面添加
            if test "$1" = "xserver"; then
                MOD_SPECIFIC="${MOD_SPECIFIC} --enable-kdrive --enable-xfbdev
                    --disable-ipv6 \
                    --disable-xorg \
                    --disable-xnest \
                    --disable-xvfb \
                    --disable-xevie \
                    --disable-xwin \
                    --disable-xsdl \
                    --disable-xephyr \
                    --disable-xfake \
                    --disable-kdrive-vesa \
                --disable-dri"
                 fi
        注释掉一些不需要的软件:
        如:#build_doc,#build_mesa,#build_driver,#build_data,#build_util,
        #build app xdriinfo, #build app xprop, #build app xsm等
                   
        修改出错的地方:
        xserver/hw/kdrive/src/kaa.c:
        pPixman=fbCreatePixmapBpp(pScreen,w,h,depth,bpp);改为:
        pPixman=fbCreatePixmapBpp(pScreen,w,h,depth,bpp,usage_hint);

        xserver/hw/xfree86/modes/xf86Crtc.c:       
        在#include "xf86.h前一行添加" #include "xf86Priv.h"
       
        xserver/hw/xfree86/os-support/xf86_OSlib.h:
        删除#include
        添加#include

        添加屏幕分辨率的支持:xserver/hw/kdrive/src/kmode.c:
        在const KdMonitorTiming  kdMonitorTimings[]数组中添加需要的分辨率

            /* 800x480 modes */
            {    800,    480,    85,    56250,                /* VESA */
                    32,        152,    248,    KdSyncPositive, /* 53.674 */
                    1,        27,        31,        KdSyncPositive, /* 85.061 */
            },
            {    800,    480,    75,    49500,                /* VESA */
                    16,        160,    256,    KdSyncPositive, /* 46.875 */
                    1,        21,        25,        KdSyncPositive, /* 75.000 */
            },
            /* DEFAULT */
        #define MONITOR_TIMING_DEFAULT    9
            {    800,    480,    72,    50000,                /* VESA */
                    56,        64,        240,    KdSyncPositive, /* 48.077 */
                    37,        23,        66,        KdSyncPositive, /* 72.188 */
            },
            {    800,    480,    60,    40000,                /* VESA */
                    40,        88,        256,    KdSyncPositive, /* 37.879 */
                    1,        23,        28,        KdSyncPositive, /* 60.317 */
            },
            {    800,    480,    56,    36000,                /* VESA */
                    24,        128,    224,    KdSyncPositive, /* 35.156 */
                    1,        22,        25,        KdSyncPositive, /* 56.250 */
            }

    编译程序: $ ./util/modular/build.sh -b $PREFIX
    在编译libX11时要用到makekeys这个执行文件,但是这时是编译的arm文件,执行时报错,手动编译一个PC上能用的版本覆盖原来的文件gcc -o makekeys makekeys.c


4.mathcbox移植
--------------------------------------------------
4.1 移植jpeg
 
    ./configure --build=i386-linux --host=arm-linux --target=arm-linux --enable-shared --enable-static --prefix=$PREFIX

4.2 移植matchbox-window-manager-1.2和libmatchbox-1.9


5.gtk移植
---------------------------------------------------


5.1 移植glib
   
   [root@linux glib-2.8.0]# echo ac_cv_type_long_long=yes>$ARCH-linux.cache
  [root@linux glib-2.8.0]# echo glib_cv_stack_grows=no>>$ARCH-linux.cache
   [root@linux glib-2.8.0]# echo glib_cv_uscore=no>>$ARCH-linux.cache
   [root@linux glib-2.8.0]# echo ac_cv_func_posix_getpwuid_r=yes>>$ARCH-linux.cache
   [root@linux glib-2.8.0]# LIBS=`pkg-config --libs gthread-2.0` ./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --cache-file=arm-linux.cache

5.2 移植cairo

   $tar xjf cairo-1.8.0.tar.bz2
   $cd cairo-1.8.0
   $ ./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --enable-pdf=yes --enable-xlib=yes --enable-xlib-xrender=yes --enable-ps=yes --enable-freetype --enable-png
   $make
   $make install

5.3 移植pango

   $tar xjf pango-1.16.4.tar.bz2
   $cd pango-1.16.4
   $./configure --host=arm-linux --build=i386-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" CAIRO_CFLAGS="-I$PREFIX/include" CAIRO_LIBS="-L$PREFIX/lib" --prefix=$PREFIX
   $make
   $make install

5.4移植atk

   $tar xjf atk-1.9.1.tar.bz2
   $cd atk-1.9.1   
   $./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX
   $make
   $make install

5.5移植TIFF

   $tar xjf tiff-3.7.4.tar.bz2
   $cd tiff-3.7.4
   $./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX
   $make
   $make install

5.6移植gtk

   $tar xjf gtk-2.12.9.tar.bz2
   $cd gtk-2.12.9
   $ac_cv_func_XOpenDisplay=yes
   $ac_cv_func_XextFindDisplay=yes
   $ac_cv_func_XRenderQueryExtension=yes
   $./configure --prefix=$PREFIX --host=arm-linux --build=i386-linux --enable-shared=yes --enable-static=yes --without-libtiff --disable-xkb --disable-glibtest --with-gdktarget=x11 --with-xinput=yes --enable-display-migration --without-libjpeg
     修改config.h:
    #define HAVE_XCONVERTCASE 1
    /* #undef HAVE_XCONVERTCASE */

    #define HAVE_SHAPE_EXT 1
    /* #undef HAVE_SHAPE_EXT */    

    $make
    $make install

6. 测试
-----------------------------------------------------

将编译安装 后的结果拷贝到已经做好的基本的文件系统里面

在/etc/init.d/rcS中增加:
    #start Xserver
    Xfbdev -mouse mouse -keybd keyboard >/dev/null 2>&1 &

    #start matchbox-window-manager
    export HOME=/home
    export DISPLAY=:0.0
    sleep 1
    matchbox-window-manager &

启 动系统可看到屏幕上X窗口和matchbox的指针

在超级终端里运行gtk-demo

显示出gtk-demo程序界面, 移植成功。

注:测试前
确认 /usr/lib/xserver/SecurityPolicy 文件存在
确认 /usr/etc/gtk-2.0/gdk-pixbuf.loaders 文件存在
    {/usr/bin/gdk-pixbuf-query-loaders > gdk-pixbuf.loaders 来生成}
确认 /usr/etc/pango/pango.modules 文件存在
    {/usr/bin/pango-querymodules > pango.modules 来生成。
    此文件会把pango+modules的相关资料调入/usr/lib/pango/1.16.4/modules中}



###################################################################

arm + X11 + gtk + scim + matchbox 启动

确认字体为PC上的字体,否则可能造成GTK在显示时字体大小不一的情况。

系统第一次引导需要作如下设置
  • fc-cache -f -v 把字体的cache载入内存。 fc-list 确定字体是否有成功载入。 cache的存放位置为 /var/cache/fontconfig
  • 确认 /lib/xserver/SecurityPolicy 文件存在
  • 确 认 /etc/gtk-2.0/gdk-pixbuf.loaders 文件存在 {/bin/gdk-pixbuf-query-loaders > gdk-pixbuf.loaders 来生成}
  • 确认 /etc/pango/pango.modules 文件存在 {/bin/pango-querymodules > pango.modules 来生成。 此文件会把pango+modules的相关资料调入/lib/pango/1.6.0/modules中}
  • 确认gtk-query- immodules-2.0 > /etc/gtk-2.0/gtk.immodules, gtk.immodules文件中可能有多个输入模块,如果确认只用 scim-bridge 的话,那就删除其他的设备吧。
设置环 境变量
  • export XDG_CONFIG_DIRS=/share:/usr/share:/xroot/share
    export XDG_DATA_DIRS=/share:/usr/share:/xroot/share
    export LC_ALL=C
    export DISPLAY=:0.0
    export LD_LIBRARY_PATH=/lib

    export TSLIB_TSDEVICE=/dev/event0
    export TSLIB_CALIBFILE=/etc/pointercal
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/lib/ts
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0

    export XIM=SCIM
    export XIM_PROGRAM=SCIM
    export LANG="zh_CN"
    export XMODIFIERS="@im=SCIM"
    export GTK_IM_MODULE="scim-bridge"
启 动进程:
  • Xfbdev &
  • scim -d &
  • matchbox-desktop &
  • matchbox-window-manager &
  • scim-bridge &
  • 应 用程序 ...
配置信息:
  • Xfbdev -screen 宽x高@旋转角度 -mouse dev 等等 xfbdev -h
  • scim 可以设置启用何种输入法,前后台服务协议 scim -h
  • matchbox-desktop 可以设定背景色等。bg
  • matchbox-window-manager 可以设定采用何种主题。 /share/themes


阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~